在使用Ajax采集数据时,有些Ajax接口含有很多的加密参数,直接很难发现规律。此时,就可以使用模拟浏览器运行的方式来采集。Python 提供了许多模拟浏览器运行的库,如Selenium、Splash、PyV8、Ghost等。
一、模拟浏览器爬取数据Selenium的使用。
1.1、安装准备工作
安装selenium库:pip install selenium
(1)、谷歌(Chrome)浏览器需要ChromeDriver 驱动的安装与配置
- 查看浏览器版本号:点击Chrome右上角的菜单->帮助->关于Google Chrome即可查看,我这里的版本版本 79.0.3945.130
- ChromeDriver下载:https://chromedriver.storage.googleapis.com/index.html
- 下载对应版本及对应系统:chromedriver_win32.zip
- 环境变量配置:这里是windows系统我们直接解压后将chromedriver.exe文件拖到Python(anaconda)的Scripts目录下。
- cmd窗口测试:cmd-->chromedriver,输出Starting ChromeDriver ...on port ...,则安装配置成功。
- 代码测试: 执行下列代码,会弹出一个空白的Chrome浏览器
- from selenium import webdriver
browser=webdriver.Chrome()
(2)、火狐(Firefor)浏览器需要GeckoDriver的安装与配置
- 下载地址:https://github.com/mozilla/geckodriver/releases
- 下载对应版本:如:geckodriver-v0.26.0-win64.zip
- 环境配置:windows系统直接解压拖到Python(anaconda)的Scripts目录下。
- cmd窗口测试:cmd-->geckodriver,输出...geckodriver...,则安装配置成功。
- 代码测试: 执行下列代码,会弹出一个空白的Firefor浏览器
- from selenium import webdriver
browser=webdriver.Firefox()
1.2、声明浏览器对象
- from selenium import webdriver #导入库
- browser =webdriver. Chrome() #谷歌浏览器的声明及初始化
- browser =webdriver. Firefox() #火狐浏览器的声明及初始化
- browser =webdriver. Edge() #Edge浏览器的声明及初始化
- browser =webdriver. PhantomJS() #无界面浏览器PhantomJS的声明及初始化
- browser =webdriver. Safari() #Safari浏览器的声明及初始化
- ......
完成浏览器对象的初始化并将其赋值为browser对象。调用browser对象,让其执行各个动作以模拟浏览器操作。
1.3、访问页面,get()方法
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.taobao.com/') #访问网页
url= browser.current_url
print(url) #获取url
cookies = browser.get_cookies()
print(type(cookies),cookies) #获取cookies,格式:<class 'list'>
SC = browser.page_source
print(type(SC),SC) #获取源代码,格式:<class 'str'>
1.4、查找节点
单个节点:
获取单个节点:方法 | 说明:返回WebElement类型 | 示例: |
---|---|---|
get() | 请求访问页面 | from selenium import webdriver browser=webdriver.Chrome() browser.get('https://www.taobao.com/') |
find_element_by_id | 根据id属性的值获取节点 | input_01=browser.find_element_by_id('q') #定位到淘宝的搜索框 |
find_element_by_name | 根据name属性值获取节点 | input_02=browser.find_element_by_name('q') |
find_element_by_class_name | 根据class属性值获取节点 | input_03=browser.find_element_by_class_name('search-combobox-input-wrap') |
find_element_by_xpath | 根据Xpath选择器定位 | input_04=browser.find_element_by_xpath('//*[@id="q"]') |
find_element_by_css_selector |