基于浏览器的爬虫
在爬取基于 web 的数据时,我们经常会遇到反爬虫网站,这些网站需要执行 JavaScript 程序进行页面渲染。这时我们会用到 Playwright、Selenium 等 web 自动化测试框架来模拟浏览器获取页面数据。
浏览器指纹检测
然而,这种方法与正常的浏览器访问有一定区别。例如,window.navigator.webdriver 对象,在正常的 Chrome 浏览器中访问时返回 false。
而当使用 Selenium或 Playwright 打开浏览器时,该属性为 true。
有许多类似的方法可以检测是否使用了自动化工具,这种检测方式被称为浏览器指纹检测。当然,浏览器指纹检测不仅用于检测是否使用了自动化框架,还可以在未登录的情况下判断两个请求是否由同一浏览器发起。可以通过访问 https://bot.sannysoft.com/ 来检测,这里汇聚了市面上常见的检测手段。
chrome
playwright
破解
由于检测方案通常也是通过js调用获取的一些配置对象的值,我们可以在访问页面前修改这些配置来绕过自动话化检测。
这里推荐一个汇聚的比较常用破解方案的插件puppeteer-extra-plugin-stealth。
这个插件专门用于绕过各种反自动化检测。它通过应用一系列的补丁和改动,使得 Puppeteer 更难被检测到。
包括且不限于:
• 伪装用户代理字符串(User Agent String)。
• 修改 WebGL 参数。
• 绕过 webdriver 检测。
• 屏蔽 headless 模式特征。
• 隐藏指纹特征。
可以下载已经打包好的js代码。https://cdn.jsdelivr.net/gh/requireCool/stealth.min.js/stealth.min.js
然后在访问需要爬取数据之前先执行这个修改程序。
browser_context.add_init_script(path="./stealth.min.js")
如果是playwright也可以直接使用封装好的库。
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
async def main():
async with async_playwright() as p:
for browser_type in [p.chromium, p.firefox, p.webkit]:
browser = await browser_type.launch()
page = await browser.new_page()
await stealth_async(page)
await page.goto('http://whatsmyuseragent.org/')
await page.screenshot(path=f'example-{browser_type.name}.png')
await browser.close()