@IT·互联网程序员python

爬虫总结 | 爬虫的那点事第一篇

2018-06-21  本文已影响155人  小怪聊职场

现在慢慢开始对爬虫的一些工作做一个总结,这是第一篇文章,整理聊下做一个爬虫系统时的一些感悟。

一、在(反)爬虫路上的心得和解决方案

在讲反爬之前,先说阐明我的一个观点:反反爬的过程其实是一个和我们的客户(反爬平台)达成和解的过程,保持一种近乎双赢的平衡,不到万不得已不要做技术上的硬碰硬,因为客户是上帝,惹毛了它,对大家都不好。
我们爬了两百多个平台,很多小平台经常被我们爬挂掉啦。网上有一个比较流行的反爬和反反爬的对比图,我想说的是,大家都是搞技术的,何必如此!

image.png

1.1、心得

image.png

1.2、解决方案

========settings配置文件========
#User-Agent池
USER_AGENT_LIST = [
        'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:41.0) Gecko/20100101 Firefox/41.0',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
        'Mozilla/6.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
        'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Mobile Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36',
]
========middlewares配置文件========
# User Agent轮换
class RotateUserAgentMiddleware(UserAgentMiddleware):
    def __init__(self, user_agent):
        self.user_agent = user_agent

    def process_request(self, request, spider):
        ua = random.choice(self.user_agent)
        request.headers['User-Agent'] = ua
    
    @classmethod
    def from_crawler(cls, crawler):
        return cls(user_agent=crawler.settings.get('USER_AGENT_LIST'))

二、分布式爬虫的经验

分布式需要考虑的几个问题,第一个就是如何搭建分布式爬虫系统;再就是因为使用了分布式,部署爬虫系统的服务器会有很多,那么第二个需要考虑的问题就是如何一键部署;当然也需要监控系统,看看每个任务的运行情况。

2.1、搭建分布式爬虫系统

那么多台主机协作的关键是共享一个爬取队列。可以使用Scrapy-Redis,Scrapy-Redis库改写了Scrapy的调度器,队列等组件,可以方便的实现Scrapy分布式架构。也可以使用其他方式。
我们使用的是Celery+Rabbitmq+Scrapy+Flower构建的分布式爬虫系统。
Celery是一个基于python开发的分布式异步消息队列,轻松实现任务的异步处理。
Celery在执行任务时需要一个消息中间件来接收和发送任务消息,以及存储任务结果,一般使用RabbitMQ 或 Redis,本系统采用的是Rabbitmq。
Flower是Celery的一个实时监控和管理Web界面工具。
Flower使用Celery Events进行实时监视,实现了显示Task进度和历史,显示Task的详细信息(参数,启动时间,运行时间),以及统计数据和图形的表示。
查看有那些节点(worker),点击具体的worker可以查看每个worker的详细情况,以及设置:

image.png

查看Tasks,进入详情页还可以查看参数,启动时间,运行时间,以及任务失败的原因:

image.png

2.2、一键部署

Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

2.3、监控&WEB系统

搭建了一个爬虫系统之后,需要对爬虫爬去的数据进行一个监测,主要包括服务器管理、任务管理、主题管理和数据管理等。
爬虫WEB系统是基于Django构建的爬虫web系统。Django是一个基于Python开发的web应用框架,采用了MTV的框架模式。
这块主要看产品的设计啦。主要目的是监控任务的爬取情况,监控主题的健康情况。

三、对于后期的内容精准推送有什么建议

老板肯定都是希望码农做出来的东西是价格低、质量好、速度快、保稳定,下面我来一个个说。

四、爬虫中遇到的一些坑

五、视频落地和精准推送

没有做过去把第三方视频落地过,本质上应该是没有什么区别。

六、数据落地,后期做用户画像考虑

提前考虑,把要做用户画像的数据用担当的一个日志文件保存,不然到时候获取需要的数据结构时比较麻烦。
做用户画像困难点可能是在梳理业务,制定合适的权重值。

数据存储的典型方法是Hadoop的分布式文件系统HDFS和HBase。

上一篇下一篇

猜你喜欢

热点阅读