模拟浏览器的行为,即只要用户从浏览器的界面能获取到信息,则可以通过本文的方式 爬取数据。

Selenium

pip 安装依赖

首先 Selenium 需要 driver 与浏览器进行交互,不同浏览器对应的 driver 在 参考链接 中有列出。对于 Chrome 来说 最新的版本(126) ChromeDriver 已与 Chrome 同版本发布,选择当前安装的对应 版本即可,Driver 需要放到 PAHT 路径中;然后执行 pip 安装命令即可

样例使用

样例代码可以参考First script

browser.implicitly_wait(20)

需要注意的点,如果不设置等待时间,find_element会立即查找元素,找不到就会立即报错,一般会设置下时间,让JS渲染完成再找元素。

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,后续文章单独介绍。

参考链接

  1. https://pypi.org/project/selenium/
  2. https://www.cnblogs.com/qlqwjy/p/16519286.html
  3. https://github.com/wkeeling/selenium-wire
  4. https://miyakogi.github.io/pyppeteer/