scrapy学习和尝试:续

接着上一篇,终于成功抓取淘女郎图片。

首先是登录的改进,采用了immzz登录知乎的代码,这种方式是使用selenium和xvfb作为headless browser,能自动加载js,模拟人用浏览器去登录网站,抓取网页很稳定。比之前具体去分析每个登录细节,然后纯粹用代码模拟登录要方便得多。

后来我又尝试了使用selenium和phantomjs作为headless browser,解析速度更快,占用系统资源更少,但是遇到过没有响应的情况。

使用headless browser的另一个好处是二级页面可以把cookie带过去。

输入验证码采用的方式也是人工输入:使用一台有gui的机器,linux桌面或者windows、mac都行,连上redis,当提示需要验证码时,将网页截屏,存入redis,然后显示出来,人工输入验证码,返回给爬虫。既然是存入redis,那么只要能连上redis的爬虫都可以使用,那么可以开启多个爬虫爬不同的页面。

接着再说一下之前触发淘宝反爬虫策略的原因:scrapy默认有个设置,CONCURRENT_REQUESTS = 16,我把它设置为2,就不会再触发了。

还有一个改进,自定义了一个中间件,也是从网上获取的,现在找不到出处了,汗。。。

class PhantomJSMiddleware(object):
    # overwrite process request

    def process_request(self, request, spider):

        if request.meta.has_key('PhantomJS'):  # 如果设置了PhantomJS参数,才执行下面的代码
            logging.info('PhantomJS Requesting: '+request.url)
            try:
                driver = request.meta['driver']
                driver.get(request.url)
                content = driver.page_source.encode('utf8')
                url = driver.current_url.encode('utf8')
                return HtmlResponse(url, encoding='utf8',
                                    status=200, body=content)

            except Exception, e:  # 请求异常,当成500错误。交给重试中间件处理
                logging.error('PhantomJS Exception!')
                return HtmlResponse(request.url, encoding='utf8',
                                    status=503, body='')
        # else:
        #     logging.info('Common Requesting: '+request.url)

意思就是在登录淘宝后,抓取一级页面和二级页面都使用headless browser,可以传递cookie,保持登录状态;而最终抓取图片的时候,是另一个域名,不需要传递cookie,也无需调用headless browser,这样下载图片速度就很快。

还有一个问题是,在登录出现验证码的时候进行截屏,发现总是乱码,解决方法是:

sudo apt-get install ttf-wqy-microhei  #文泉驿-微米黑
sudo apt-get install ttf-wqy-zenhei  #文泉驿-正黑
sudo apt-get install xfonts-wqy #文泉驿-点阵宋体

或者(我用的是ubuntu 14.04,用的是上面的包,下面的是centos的包,遇到问题的朋友可以试试看)

yum install fonts-chinese

这个爬虫我已经在pc上连续跑了1天,成功抓取了上万个mm的图片:),很稳定。再次感谢immzz

这里是爬虫地址

by zhuhangyu Sep 2, 2015