Scrapy爬取大众点评


内容:

美食品类750个商家:

  • 商家的页面url
  • 商家的主要信息
  • 商家所有的促销信息(1200+条)
  • 商家所有的评论信息(没爬完,14w+条)
  • 发表这些评论的所有用户的信息(没爬完,5w+条)

代码:https://github.com/preke/Spiders/tree/master/DaZhongDianPing

总结和学习的一些点:

  1. 大众点评有反爬机制,直接运行爬虫,会返回403 forbidden, 所以要换UA, 这里我参考了这篇文章
    http://blog.csdn.net/haipengdai/article/details/48545231
    (亲测这个中间件太厉害了,同学遇到的输入验证码的问题我都没遇到)

  2. scrapy高度集成,设置完start_urls之后,start_request()根据start_urls的url生成Request对象,然后访问网页返回一个可迭代Response对象,直接默认回调parse()parse()返回的可迭代Request对象,直接默认回调start_request()
    注: 这里的Request对象和Response对象是scarpy里定义的:

from scrapy.http import Request
from scrapy.http import Response

具体说明:http://scrapy-chs.readthedocs.io/zh_CN/stable/topics/request-response.html#module-scrapy.http
而具体这个可迭代,因为内部实现时用迭代器,所以返回的时候,可以在返回对象上加一个’[]’

  1. 多个爬虫pipline的问题,这样解决:
    def process_item(self, item, spider):
        if spider.name == 'url':
            do url things...
        elif spider.name == 'shop':
            sdo url things...
        elif spider.name == 'promotion':
            do url things...
        elif spider.name == 'comment':
            str1 = type(item)
            if str(str1) == "":
                print 'ok'
            else:
                self.saveOrUpdate(self.user_collection, item)


  1. 遇到ajax要自己定义请求发送,然后遇到302,原因还是ua的问题,我通过requests库的request直接发get请求,发现返回的时重定向的页面,然后把请求委托给scrapy封装的Request,就可以获取信息(因为会通过中间件来换UA)。
    推荐使用postman先试一下,如果请求需要参数中有时间戳,可以自己随便设(仅限于本例,其他的还不清楚)
  2. 后来遇到最大的问题是应对大众点评的反爬机制,中间折腾了各种各样的方法,不再累述,只说问题的结论:

  • 我也遇到了输入验证码和403两个问题
  • crawlera开始收费了
  • 西次网的代理ip不靠谱,或者说是首页的ip不靠谱
  • 自己用vmware开了6个虚拟机桥接网络,然后装上polipo做代理
  • 自己写代理中间件,从代理池中random.choice()的效果不如我写一个时间片轮转的效果好,而且桥接网络的代理ip质量好像也不太高,有些也会被临时禁用。(本质感觉还是代理质量不高)
  • 最后用几个可用的ip代理做轮转,一个连续发3个请求,然后换另一个,DOWNLOAD_DELAY 设为0.25

总结:

  • 自己写的程序质量不高,发送请求的地方应该可以继续优化;
  • 有高质量的代理肯定是好事,会省很多工作,或许说是偷懒的一种方式
  • 师兄说了一个点,弄清楚程序发送请求和浏览器发送请求的区别,这是努力的一个点
  • 引发了一个思考,可能是懂的太少:既然可以用代理池,分布式爬虫的意义在哪里?

你可能感兴趣的:(scrapy,数据处理)