python爬虫系列之爬取百度文库(三) 您所在的位置:网站首页 Python爬取百度文库VIP代码 python爬虫系列之爬取百度文库(三)

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

2024-06-02 06:09| 来源: 网络整理| 查看: 265

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

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() 效果如下,全自动的:

可能在运行上面的代码时候,如果报错(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我粗略的介绍一下,用一个图表示(图画的丑了点,不要见谅)

二、分析下一个页面的结构,获取所有的文件链接和文件名称,便于下一章的继续进行,可以观察到这个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")

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

通过用上面的方法我们可以找到下一页的标签,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导致你操作标签的时候就会报错,解决办法,请看后面的章节。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有