静态页面的爬取相对来说比较容易,通过请求获取到静态页面资源进行解析就可以拿到我们想要的,但很多网站通常会用到Ajax和动态HTML技术,因而只是使用基于静态页面爬取的方法是行不通的。
对于动态页面信息的爬取,一般分为两种方法:
1.一种是直接从异步请求中采集数据、需要自己去手动分析异步请求的规律,然后模拟出对应的请求进行采集
2.另一种是直接通过selenium+webdriver从浏览器中采集已经加载好的数据
因为有些网站是通过js代码动态生成的内容比如搜索引擎
所有异步请求中根本没有返回json等可以识别的数据包,很显然采用了动态HTML技术
我们只能通过selenium和webdriver来模拟浏览器行为来进行采集
准备工作
1.python环境3.x
2.安装selenium依赖
3.下载webdriver(本文以Chrome浏览器的driver为例)
以上环境安装不再赘述
模拟浏览器
我们来爬取百度搜索"hello"的查询结果
1.加载浏览器
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
2.打开百度首页
driver.get("http://www.baidu.com")
3.输入hello并点击提交
driver.find_element_by_id('kw').send_keys('hello')
driver.find_element_by_id('kw').submit()
4.根据xpath提取内容
shopName = driver.find_element_by_xpath(".//*[@id='"+str(i)+"']/h3/a").text
print( shopName)
完整代码
from selenium import webdriver
import time
# 将控制的webdriver的Firefox赋值给driver;获得了浏览器对象才可以启动浏览器,打开网址,操作页面
driver = webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
# 获得浏览器对象后,通过get()方法,可以向浏览器发送网址
driver.get("http://www.baidu.com")
#等待打开网页2S
time.sleep(2)
# 这里通过 id = kw 定位到搜索框,并通过键盘方法send_keys向输入框里输入'hello'并提交
driver.find_element_by_id('kw').send_keys('hello')
driver.find_element_by_id('kw').submit()
time.sleep(3)
# 循环采集内容
for i in range(1,12):
try:
shopName = driver.find_element_by_xpath(".//*[@id='"+str(i)+"']/h3/a").text
print( shopName)
except:
h=1
#采集完成关闭浏览器
driver.close()
最后
理论上来讲,这种方法可以应对各种动态加载,因为模拟人对浏览器行为,所以一些登录什么的都可以进行模拟,模拟的核心在于selenium
Selenium是一种自动化测试工具,Selenium 测试直接在浏览器中运行,就像真实用户所做的一样。Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Chrome和 Firefox 中运行。其他测试工具都不能覆盖如此多的平台。
上述方式有两个缺点:
1.每次执行都要打开桌面上的Chrome浏览器(自动化测试需要)
2.浏览器的各个操作步骤都需要sleep几秒进行等待,效率低
解决这两个问题的具体办法可以参考这篇爬取动态网页python+Web kit