Selenium自动化测试
因为爬取有些数据的时候需要的是搜索引擎搜索之后的结果,遇到这种情况的时候我们可以使用selenium自动化测试工具来模拟浏览器。
使用python3 下载链接:http://python.org
在pycharm中输入代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
运行后谷歌浏览器就会自行打开一个页面跳向百度首页。
但这过程之中可能会遇到报错:FileNotFoundError: [WinError 2] 系统找不到指定的文件。
出现这个的原因是因为没有chromedriver
详细说明https://blog.csdn.net/cckavin/article/details/79514790
下面操作都是用的谷歌浏览器Chrome
如果没有报错的话应该就可以打开页面,driver可以当成是位置在这个页面
页面元素定位的方法,8种:id,name,xpath,class,name,tag,name,link text,partial link text ,css selector
八种方式的语句很相似
Id :driver.find_element_by_id(“#id名称”)
Name:driver.find_element_by_name(“#name名称”) 返回单个元素
driver.find_elements_by_name(“#name名称”) 返回多个元素,形式是list
剩下的相似
我用的最多的是xpath
打开开发者工具后只要右击就可以复制xpath,比较方便
以百度为例
在搜索框输入:
input_content = driver.find_element_by_xpath('//*[@id="kw"]')
input_content.clear() #先清空内容
input_content.send_keys("常熟理工学院") #输入要搜索的内容
单击操作:
search_button = driver.find_element_by_xpath('//*[@id="su"]')
search_button.click()
点击第一个链接
select_link = driver.find_element_by_xpath('//*[@id="1"]/h3/a')
select_link.click()
可能会报错
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="1"]/h3/a"}
没有此元素,可是这个元素确实存在
有个可能就是页面还没加载出来,代码就运行了。因此,加一个等待就行
driver.implicitly_wait(“秒数”)最长等待的时间
点链接后有时会跳出一个页面,这时候driver的位置还是第一个,但是我们需要对第二个页面进行操作
all_handles = driver.window_handles #先获得所有的句柄
第一个页面的位置是0
切换句柄:
driver.switch_to.window(all_handles[1])
查看学校简介
school_general = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/ul/li[2]/a')
ActionChains(driver).move_to_element(school_general).perform()
#鼠标悬停,需要导入库from selenium.webdriver import ActionChains
select_link = driver.find_element_by_xpath('/html/body/div[1]/div/div[1]/ul/li[2]/div/div/ul/li[1]/a')
select_link.click()
就可以看到学校简介
有时候也不会跳出线面,所以不需要切换句柄
只需要前进和后退即可
driver.forward()
driver.back()
页面刷新
driver.refresh()
页面关闭
driver.close()
Ajax动态页面爬取
爬取专利检索及分析(http://www.pss-system.gov.cn/sipopublicsearch/portal/uiIndex.shtml)网站时,会发现,它的页面是以ajax动态加载的页面。
对于这类的页面需要自己去找寻他们的一些规律。
以专利检索及分析网站为例,在常规检索中输入苏州
此网站需要登录
注册登录完后,打开开发者工具后
按ctrl+R刷新,得到响应的内容
看Preview找到自己需要的数据的链接,点击
Request Headers的数据原样抄下来
请求头,用于伪装客户端浏览器,可由抓包获取
光看第一页可能看不出什么,点击下一页,和原来的步骤一样
会发现再原来的响应页面后又出现一个响应
第二个页面
第三个页面
这些就是请求时候需要的参数
如果发现不了规律就多点几个下一页,找到变化的规律
将这些参数也抄下来
这些参数有一些是固定的,比如说需要的苏州的数据,关于苏州的都是固定的
只有第三个是变动的,开始的位置
在查看Headers
查看General可以看见请求的url,并且以post的方式请求
这样我们就可以算是找到规律了
将data和header在请求时传入
就可以返回一个json类型的
将返回的text文件用在线的json查看工具查看一下
可以看出它的结构
通过分析可以得知,我们需要的所有数据都在searchResultRecord里面
在每一个fieldMap里面有很多的数据,但是我们需要每一个文件的详览,并不知道需要那些数据,那么我们就要先分析详览数据需要的参数
与前面的方法相同,我们查看header
发现需要的是这些
那我们就只需要在上一个请求的数据里面将这些需要的数据提取出来就可以了
多点开几个页面
对比一下数据,就可以知道需要的是
这两个,第二个与第三个数据相同,最后一个数据不变动
重复上述步骤,就可以获取自己想要的数据
但是在爬去的过程中要控制速度,否则会将ip封掉
分析数据时需要用的beautifulsoup来解析