python爬虫系列之爬取百度文库(四)
2017-09-09 15:07
519 查看
前三篇博客已经介绍了,如何利用selenium去爬取一个指定内容的百度文库的文章链接和文章的名称,接下这篇博客主要介绍的是,针对于一篇文章我们应该如何去爬取所有的内容
1、分析文章的页面结构,文章地址https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search
通过上图我们可以观察到,打开文章链接之后,可能有的文章显示不全需要点击“继续阅读”按钮之后,才能看到所有的内容。
if __name__ == "__main__":
browser = webdriver.Chrome()
browser.get("https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search")
#获取点击继续阅读按钮
goBtn = browser.find_element_by_class_name("goBtn")
goBtn.click()运行之后,你会发现,在pycharm的控制台报错,selenium.common.exceptions.WebDriverException: Message: unknown error: Element <span class="moreBtn goBtn">...</span> is not clickable at point (449, 565). Other element would receive
the click: <div class="content" id="reader-evaluate-content-wrap" data-id="1d03027280eb6294dd886cb7" data-value="-1" data-doc-value="0">...</div>,这个错误的意思是不能去点击这个标签,它可以去点击这个div。为什么会这样呢?细心的朋友可能会看见上图的右下角有一个箭头,仔细看有一句style属性是,overflow:hidden这句话的意思是隐藏这个标签,所以才导致这个错误的发生。selenium的python
api链接http://selenium-python.readthedocs.io/api.html,解决办法如下,
if __name__ == "__main__":
browser = webdriver.Chrome()
browser.get("https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search")
#找到继续阅读按钮的上一级div,banner-more-btn是div的类名用.,ID用#
hidden_div = browser.find_element_by_css_selector("#html-reader-go-more")
#获取阅读按钮
gotBtn = browser.find_element_by_css_selector("#html-reader-go-more .banner-more-btn")
actions = webdriver.ActionChains(browser)
actions.move_to_element(hidden_div)
actions.click(gotBtn)
actions.perform()在点击继续阅读按钮之前,最好先判断这个按钮是否存在,如果只有1页的时候,是不会有这个按钮的,判断方法,可以用之前的方法进行判断。获取文章的所有内容
time.sleep(3)
#获取包含内容的div
div_text = browser.find_elements_by_class_name("ie-fix")
for temp in div_text:
text = temp.text
print text注意:有可能会因为百度文库的广告导致将继续阅读按钮遮住,致使点击的时候,点击不到继续阅读按钮,所以,你需要找到广告的位置(需要先判断广告是否存在,再做处理,否则可能会报错),然后,使用让隐藏按钮可以点击的方法处理广告即可。
1、分析文章的页面结构,文章地址https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search
通过上图我们可以观察到,打开文章链接之后,可能有的文章显示不全需要点击“继续阅读”按钮之后,才能看到所有的内容。
if __name__ == "__main__":
browser = webdriver.Chrome()
browser.get("https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search")
#获取点击继续阅读按钮
goBtn = browser.find_element_by_class_name("goBtn")
goBtn.click()运行之后,你会发现,在pycharm的控制台报错,selenium.common.exceptions.WebDriverException: Message: unknown error: Element <span class="moreBtn goBtn">...</span> is not clickable at point (449, 565). Other element would receive
the click: <div class="content" id="reader-evaluate-content-wrap" data-id="1d03027280eb6294dd886cb7" data-value="-1" data-doc-value="0">...</div>,这个错误的意思是不能去点击这个标签,它可以去点击这个div。为什么会这样呢?细心的朋友可能会看见上图的右下角有一个箭头,仔细看有一句style属性是,overflow:hidden这句话的意思是隐藏这个标签,所以才导致这个错误的发生。selenium的python
api链接http://selenium-python.readthedocs.io/api.html,解决办法如下,
if __name__ == "__main__":
browser = webdriver.Chrome()
browser.get("https://wenku.baidu.com/view/1d03027280eb6294dd886cb7.html?from=search")
#找到继续阅读按钮的上一级div,banner-more-btn是div的类名用.,ID用#
hidden_div = browser.find_element_by_css_selector("#html-reader-go-more")
#获取阅读按钮
gotBtn = browser.find_element_by_css_selector("#html-reader-go-more .banner-more-btn")
actions = webdriver.ActionChains(browser)
actions.move_to_element(hidden_div)
actions.click(gotBtn)
actions.perform()在点击继续阅读按钮之前,最好先判断这个按钮是否存在,如果只有1页的时候,是不会有这个按钮的,判断方法,可以用之前的方法进行判断。获取文章的所有内容
time.sleep(3)
#获取包含内容的div
div_text = browser.find_elements_by_class_name("ie-fix")
for temp in div_text:
text = temp.text
print text注意:有可能会因为百度文库的广告导致将继续阅读按钮遮住,致使点击的时候,点击不到继续阅读按钮,所以,你需要找到广告的位置(需要先判断广告是否存在,再做处理,否则可能会报错),然后,使用让隐藏按钮可以点击的方法处理广告即可。
#encoding:utf8 import sys reload(sys) sys.setdefaultencoding("utf8") from selenium import webdriver import time def gethrefAndFilename(browser): # 打开百度文库的首界面 browser.get("https://wenku.baidu.com/") # 通过ID找网页的标签,找到搜索框的标签 seek_input = browser.find_element_by_id("kw") # 设置搜索的内容 contents = "饮料" contents = str(contents).decode("utf8") seek_input.send_keys(contents) # 找到搜索文档按钮 seek_but = browser.find_element_by_id("sb") # 并点击搜索文档按钮 seek_but.click() # 文件标签集合 list_href = [] # 文件名称集合 list_filename = [] while True: # 获取所有的文档a标签,这里的elements指的是有多个元素,*表示的是任意的(在xpath中可以用) all_a = browser.find_elements_by_xpath("//*[@id=\"bd\"]/div/div/div[4]/div/dl[*]/dt/p[1]/a") for a in all_a: # print a.get_attribute("href") # print a.get_attribute("title") list_href.append(a.get_attribute("href")) list_filename.append(a.get_attribute("title")) # 获取body标签,的html body = browser.find_element_by_tag_name("body") body_html = body.get_attribute("innerHTML") # 判断下一页按钮是否存在 flag = str(body_html).find("class=\"next\"") if flag != -1: # 获取下一页按钮的标签,这里用的是class标签,因为它只有一个 next_page = browser.find_element_by_class_name("next") # 点击下一页 next_page.click() # 点击之后,睡眠5s,防止页面没有加载完全,报no such element的错误 time.sleep(5) break else: break return list_href,list_filename def getContentsByHref(href,browser): browser.get(href) body = browser.find_element_by_tag_name("body") flag = str(body).find("id=\"html-reader-go-more\"") if flag != -1: # 找到继续阅读按钮的上一级div,banner-more-btn是div的类名用.,ID用# hidden_div = browser.find_element_by_css_selector("#html-reader-go-more") # 获取阅读按钮 gotBtn = browser.find_element_by_css_selector("#html-reader-go-more .banner-more-btn") actions = webdriver.ActionChains(browser) actions.move_to_element(hidden_div) actions.click(gotBtn) actions.perform() time.sleep(3) # 获取包含内容的div div_text = browser.find_elements_by_class_name("ie-fix") for temp in div_text: text = temp.text print text if __name__ == "__main__": browser = webdriver.Chrome() list_href, list_filename = gethrefAndFilename(browser) for href in list_href: getContentsByHref(href,browser)输出结果:
相关文章推荐
- python爬虫系列之爬取百度文库(三)
- python爬虫系列之爬取百度文库(二)
- Python爬虫UrlError和HttpError系列之五
- Python爬虫正则表达式和re模块系列之七
- Python爬虫BeautifulSoup4系列之十
- Python爬虫系列(四):Beautiful Soup解析HTML之把HTML转成Python对象
- python爬虫系列(二):标准库的使用(A)
- python:爬虫系列-02
- Python爬虫系列教程
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
- python爬虫系列Selenium定向爬取虎扑篮球图片详解
- Python爬虫系列之四:利用Python爬取PyODPS页面并整合成PDF文档
- Python爬虫系列(六):搜索文档树
- python爬虫学习系列教程
- Python 爬虫系列教程
- $python爬虫系列(1)——一个简单的爬虫实例
- python爬虫系列文章
- Python爬虫入门实战系列(一)--爬取网络小说并存放至txt文件
- [CentOS Python系列] 一.阿里云服务器安装部署及第一个Python爬虫代码实现
- Python爬虫系列博客