对于新浪微博的用户信息,和微博信息做爬取,构建爬虫系统
架构主要分两部分,下载器(Downloader)和提取器(Extractor)。下载器专注于数据的下载,可为下载器配置UA池或fake_useragent、cookie池、代理IP池(需要本地维护),不会做任何数据处理任务,下载成功后将数据写入Redis中定义好的Response List,并将用于下载的Request写入Dupefilter;提取器就会从Response List中拉取Response进行解析,不同网站使用不同key存储List。这里使用Redis作为Response中转是因为当运行的下载器数量较多时,返回大量的Response不一定能被提取器及时解析入库(数据库存储量达到一定级别后,磁盘IO可能大于网络IO),若放在内存中可能由于程序意外停止而丢失已经下载的Response(未入库)。
Dupefilter:使用BloomFilter可以有效节省去重集合对内存的消耗,取Redis中的256M字符串可对9000万条Url进行去重,漏失率为1.12e-04,漏失率和去重Url的数量关系可参考基于Redis的Bloomfilter去重,也就是说漏失率是可以控制的。
Request Queue:此队列可采用Redis的List或Zset数据类型实现,前者实现FIFO和LIFO队列,后者实现PRORI队列
Downloader和Extractor都可以分布式部署,只需配置好Redis服务的网络地址。两者的多线程部署有助于充分利用单机的带宽资源,CPU利用率提升可能不明显,爬虫始终是偏IO密集型的活动。
Request和Response:Request对象可作为一个字典来存,字典包含请求的url、cookie、headers、body、params、method以及others属性,Response也作为一个字典,包含下载到的html、cookies、headers、url以及others属性;这会有利于复杂页面的抓取。