复杂的爬虫设计

当我们要爬取的数据相对比较简单, 数据属于拿来即用型,实际上我们要爬取的数据大部分是非结构化数据(html 网页等),需要对这些数据做进一步地处理(爬虫中的数据清洗阶段),而且每个我们爬取的数据中也很有可能包含着大量待爬取网页的 url,也就是说需要有 url 队列管理,另外请求有时候还需求登录,每个请求也需要添加 Cookie,也就涉及到 Cookie 的管理,在这种情况下考虑 Scrapy 这样的框架是必要的!不管是我们自己写的,还是类似 Scrapy 这样的爬虫框架,基本上都离不开以下模块的设计

  • url 管理器
  • 网页(HTML)下载器, 对应 Python 中的urllib2, requests等库
  • (HTML)解析器,主要有两种方式来解析

下图详细解释了各个模块之间是如何配合使用的

正则表达式
以css, xpath为代表的结构化解析(即将文档以DOM树的形式重新组织,通过查找获取节点进而提取数据的方式), Python中的 html.parser,BeautifulSoup,lxml 皆是此类范畴。
在这里插入图片描述

  • 首先调度器会询问 url 管理器是否有待爬取的 url
  • 如果有,则获取出其中的 url 传给下载器进行下载
  • 下载器下载完内容后会将其传给解析器做进一步的数据清洗,这一步除了会提取出有价值的数据,还会提取出待爬取的URL以作下一次的爬取
  • 调度器将待爬取的URL放到URL管理器里,将有价值的数据入库作后续的应用

以上过程会一直循环,直到再无待爬取URL。
可以看到,像以上的爬虫框架,如果待爬取 URL 很多,要下载,解析,入库的工作就很大(比如我们有个类似大众点评的业务,需要爬取大众点评的数据,由于涉及到几百万量级的商户,评论等爬取,数据量巨大!),就会涉及到多线程,分布式爬取,用 PHP 这种单线程模型的语言来实现就不合适了,Python 由于其本身支持多线程,协程等特性,来实现这些比较复杂的爬虫设计就绰绰有余了,同时由于 Python 简洁的语法特性,吸引了一大波人写了很多成熟的库,各种库拿来即用,很是方便,大名鼎鼎的 Scrapy 框架就是由于其丰富的插件,易用性俘获了大批粉丝,我们的大部分爬虫业务都是用的scrapy来实现的。
首先要考虑一下爬虫在爬取数据过程中会可能会碰到的一些问题,这样才能明白框架的必要性以后我们自己设计框架时该考虑哪些点

  • url 队列管理:比如如何防止对同一个 url 重复爬取(去重),如果是在一台机器上可能还好,如果是分布式爬取呢
  • Cookie 管理:有一些请求是需要帐号密码验证的,验证之后需要用拿到的 Cookie 来访问网站后续的页面请求,如何缓存住 Cookie以便后续进一步的操作
  • 多线程管理:前面说了如果待爬取URL很多的话,加载解析的工作是很大的,单线程爬取显然不可行,那如果用多线程的话,管理又是一件大麻烦
  • User-Agent 与动态代理的管理:
    目前的反爬机制其实也是比较完善的,如果我们用同样的UA,同样的IP不节制地连续对同一个网站多次请求,很可能立马被封, 此时我们就需要使用random-ua ,动态代理来避免被封
  • 动态生成数据的爬取:一般通过 GET 请求获取的网页数据是包含着我们需要的数据的,但有些数据是通过 Ajax请求动态生成,这样的话该如何爬取
  • DEBUG 爬虫管理平台: 爬虫任务多时,如何查看和管理这些爬虫的状态和数据

从以上的几个点我们可以看出写一个爬虫框架还是要费不少功夫的,幸运的是,scrapy 帮我们几乎完美地解决了以上问题,让我们只要专注于写具体的解析入库逻辑即可, 来看下它是如何实现以上的功能点的

  • url 队列管理: 使用 scrapy-redis 插件来做 url 的去重处理,利用 redis 的原子性可以轻松处理url重复问题
  • Cookie管理: 只要做一次登录校验,就会缓存住Cookie,在此后的请求中自动带上此Cookie,省去了我们自己管理的烦恼
    多线程管理: 只要在中间件中指定线程次数
  • CONCURRENT_REQUESTS = 3,scrapy就可以为我们自己管理多线程操作,无需关心任何的线程创建毁灭生命周期等复杂的逻辑
  • User-Agent与动态代理的管理:
    使用random-useragent插件为每一次请求随机设置一个UA,使用蚂蚁(mayidaili.com)等代理为每一个请求头都加上proxy这样我们的 UA 和 IP 每次就基本都不一样了,避免了被封的窘境
  • 动态数据(通过 ajax 等生成)爬取: 使用Selenium + PhantomJs来抓取抓动态数据
  • DEBUG: 如何有效测试爬取数据是否正确非常重要,一个不成熟的框架很可能在我们每次要验证用xpath,正则等获取数据是否正确时每一次都会重新去下载网页,效率极低,但Scray-Shell提供了很友好的设计,它会先下载网页到内存里,然后你在 shell 做各种 xpath 的调试,直到测试成功! 使用SpiderKeeper+Scrapyd 来管理爬虫, GUI 操作,简单易行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值