一、先用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导致你操作标签的时候就会报错,解决办法,请看后面的章节。