Python爬取网站时遇到瓶颈,如何解决?
发现该网站似乎是用了 distil networks 的反爬虫服务, 如果需要拿到数据就必须带上 cookie,不带 cookie 的请求都会被直接返回 sessionStorage.setItem(‘distil_referrer’, document.referrer); 而这个 cookie 的失效时间又很快,只有 5 分钟左右,并且用的次数多了,大概四五次也会失效,并且我使用 fiddler 跟踪,拿到所有 cookie 参数后,利用这个 cookie 依然无法拿到数据,请问广大社友们有遇见过这种情况吗?
Python爬取网站时遇到瓶颈,如何解决?
https://i.loli.net/2018/09/27/5bac44a20e9c0.png 这是一直关于 distil networks 的 fiddler 跟踪图片 p 参数记录的是浏览器指纹 我现在多次使用这个 p 参数 是能拿到返回值的 但是这个返回值拿不到正确的数据
遇到爬虫瓶颈,先别急着加线程,得先定位问题在哪。通常就几个地方:目标网站的反爬策略、你本地网络或代码效率、还有对方服务器的容忍度。
第一步,先看反爬。 最简单的,用requests发个请求,看看返回状态码和内容。
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
resp = requests.get('你的目标网址', headers=headers)
print(resp.status_code)
print(resp.text[:500]) # 看前500字符
如果返回403、429或者页面里一堆验证码的提示,那基本就是被反爬了。这时候得加headers模拟浏览器,或者用time.sleep随机延时。如果还不行,可能需要考虑用selenium这类工具模拟真人操作,或者研究下网站有没有公开的API接口能直接调用。
第二步,如果是速度慢或卡住。 先检查是不是单个请求就慢。如果是,那加并发也没用,可能得优化解析逻辑(比如用lxml代替BeautifulSoup解析大页面),或者看看是不是网络问题。如果单个请求快,但批量抓取慢,可以用concurrent.futures搞个简单的线程池控制并发数,别一上来就开几百个线程把人家服务器搞崩了。
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
def fetch(url):
# 你的抓取逻辑
time.sleep(0.5) # 礼貌性延时
return requests.get(url, headers=headers).status_code
urls = ['url1', 'url2', 'url3'] # 你的url列表
with ThreadPoolExecutor(max_workers=5) as executor: # 控制并发数
futures = {executor.submit(fetch, url): url for url in urls}
for future in as_completed(futures):
print(future.result())
第三步,考虑数据存储。 如果边抓边解析边存数据库,也可能卡在这里。可以试试先把原始响应临时存下来(比如存成文件或丢到消息队列里),事后再慢慢解析,把抓取和数据处理拆开。
最后,最实在的建议: 仔细看看目标网站的robots.txt,控制一下抓取频率,做个遵纪守法的好爬虫。有时候慢就是快,稳定比啥都强。
总结:先定位是反爬、效率还是存储问题,针对性解决。
做爬虫确实都很费劲的,毕竟不是 debug,有报错信息什么的
Webdriver hub
是不漏了哪个参数。祝你好运。
是挺费劲的 啥都要学一点 js 要学 接口要会做 app 端 wechat 端 pc 端得会抓包 偶尔还得做个 GUI 什么的
selenium 试下? 虽然效率不高
是尝试过的 但是效率太低了 不符合预期 并且并发的情况也不太理想
参数应该没有遗漏 我在使用某一个 ip 拿到所有 cookie 之后 如果我使用这个 ip 真实地用浏览器访问了该网站 那么我之前拿到的那个 cookie 就能使用一段时间 具体原理我也不太明白 也许是他们记录在了服务器上
selenium 就是效率太低了 并且该网站会检测无头 无 js 这样也加大了服务器的负载
企鹅 base64:MTk3NDMwNDU5OA==
请问是什么网站方便说下吗?
这没办法。除了使用动态浏览器,就是得分析网站的 JS 了。
cookies 是 js 动态生成的,你光复制不行吧
请问什么网站方便说下?
用 selenium 生产 cookie 存着,爬虫去拿 cookie,超时或者超次数就换一个,这样多线程几个 seleniumdriver 来生产的 cookie,效率应该比只用 selenium 好不少
cookie 是动态生成的没错 我用相同的 P 参数每次从 response headers 里面拿到的 cookie 都不一样 然后我将这些 cookie 拼接之后和正常生成的 cookie 对比了一下 是一模一样的 但是用这个 cookie 就无法拿到数据 而真实的 cookie 就可以 并且有趣的是 我如果用该 ip 去真实访问了这个网站 这个 cookie (我自己 requests 伪造生成的)也可以用了
meituan 好像也是这样 cookie 还好弄 只是 5 分钟后触发防爬虫的原因不太确定 奥塞头:(
问一下 ,是哪个网站??
先用浏览器正常请求操作,抓包看请求过程,模拟这个请求过程,如果浏览器操作也是会更新 cookies,那代码上也只能跟着更新
我这里有个思路 selenium + headless chrome 每 3 分钟打开网页 从 chrome 拿到 cookie
https://github.com/valord577/taobaoke
这个虽然是用 java 写的 但是封装 selenium 的思路 python 也是通用的
感谢分享。 但是 selenium 效率确实是太低了 并且消耗资源较多 抓取数据的量又比较大 单一个 cookie 只能使用 4-5 次 所以暂时不考虑走 selenium 实在不行的话就只能走 app 端了
试试这个? pyppeteer
尝试了一下–! 会被反爬虫识别 出现验证码
Pardon Our Interruption
[’//cdn.distilnetworks.com/images/anomaly-detected.png’]
老哥,我也遇到了这个问题,能不能加个微信聊下
可以啊 留下你的 v
现在是在尝试 app 了,pc 端的搞不定–!
我最近遇到用 selenium 被网站识别出来,我设置了 useragent,加了代理,依然被识别出来,有点头疼,可以交流下吗
可以尝试下 pyqt
想问下题主搞定了吗?
已经搞定了 模拟生成 p 参数即可
请问题主现在还可以抓到数据吗?可以加个微信交流下吗?
留下你的联系方式咯
这楼主是一个搞外包的,大家不要给骗了,加了 QQ 以后一直在忽悠,没两句就开始装逼,然后要我搞外包.
技术问题一个都不回答,问什么都说很简单自己搞,要不然就找我外包,真是没见过这种人,一点想探讨的精神都没有,还跟我装起逼来,说多了就开始骂我菜鸡,菜鸟,真的是给点阳光就灿烂,懂一点就开始装逼,你爸妈没有教过你做人的道理吗?真是悲哀

