在使用 scrapy 爬取 IT桔子公司信息,用来进行分析,了解 IT 创业公司的一切情况,之前使用 scrapy 写了一个默认线程是10的单个实例,为了防止被 ban IP 设置了下载的速度,3万多个公司信息爬了1天多才完成,现在想到使用分布式爬虫来提高效率。
源码githup
Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemyDocker 点这里去了解、安装;pip install scrapy scrapy_redis;spider 爬取;spider 共享一个 redis list 中的链接;
| 1234567891011121314151617181920212223242526272829 | # coding:utf-8 from bs4 import BeautifulSoupfrom scrapy.linkextractors import LinkExtractorfrom scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpiderfrom itjuzi_dis.items import CompanyItem class ITjuziSpider(RedisCrawlSpider): name = \’itjuzi_dis\’ allowed_domains = [\’itjuzi.com\’] # start_urls = [\’http://www.itjuzi.com/company/157\’] redis_key = \’itjuziCrawler:start_urls\’ rules = [ # 获取每一页的链接 Rule(link_extractor=LinkExtractor(allow=(\’/company?page=d+\’))), # 获取每一个公司的详情 Rule(link_extractor=LinkExtractor(allow=(\’/company/d+\’)), callback=\’parse_item\’) ] def parse_item(self, response): soup = BeautifulSoup(response.body, \’lxml\’) . .省略一些处理代码 . return item |
说明:
class 继承了RedisCrawlSpider 而不是CrawlSpiderstart_urls 改为一个自定义的 itjuziCrawler:start_urls,这里的itjuziCrawler:start_urls 就是作为所有链接存储到 redis 中的 key,scrapy_redis 里也是通过redis的 lpop方法弹出并删除链接的;使用 SQLAlchemy 作为 ORM 工具,当表结构不存在时,自动创建表结构
增加了很多 User-Agent,每一个请求随机使用一个,防止防止网站通过 User-Agent 屏蔽爬虫
配置middlewares.py scrapy_redis redis 链接相关信息
在上面的「目录结构图」中有,Dockerfile和docker-compose.yml
| 1234567 | FROM python:3.5ENV PATH /usr/local/bin:$PATHADD . /codeWORKDIR /codeRUN pip install –r requirements.txtCOPY spiders.py /usr/local/lib/python3.5/site–packages/scrapy_redisCMD /usr/local/bin/scrapy crawl itjuzi_dis |
说明:
python3.5作为基础镜像/usr/local/bin设置环境变量host 和 container 的目录requirements.txtCOPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis,将 host 中的 spiders.py 拷贝到container 中的 scrapy_redis 安装目录中,因为 lpop 获取redis 的值在 python2中是 str 类型,而在 python3中是 bytes 类型,这个问题在 scrapy_reids 中需要修复,spiders.py 第84行需要修改;scrapy crawl itjuzi_dis| 1234567891011121314 | version: \’2\’services: spider: build: . volumes: – .:/code links: – redis depends_on: – redis redis: image: redis ports: – \”6379:6379\” |
说明:
compose 描述语言spider 和 redis 两个 servicespider默认使用当前目录的 Dockerfile 来创建,redis使用 redis:latest 镜像创建,并都映射6379端口启动 container
| 12 | docker–compose up #从 docker-compose.yml 中创建 `container` 们docker–compose scale spider=4 #将 spider 这一个服务扩展到4个,还是同一个 redis |
可以在 Kitematic GUI 工具中观察创建和运行情况;

在没有设置 start_urls 时,4个 container 中的爬虫都处于饥渴的等待状态

现在给 redis 中放入 start_urls:
| 1 | lpush itjuziCrawler:start_urls http://www.itjuzi.com/company |
4个爬虫都动起来了,一直爬到start_urls为空

以上!
上一篇:Python 函数 类 语法糖