模拟浏览器的行为,即只要用户从浏览器的界面能获取到信息,则可以通过本文的方式 爬取数据。
Selenium
pip 安装依赖
首先 Selenium 需要 driver 与浏览器进行交互,不同浏览器对应的 driver 在 参考链接 中有列出。对于 Chrome 来说 最新的版本(126) ChromeDriver 已与 Chrome 同版本发布,选择当前安装的对应 版本即可,Driver 需要放到 PAHT 路径中;然后执行 pip 安装命令即可
样例使用
样例代码可以参考First script
browser.implicitly_wait(20)
需要注意的点,如果不设置等待时间,find_element会立即查找元素,找不到就会立即报错,一般会设置下时间,让JS渲染完成再找元素。
cookie 设置
import time
from selenium import webdriver
browser = webdriver.Chrome(executable_path="chromedriver.exe")
# 删除原来的cookie
browser.delete_all_cookies()
# 注意需要访问一次才能添加 cookie
# selenium 的默认域名为 data,cookie 中带域名,在设置 cookie 时发现当前域名不包含在cookie中,会设置失败
browser.get("http://127.0.0.1:8088/inner/t4")
# 携带cookie打开
browser.add_cookie({'name': 'ABC', 'value': 'DEF'})
browser.get("http://127.0.0.1:8088/inner/t4")
browser.refresh()
browser.close()
time.sleep(10)
其他参数
# 添加UA
options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
# 设置代理
options.add_argument("--proxy-server=http://127.0.0.1:8888") # 设置代理,请求头等,以列表的形式传入多个参数
# 设置编码格式
options.add_argument('lang=zh_CN.UTF-8') # 设置编码格式
# 启动时最大化窗口
options.add_argument('--start-maximized')
# 指定浏览器分辨率
options.add_argument('window-size=1920x3000')
# 隐藏滚动条, 应对一些特殊页面
options.add_argument('--hide-scrollbars')
# 不加载图片, 提升速度
options.add_argument('blink-settings=imagesEnabled=false')
# 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
options.add_argument('--headless')
# 以最高权限运行
options.add_argument('--no-sandbox')
# 手动指定使用的浏览器位置
options.binary_location = r"/path/to/chrome"
#添加crx插件
option.add_extension('AdBlock_v2.17.crx')
# 禁用JavaScript
option.add_argument("--disable-javascript")
# 设置开发者模式启动,该模式下webdriver属性为正常值
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁用浏览器弹窗
prefs = {
'profile.default_content_setting_values' : {
'notifications' : 2
}
}
options.add_experimental_option('prefs', prefs)
SeleniumWire
selenium-wire 对 selenium 做了扩展,可以获取请求和响应信息,并且能够 修改请求头(包括自定义的头)、请求参数(包括param和请求体中的JSON数据)、获取修改响应头等信息。 但是该库已经不再维护。
上述库能简单模拟浏览器的行为,但功能依然不够完备,比如不能获取 websocket 链接等。所以 另外一个工具是 Puppeteer 和它的 Python 重写 Pyppeteer,后续文章单独介绍。
参考链接
- https://pypi.org/project/selenium/
- https://www.cnblogs.com/qlqwjy/p/16519286.html
- https://github.com/wkeeling/selenium-wire
- https://miyakogi.github.io/pyppeteer/