关键词:python, scrapy, selenium, css伪类

最近准备做车评方面的数据分析工作,计划使用汽车之家口碑中的数据。

当我开始用我传统的方法scrapy去爬取时发现,汽车之家对文字内容作了一定的反爬处理。把大段的文本内容,抽出一部分高频的关键词,通过css伪类的方式进行展示。比如“满意”是其中一个词,通过看html源码,如“最满意的一点”却是:“最<span class=”hs_kw0_mainpl”></span>的一点”。那么如果简单的通过获取html内容就只能得到:最的一点。如果文章中的许多高频词都不能获取到,那文章也是没有意义的了。

如下:<span class=”hs_kw0_mainpl”></span> 的所表达的内容是由伪类定义的,::before content:满意 。

我最直接的想法是,从源代码中找到定义class=”hs_kw0_mainpl”的css文件,然后通过解析规范后,把<span class=”hs_kw0_mainpl”></span>还原成原始的内容。但是找了一段时间也没找着。而在分析的过程中,发现即使是相同一个词,比如“满意”,其class并不是一成不变一直是hs_kw0_mainpl的。一段时间后可能又变成了另外一个class,但类似于这种格式的class名。

既然相同的词class也会改变,那么肯定是动态生成的css文件了。那么做出class到对应文字的映射是没有意义的。

继续尝试。

通过google搜索,发现,是可以通过js获取到伪类的属性值的。

如下代码:

简单解释:
document.getElementsByClassName(‘hs_kw0_mainmX’) 通过类名获取dom对象
getComputedStyle(dom, ‘before’) 通过getComputedStyle获取经过浏览器渲染后的最终结果。填入第二个参数,则可以获取到伪类数据。
最后通过 .getPropertyValue(‘content’) 获取content的属性的值。
坑:
1、我本机的chrome可以,通过该方法正常获取到汽车之家口碑网站伪类内容。而本机的firefox却不能。应该就是版本问题,未深究。
2、getComputedStyle(dom, ‘before’)中,第二个参数:’before’,一定是’before’,而不是’::before’,如果填’::before’,什么也获取不到。而我在google上搜出的答案,如 http://stackoverflow.com/questions/3743513/how-do-i-access-style-properties-of-pseudo-elements-with-jquery ,等是getComputedStyle(document.querySelector(‘.element’), ‘:before’)或者’::before’,一个冒号或两个冒号的表达方式。而我机器chrome版本 56.0.2924.87 (64-bit),是不行的。我也是百般尝试,才发现汽车之家网站使用’before’才可以。 而我自己编写的测试demo,使用getComputedStyle(document.querySelector(‘.element’), ‘::before’)却是正常的。 未更深究。
好了,现在知道怎么获取到那个被替换成span的文字的content的了。

那么现在思路就清晰了。通过浏览器访问,并执行js代码,获取到该span的伪类设置的值,再进行文字的替换。

模拟浏览器我使用的是selenium工具,总体感觉比较方便。

期间遇到的问题:

1、通过selenium打开chrome浏览器去访问网页,正常我这边速度大概一秒爬一个地址,但总有一定的概率,1/5000左右,网页不动了,第一次跑的时候,开了8个进程同时跑,一秒一页的话,预计第二天应该能有30w左右数据,第二天来了发现,才十万,而打开的7个浏览器都不动了,而任务却没有进行完。

大概原因是selenium等待网页加载完毕后继续执行,虽然网页已经显示出了内容,但可能有一些因素导致一直无法触发browser.get()加载完毕的条件。

解决方法:

首先:设置超时时间: browser.set_page_load_timeout(15)

当遇到超时异常时,重启浏览器。可以解决。

2、因为目前计划只需要爬去网页的内容,所以图片和其他不必要的东西就不要加载了,以节省资源。

我开始搜索如何设置,禁用flash和图片加载。有不少地方讲到。而参数设置,我并没在selenium文档中找到具体Chrome浏览器设置的介绍。

于是开始各种尝试,对启动浏览器时进行设置参数。

最终有效的设置结果是:

网上有不少设置方式,在我这里却没有生效,以上是尝试了许多种方法中,最终有效的方法。

 

对于这次汽车之家口碑数据的爬取,大概就这些吧。截止到2017年3月初,大概83w条口碑数据。最终爬下来未压缩的文字数据:1.5G。这还不包括追加的口碑和评论。主要是下图中的内容:

期望我走过的坑,能帮到后来的人。

 

我把爬取的数据分享到百度网盘了,压缩后500M,如对自然语言感兴趣的,可以直接拿去研究。

链接: https://pan.baidu.com/s/1hrNMkdA 密码: tux3

=====2017.8.12 更新=====

github地址: https://github.com/keepangry/autohome_koubei_crawler.git

=====end=====

格式如下: