python爬虫系列之爬取百度文库(四)

前三篇博客已经介绍了,如何利用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)


输出结果:


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值