Python中大众点评网站反爬机制又升级了,如何应对?
现在变成这样的了,以前 class 还有特定的标识。虽然麻烦点,但是还是可以通过 css 跟 svg 还原数据,这种就完全没有思路了,有大佬能给个思路吗
示例页面:
Python中大众点评网站反爬机制又升级了,如何应对?
我看到的怎么和你看到的不一样?
https://i.loli.net/2019/04/30/5cc8504f24617.png
大众点评的反爬确实越来越严,主要难点在几个地方:
- 动态Cookie:
_lxsdk_s和_lxsdk这类Cookie是服务端生成的,直接请求拿不到数据。 - 请求签名:
_token参数是前端用JS生成的,每次请求都会变。 - 风控检测:频繁请求会触发验证码或直接封IP。
要解决的话,核心思路是模拟浏览器执行环境,让服务端认为你是真实用户。
方案一:用Selenium/Playwright模拟真人操作
适合数据量不大的情况,直接控制浏览器打开页面,等数据加载完再解析。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://www.dianping.com/shop/xxxx")
time.sleep(3) # 等页面加载
html = driver.page_source
# 再用BeautifulSoup或正则解析html
driver.quit()
缺点就是慢,但能绕过大部分前端加密。
方案二:逆向JS生成签名
如果你需要高效爬取,得把生成_token的JS逻辑抠出来,用Python重写或者用execjs调用。
import execjs
with open('dianping_encrypt.js', 'r', encoding='utf-8') as f:
js_code = f.read()
ctx = execjs.compile(js_code)
token = ctx.call('getToken', '参数')
这需要花时间逆向,但一旦搞定效率就很高。
方案三:直接找数据接口
有些数据其实有隐藏的接口,比如通过抓包工具(Charles/Fiddler)找*.dianping.com的API请求,看能不能直接调用。但这类接口往往也有签名校验。
总结建议:小规模爬取用方案一,大规模就得硬刚JS逆向。
为什么不无头浏览器加 OCR
不同页面有不同的加密类型,他是 woff 跟 svg 混合加密,以前好像只有 svg 加密
OCR 好评!
学到一个反爬技术+1,备忘:
不过我这看到的这个好像不用 ocr,破解起来也算是易如反掌,坐标啥的都有,就差定位实际文字的代码了。。。
http://www.dianping.com/shop/2061139/review_all/p1 跟 http://www.dianping.com/shop/2061139 的评论是两种不同的加密方式,svg 的早就搞定了。
看起来很像自定义 CSS,不过没尝试过,改天研究研究( https://github.com/Northxw/Dianping, 这是我一周前搞得,只不过我没爬评论)
就是定义了一下字体而已,SVG 加密大众已经弃用了,你看到的方框是一个 Unicode 字符,Unicode 的编号和字体文件相对应,只不过字体文件并不是固定的,是渲染出来的,会有几个坐标的差异
总共就加密了六百多个字


