您的位置:首页 > 编程语言 > Python开发

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注意:有可能会因为百度文库的广告导致将继续阅读按钮遮住,致使点击的时候,点击不到继续阅读按钮,所以,你需要找到广告的位置(需要先判断广告是否存在,再做处理,否则可能会报错),然后,使用让隐藏按钮可以点击的方法处理广告即可。
#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)
输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: