一、先用Google浏览器打开百度文库,鼠标右键--->检查,下面是打开百度文库的首页,用我上一章的方法,查看搜索框和搜索按钮的标签,可以看到搜索框的标签ID是kw(红色箭头),搜索按钮的标签ID是sb(黄色箭头),将搜索框的内容设置为“饮料”之后,点击搜索按钮

python爬取付费文档源代码 python 爬取百度文库_a标签


from selenium import webdriver

if __name__ == "__main__":
    browser = webdriver.Chrome()
    #打开百度文库的首界面
    browser.get("https://wenku.baidu.com/")
    #通过ID找网页的标签,找到搜索框的标签
    seek_input =  browser.find_element_by_id("kw")
    #设置搜索的内容
    seek_input.send_keys("饮料")
    #找到搜索文档按钮
    seek_but = browser.find_element_by_id("sb")
    #并点击搜索文档按钮
    seek_but.click()


效果如下,全自动的:

python爬取付费文档源代码 python 爬取百度文库_搜索_02

可能在运行上面的代码时候,如果报错(python2),UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: unexpected end of data,在python2中这种错误很常见,是因为编码问题导致的,改成下面这样就可以了


contents = "饮料"
contents = str(contents).decode("utf8")
seek_input.send_keys(contents)


对于python2中的decode和encode我粗略的介绍一下,用一个图表示(图画的丑了点,不要见谅)

python爬取付费文档源代码 python 爬取百度文库_百度文库_03


二、分析下一个页面的结构,获取所有的文件链接和文件名称,便于下一章的继续进行,可以观察到这个a标签,a标签的href属性其实就是文档的链接,title属性内容就是文档的名称


#获取所有的文档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")

python爬取付费文档源代码 python 爬取百度文库_a标签_04

三、点击下一页获取所有相关的文件名和文件链接

通过用上面的方法我们可以找到下一页的标签,class="next",这里可以直接使用class来定位下一页按钮,可以使用class的原因,因为整个HTML只有一个class为“next”的标签,我们点击之后就可以调到下一个页面。但是,还有一个问题需要考虑,那就是当下一页按钮没有的时候,我们就不能去点击按钮了,不然会报no such element这样的错误,这个在selenium中,应该说经常发生的,所以我们就需要去判断这个按钮是不是在这个页面存在?判断的方法有两种(据我所知),第一种就是通过try,except,第二种就是先获取整个html的body标签的innerHTML,然后在这里面去寻找这个标签。


#encoding:utf8
import sys
reload(sys)
sys.setdefaultencoding("utf8")
from selenium import webdriver
import time

if __name__ == "__main__":
    browser = webdriver.Chrome()
    #打开百度文库的首界面
    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()
    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")
        # 获取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)
        else:
            break



四、总结

在使用selenium的过程中,可能经常会遇到no such element的错误,一般遇到这种错误的三种情况,第一种页面没有加载完全,然后你就去找这个标签导致报错,解决办法,time.sleep(*),第二种就是可能这个HTML中真的没有这个标签存在,这个就需要自己认真检查,第三种就是这个标签的style设置中将标签设置成了hidden导致你操作标签的时候就会报错,解决办法,请看后面的章节。