摘要:简介在使用爬取桔子公司信息,用来进行分析,了解创业公司的一切情况,之前使用写了一个默认线程是的单个实例,为了防止被设置了下载的速度,万多个公司信息爬了天多才完成,现在想到使用分布式爬虫来提高效率。
简介
在使用 scrapy 爬取 IT桔子公司信息,用来进行分析,了解 IT 创业公司的一切情况,之前使用 scrapy 写了一个默认线程是10的单个实例,为了防止被 ban IP 设置了下载的速度,3万多个公司信息爬了1天多才完成,现在想到使用分布式爬虫来提高效率。
源码githup
技术工具:Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemy 准备工作安装 Docker 点这里去了解、安装;
pip install scrapy scrapy_redis;
代码编写分析页面信息:
我需要获取的是每一个「公司」的详情页面链接 和 分页按钮链接;
统一存储获取到的链接,提供给多个 spider 爬取;
多个 spider 共享一个 redis list 中的链接;
目录结构图 juzi_spider.py# coding:utf-8 from bs4 import BeautifulSoup from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from 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 而不是CrawlSpider
start_urls 改为一个自定义的 itjuziCrawler:start_urls,这里的itjuziCrawler:start_urls 就是作为所有链接存储到 redis 中的 key,scrapy_redis 里也是通过redis的 lpop方法弹出并删除链接的;
db_util.py使用 SQLAlchemy 作为 ORM 工具,当表结构不存在时,自动创建表结构
middlewares.py增加了很多 User-Agent,每一个请求随机使用一个,防止防止网站通过 User-Agent 屏蔽爬虫
settings.py配置middlewares.py scrapy_redis redis 链接相关信息
部署在上面的「目录结构图」中有,Dockerfile和docker-compose.yml
DockerfileFROM python:3.5 ENV PATH /usr/local/bin:$PATH ADD . /code WORKDIR /code RUN pip install -r requirements.txt COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis CMD /usr/local/bin/scrapy crawl itjuzi_dis
说明:
使用 python3.5作为基础镜像
将/usr/local/bin设置环境变量
映射 host 和 container 的目录
安装 requirements.txt
特别要说明的是COPY 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
docker-compose.ymlversion: "2" services: spider: build: . volumes: - .:/code links: - redis depends_on: - redis redis: image: redis ports: - "6379:6379"
说明:
使用第2版本的 compose 描述语言
定义了 spider 和 redis 两个 service
spider默认使用当前目录的 Dockerfile 来创建,redis使用 redis:latest 镜像创建,并都映射6379端口
开始部署启动 container
docker-compose up #从 docker-compose.yml 中创建 `container` 们 docker-compose scale spider=4 #将 spider 这一个服务扩展到4个,还是同一个 redis
可以在 Kitematic GUI 工具中观察创建和运行情况;
在没有设置 start_urls 时,4个 container 中的爬虫都处于饥渴的等待状态
现在给 redis 中放入 start_urls:
lpush itjuziCrawler:start_urls http://www.itjuzi.com/company
4个爬虫都动起来了,一直爬到start_urls为空
以上です!ありがとうございました!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/26671.html
摘要:简介在使用爬取桔子公司信息,用来进行分析,了解创业公司的一切情况,之前使用写了一个默认线程是的单个实例,为了防止被设置了下载的速度,万多个公司信息爬了天多才完成,现在想到使用分布式爬虫来提高效率。 简介 在使用 scrapy 爬取 IT桔子公司信息,用来进行分析,了解 IT 创业公司的一切情况,之前使用 scrapy 写了一个默认线程是10的单个实例,为了防止被 ban IP 设置了下...
摘要:上一篇文章网络爬虫实战爬虫框架的安装下一篇文章网络爬虫实战部署相关库的安装的安装是一个中支持渲染的工具,本节来介绍一下它的安装方式。另外一个是的库的安装,安装之后即可在中使用服务。 上一篇文章:Python3网络爬虫实战---10、爬虫框架的安装:PySpider、Scrapy下一篇文章:Python3网络爬虫实战---12、部署相关库的安装:Docker、Scrapyd Scrap...
摘要:前言在公司一部分业务是爬虫相关了,有涉及到登录,验证码,也有国外的大社交网站。虽然是,但是在爬取大量网站可能需要用分布式的爬虫,当然也有操作流程图指定一个起始后,就可以根据以上原理图进行工作了。 前言 在公司一部分业务是爬虫相关了,有涉及到登录,验证码,也有国外的4大社交网站。所以记录下 scrapy 是什么 scrapy 是一个异步爬虫框架,使用它,可以屏蔽很多复杂的底层设计,只需要...
摘要:布隆去重的优点和缺点优点相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。下载布隆过滤器文件,将其拷贝至包中。修改其函数按照分布式爬虫部署步骤,继续进行即可使用布隆去重策略 scrapy-redis的布隆去重 - 为什么要使用布隆去重? scrapy自带去重机制,即将所需要爬取的网页放在set中来达到去重的目的,但是在实际工作中,我们需要更新数据的时候往往不需要爬取已经爬...
阅读 6137·2021-11-22 15:32
阅读 792·2021-11-11 16:54
阅读 3133·2021-10-13 09:40
阅读 2120·2021-09-03 10:35
阅读 1809·2021-08-09 13:47
阅读 1844·2019-08-30 15:55
阅读 1922·2019-08-30 15:43
阅读 2413·2019-08-29 17:06