python爬取js动态网页
打开浏览器按F12,动态看到数据在XHR请求里躺着,网页却拿requests死活抽不出来——这种挫败感我太熟了。动态js动态渲染的网页页面就像个黑箱,你以为它藏着掖着,动态其实只是网页把数据藏在了脚本执行之后。 最笨也最有效的动态办法,是网页直接找接口。知乎热榜的动态标题、淘宝的网页商品价格,但凡你能在Network面板里翻到json响应,动态就别碰Selenium。网页我常跟人讲,动态爬虫第一步不是网页写代码,是动态当侦探。鼠标右键“检查”,切到Network,刷新页面,盯着那些XHR请求看——数据若在这里现身,问题就解决了大半。requests带上headers和cookies,伪造个正常浏览器身份,几行代码就能拿到干净数据。 但总有例外。有些网站把数据加密后塞进js代码里,或者干脆用WebSocket实时推送。这时候你得换个思路:让浏览器自己干活。 Selenium重,但稳。它模拟真人操作,打开页面等脚本跑完,再抓渲染后的DOM。代价是慢——一个页面等两三秒是常态,爬上千条数据能急死人。后来我改用Playwright,这东西支持异步,还能拦截请求直接取响应体,比Selenium轻巧不少。记得有回爬某个数据可视化平台,图表是canvas画的,DOM里全是 还有个野路子,用pyexecjs直接执行页面里的js函数。有些网站把数据加密后塞进js代码里,或者干脆用WebSocket实时推送。这时候你得换个思路:让浏览器自己干活。比如某影视站,播放地址藏在js的 写爬虫最忌讳一套方案打天下。静态页面用requests+BeautifulSoup,动态页面先找接口,接口被加密就上浏览器自动化,自动化太慢就混合着来——先用Playwright拿cookie,再丢给requests跑并发。我见过有人拿Selenium硬刚静态页,纯属杀鸡用牛刀,慢得让人抓狂。 反爬这东西,说到底是在跟对方的工程师斗智斗勇。js逆向看着高大上,其实本质就是琢磨人家代码里的逻辑漏洞。有回我盯上一个网站,token是用时间戳加固定盐值做的MD5,直接在Python里复现了算法,连浏览器都不用开。那种感觉,跟解开一道谜题差不多,挺上瘾。 工具选型上,我个人的偏好是:能requests就不Selenium,能Playwright就不PhantomJS(这玩意儿早淘汰了)。新版Selenium 4支持了相对定位,但Playwright的自动等待和选择器语法更顺手。要是碰上懒加载的图片,记得用 最后说句实在话:动态爬虫的门槛不在技术,在思路。拿到一个陌生网站,先花十分钟翻它的请求记录,比上来就写代码有用得多。数据藏在哪,用什么方式传输,有没有混淆——这些问题想清楚了,代码反而是最不费脑子的部分。canvas标签,没法直接提取。最后用Playwright的page.on("response")监听接口,把返回的json截下来,绕了个弯子反而更省事。decode()方法里。把那段js抠出来,在Python里用execjs调,传入参数就能解密出真实地址。这法子不通用,但碰上特定场景比什么都好使。scroll_to滚动页面触发加载,不然抓不全。
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-