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

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

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

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

image.png

1.1、心得

  • 心得一:找出软柿子
    一个平台的数据,一般会在很多端呈现,比如手机移动端(主要包括以m开头,也叫做wap)、PC端以及手机APP端。
    一般情况下,m站是最简单的,它是首选。如果是拿API的话,很多APP端的也是比PC端要简单的多。PC端的反爬很多,包括各种验证码等。
    当然,这不是绝对的,有的时候PC站的信息最全,而你又恰好需要全部的信息,那么PC站是首选。一般m站都以m开头后接域名。
    这里说明一点,没有平台是没有手机移动端的,比如抖音只有APP,你觉得它有没有手机移动端?有的,你从APP分享出去一个页面就是啦。
  • 心得二:要善于使用浏览器调试工具
    以Chrome浏览器为例。
    第一步:Chrome浏览器打开页面 F12 点击Network,选中XHR(XMLHttpRequest方法发送的请求),刷新页面查看得到的一些AJAX请求是否有我们需要请求,
    第二步:选择手机版,重复第一步的动作,查看是否有没有想要的AJAX请求,以上都没有的情况下,选中doc刷新页面,我们想要的页面一般就在doc中。
  • 心得三:前端知识很重要
    看得懂JS,很多反爬都是在JS层面做的。
    知道有NodeJS中间层这个东西,很多公司都是通过NodeJS做中间层进行前后端分离的并解决性能问题,在异步ajax转成同步渲染过程中得到平衡。如下图,把数据通过NodeJS处理完之后放到HTML的一个属性里面再返回(很多平台就是这么干的)。
image.png

1.2、解决方案

  • 伪装 User Agent法
    在settings配置文件中新增User Agent池,在middlewares里面去调用。
========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'))
  • 轮换IP法
    使用IP代理和分布式。
    使用IP代码的方式,在settings配置文件中新增IP池,然后在middlewares里面去调用。和伪装 User Agent法的方式一样。
  • 模拟登录
    在start_requests到parse之间实现登录操作。
  • 云打码识别验证码
    去网上找找,一大堆。
  • 模拟浏览器操作
    selenium和PhantomJS模拟人的操作,作为一个需要高效率的爬虫系统,建议不这么做。
  • 达成和解:降低访问频率
  • 破解API
    前端知识,破解JS加密。

二、分布式爬虫的经验

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

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的框架模式。
这块主要看产品的设计啦。主要目的是监控任务的爬取情况,监控主题的健康情况。

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

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

  • 价格低,可以解释为成本低,人员成本。
    这个我就不细讲啦,技术何必为难技术呢。
  • 质量好是指内容质量满足要求,那么就需要对内容进行装饰。
    数据采集、内容分发分开的,中间时通过装饰关系表去建立关联。
  • 速度快是指内容推送及时性满足要求,在资源一定时需要可以设置不同任务的优先级。
    根据控制不同的任务被消费的worker数进行控制的。
  • 内容稳定性推送,那么需要提高内容分发的稳定性。
    需要一个消息队列,比如kafka。

四、爬虫中遇到的一些坑

  • 字符问题
    爬出来的内容是乱码,HTTP Header中Accept-Encoding 是浏览器发给服务器,声明浏览器支持的编码类型的。
  • 跨域请求
    就是爬去的当前页面的请求参数是来自上一个页面中的一个值,而且还可能是加密的值。
  • 数据藏在img文件中
  • 请求需要破解JS,JS被混淆过

五、视频落地和精准推送

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容