本文涉及的反爬技术,仅供个人技术学习,禁止并做到:
最近有个爬“某车之家”网站里论坛帖子的spike,遇到一系列的问题,遂这里整理下。
这里以爬此网站的“奔腾T99论坛”为例。
用我最近在捣鼓也最熟悉的框架+库:scrapy+splash
carPostList有api接口,直接调用获取json数据即可
carPost无api接口,纯服务器端渲染,直接抓取pagesource再用cssselector。
这里选择存入mongodb。
耗时:约1hour(设置了每个请求间隔3s)
这章是本文的重点,会列举我遇到的一系列问题,和解决的思路、方法。
2、以为是requestheader的问题,于是加了User-Agent、Cookie等都无用。用selenuim做了对比实验,发现相同的header配置selenuim却可以加载成功,遂排除此条。
注:在用selenuim爬的时候,需加上User-Agent,如Mozilla/5.0(Linux;Android5.1.1;Nexus6Build/LYZ28E)AppleWebKit/537.36(KHTML,likeGecko)Chrome/48.0.2564.23MobileSafari/537.36,否则爬取失败。
3、以为是splash功能配置的问题,所以我把splash的几乎所有有嫌疑的属性都打开了:
splash.plugins_enabled=truesplash.indexeddb_enabled=truesplash.webgl_enabled=truesplash.html5_media_enabled=truesplash.media_source_enabled=truesplash.request_body_enabled=truesplash.response_body_enabled=true#下面都是默认为true,我还是覆写了一遍。splash.js_enabled=truesplash.images_enabled=true事实证明还是无用。
关闭浏览器的私有模式(匿名模式)即可。(默认是打开的)
做法:splash.private_mode_enabled=false或者启动splash时指定个参数dockerrun-p8050:8050scrapinghub/splash--disable-private-mode,结果如下图:
“有时您仍然需要关闭私有模式,WebKit的本地存储在开启私有模式时不能正常工作。并且可能无法为本地缓存提供JavaScript填充程序。因此对于某些站点(某些基于AngularJS站)您需要关闭私有模式。”
看来splash的私有模式影响了此网站的DOMStorage。
官方文档还说了:
所以在一般情况下,还是建议打开私有模式。
可以做一个实验来证实这一点,即打开chrome,在settings->Cookiesandsitedata->Block里添加此网站,然后再访问,发现网站确实出现了跟之前一样加载不出的情况。
在爬取帖子内容时,经常会出现一句话不全的情况,即少个别字,而这些字在浏览器打开则显示为粗体样式,复制粘贴出来则变成了。
看来此网站做了反爬措施。
目前已知的几个字体反爬的网站还有:猫眼,天眼查,起点中文网等。
我用浏览器调试工具,发现这些口有两个特点:
2、这些口都被一个包裹着,且用了CSS3的@font-face,即:
发现"是"这个字确实对应的是"$ED19"。
2、调用第三方代码,替换口为正常汉字
eval(repr(value).replace('\\','\'))的作用是,第三方代码里对unicode的定义多了一个\,如\\u4f4e,所以需要在替换前减去一个\。