1. 无头浏览器采集应用的反爬虫与反检测功能解析
在数据爬取过程中,网站会针对爬虫进行反爬虫/反检测,以防止非法的数据抓取行为。这是一种常见的保护企业利益和网站安全的方法。针对反爬虫与反检测,我们可以使用无头浏览器解决这个问题。无头浏览器是一种浏览器,可以模拟人类操作浏览器,解决反爬虫/反检测问题。这种浏览器通常没有UI或界面,可以在后台处理任务。
1.1 反爬虫的原理与应对策略
反爬虫机制有多种,大部分都是基于识别访问的流量来源,并限制流量、增加难度。这些机制包括:
IP限制
请求频率限制
验证码验证
UA识别
IP限制是一种最基础、最简单的反爬虫手段,即根据IP地址对访问进行限制。请求频率限制是指在一定时间内对相同的接口或URL进行多次访问的限制。验证码验证是指在访问页面时弹出验证码,使机器难以模仿。UA识别是指根据请求的User-Agent来识别是否为机器访问。
针对这些反爬虫策略,我们可以使用无头浏览器来反制这些机制。通过无头浏览器,我们可以动态地改变IP地址,并控制访问的频率以规避IP限制和请求频率限制。使用selenium模拟人类操作来通过验证码验证,避免被识别为机器访问。同样,我们也可以通过控制请求头来模拟人类浏览行为,绕过UA识别。
1.2 反检测的原理与应对策略
反检测主要是针对JavaScript,通过对JavaScript 程序逻辑的判断,判断当前的请求是否是机器访问,来进行反爬虫。一些常见的反检测技术包括:
客户端指纹技术
WebGL指纹技术
极验验证技术
JS跳动坐标验证技术
页面渲染后再添加内容
客户端指纹技术是一种基于你的浏览器和你的环境生成唯一的标识,通过这个标识来判断是否是机器访问。WebGL指纹技术可以通过分析WebGL显卡的能力和版本来生成指纹,通过比较指纹来识别是否是机器访问。极验验证技术和JS跳动坐标验证技术是一种人机验证的技术,可以通过检测鼠标的点击和移动等行为进行判断,来识别是否是机器访问。页面渲染后再添加内容是指通过页面渲染完成后再添加js或css等外部内容进行反检测。
反检测技术相对比较复杂,在这里我们可以通过使用pyppeteer与无头浏览器结合的方式进行反制。pyppeteer是一个支持Chrome的Python3.6+无头浏览器。通过使用pyppeteer我们可以模拟在浏览器中使用鼠标操作,来进行反检测。同时,在使用队列管理接口的时候,我们可以使用异步处理队列,从而提高处理速度和效率。
2. 应对策略
当我们了解无头浏览器后,下一步是了解如何应对各种反爬虫和反检测技术,具体方法如下:
2.1 使用IP代理池
IP代理池是一种IP池,可以提供大量不同的IP地址,这可以帮助我们避免IP限制和请求频率限制。可以使用第三方IP代理商,也可以从公共代理网站或收费IP代理供应商获取IP地址。
from requests import get, exceptions
from multiprocessing.pool import Pool
from random import choice
pool=Pool(processes=10)
ips=[]
for i in range(100):
try:
r=get('http://httpbin.org/get', timeout=1, proxies={'http': choice(ips)})
if r.status_code==200:
ips.append(r.json()['origin'])
except exceptions.RequestException:
pass
2.2 使用fake user agent模块
默认情况下,对于Python的requests请求,会使用Python默认的user-agent,但是这很容易被检测为机器爬取。因此,在每个请求中随机使用多个经常被人类使用的user-agents会提高成功率。
from fake_useragent import UserAgent
from requests import session
ua=UserAgent()
header={'User-Agent': ua.random}
s=session()
s.headers.update(header)
s.get('https://www.baidu.com')
2.3 使用selenium模拟人类操作
Selenium是一个自动化测试工具,支持多种浏览器,可以通过模拟人类浏览行为来绕过反爬虫机制。可以通过控制WebDriver来模拟人的操作,比如点击、滑动、输入等行为。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument('--start-maximized')
options.add_argument('--disable-extensions')
options.add_argument('--disable-infobars')
driver=webdriver.Chrome(chrome_options=options)
driver.get('https://www.baidu.com')
search_input=driver.find_element_by_xpath('//input[@class="s_ipt"]')
search_input.send_keys('Python')
search_button=driver.find_element_by_xpath('//input[@class="s_btn_wr"]/input[@type="submit"]')
ActionChains(driver).click(search_button).perform()
2.4 使用pyppeteer模拟鼠标操作
pyppeteer是一个支持Chrome的Python3.6+无头浏览器。pyppeteer通过控制Chrome来模拟鼠标操作和键盘事件,从而模拟人类操作浏览器。也可以通过pyppeteer来绕过常见的反检测方法。
import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth
async def main():
browser=await launcher.launch(headless=True, stealth=True
)
page=await browser.newPage()
await page.goto('https://s.weibo.com/')
await page.type('#plc_wbtype_a .searchInp_form textarea', 'Python')
await page.click('#plc_wbtype_a .s-btn-b')
await asyncio.sleep(5)
await browser.close()
launcher=launch()
asyncio.get_event_loop().run_until_complete(main())
3. 结论
在大数据时代,数据的采集已经成为了数据分析必不可少的一环。为了防止机器对数据进行非法采集,网站通常会部署反爬虫/反检测技术。通过无头浏览器,我们可以轻松地绕过这些技术。在实践中,我们需要根据实际情况来使用不同的应对策略。