摘要:簡(jiǎn)介在使用爬取桔子公司信息,用來進(jìn)行分析,了解創(chuàng)業(yè)公司的一切情況,之前使用寫了一個(gè)默認(rèn)線程是的單個(gè)實(shí)例,為了防止被設(shè)置了下載的速度,萬多個(gè)公司信息爬了天多才完成,現(xiàn)在想到使用分布式爬蟲來提高效率。
簡(jiǎn)介
在使用 scrapy 爬取 IT桔子公司信息,用來進(jìn)行分析,了解 IT 創(chuàng)業(yè)公司的一切情況,之前使用 scrapy 寫了一個(gè)默認(rèn)線程是10的單個(gè)實(shí)例,為了防止被 ban IP 設(shè)置了下載的速度,3萬多個(gè)公司信息爬了1天多才完成,現(xiàn)在想到使用分布式爬蟲來提高效率。
源碼githup
技術(shù)工具:Python3.5 scrapy scrapy_redis redis docker1.12 docker-compose Kitematic mysql SQLAlchemy 準(zhǔn)備工作安裝 Docker 點(diǎn)這里去了解、安裝;
pip install scrapy scrapy_redis;
代碼編寫分析頁面信息:
我需要獲取的是每一個(gè)「公司」的詳情頁面鏈接 和 分頁按鈕鏈接;
統(tǒng)一存儲(chǔ)獲取到的鏈接,提供給多個(gè) spider 爬取;
多個(gè) spider 共享一個(gè) redis list 中的鏈接;
目錄結(jié)構(gòu)圖 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+"))), # 獲取每一個(gè)公司的詳情 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 改為一個(gè)自定義的 itjuziCrawler:start_urls,這里的itjuziCrawler:start_urls 就是作為所有鏈接存儲(chǔ)到 redis 中的 key,scrapy_redis 里也是通過redis的 lpop方法彈出并刪除鏈接的;
db_util.py使用 SQLAlchemy 作為 ORM 工具,當(dāng)表結(jié)構(gòu)不存在時(shí),自動(dòng)創(chuàng)建表結(jié)構(gòu)
middlewares.py增加了很多 User-Agent,每一個(gè)請(qǐng)求隨機(jī)使用一個(gè),防止防止網(wǎng)站通過 User-Agent 屏蔽爬蟲
settings.py配置middlewares.py scrapy_redis redis 鏈接相關(guān)信息
部署在上面的「目錄結(jié)構(gòu)圖」中有,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作為基礎(chǔ)鏡像
將/usr/local/bin設(shè)置環(huán)境變量
映射 host 和 container 的目錄
安裝 requirements.txt
特別要說明的是COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis,將 host 中的 spiders.py 拷貝到container 中的 scrapy_redis 安裝目錄中,因?yàn)?lpop 獲取redis 的值在 python2中是 str 類型,而在 python3中是 bytes 類型,這個(gè)問題在 scrapy_reids 中需要修復(fù),spiders.py 第84行需要修改;
啟動(dòng)后立即執(zhí)行爬行命令 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 兩個(gè) service
spider默認(rèn)使用當(dāng)前目錄的 Dockerfile 來創(chuàng)建,redis使用 redis:latest 鏡像創(chuàng)建,并都映射6379端口
開始部署啟動(dòng) container
docker-compose up #從 docker-compose.yml 中創(chuàng)建 `container` 們 docker-compose scale spider=4 #將 spider 這一個(gè)服務(wù)擴(kuò)展到4個(gè),還是同一個(gè) redis
可以在 Kitematic GUI 工具中觀察創(chuàng)建和運(yùn)行情況;
在沒有設(shè)置 start_urls 時(shí),4個(gè) container 中的爬蟲都處于饑渴的等待狀態(tài)
現(xiàn)在給 redis 中放入 start_urls:
lpush itjuziCrawler:start_urls http://www.itjuzi.com/company
4個(gè)爬蟲都動(dòng)起來了,一直爬到start_urls為空
以上です!ありがとうございました!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/26671.html
摘要:簡(jiǎn)介在使用爬取桔子公司信息,用來進(jìn)行分析,了解創(chuàng)業(yè)公司的一切情況,之前使用寫了一個(gè)默認(rèn)線程是的單個(gè)實(shí)例,為了防止被設(shè)置了下載的速度,萬多個(gè)公司信息爬了天多才完成,現(xiàn)在想到使用分布式爬蟲來提高效率。 簡(jiǎn)介 在使用 scrapy 爬取 IT桔子公司信息,用來進(jìn)行分析,了解 IT 創(chuàng)業(yè)公司的一切情況,之前使用 scrapy 寫了一個(gè)默認(rèn)線程是10的單個(gè)實(shí)例,為了防止被 ban IP 設(shè)置了下...
摘要:上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)爬蟲框架的安裝下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)部署相關(guān)庫的安裝的安裝是一個(gè)中支持渲染的工具,本節(jié)來介紹一下它的安裝方式。另外一個(gè)是的庫的安裝,安裝之后即可在中使用服務(wù)。 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---10、爬蟲框架的安裝:PySpider、Scrapy下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---12、部署相關(guān)庫的安裝:Docker、Scrapyd Scrap...
摘要:前言在公司一部分業(yè)務(wù)是爬蟲相關(guān)了,有涉及到登錄,驗(yàn)證碼,也有國外的大社交網(wǎng)站。雖然是,但是在爬取大量網(wǎng)站可能需要用分布式的爬蟲,當(dāng)然也有操作流程圖指定一個(gè)起始后,就可以根據(jù)以上原理圖進(jìn)行工作了。 前言 在公司一部分業(yè)務(wù)是爬蟲相關(guān)了,有涉及到登錄,驗(yàn)證碼,也有國外的4大社交網(wǎng)站。所以記錄下 scrapy 是什么 scrapy 是一個(gè)異步爬蟲框架,使用它,可以屏蔽很多復(fù)雜的底層設(shè)計(jì),只需要...
摘要:布隆去重的優(yōu)點(diǎn)和缺點(diǎn)優(yōu)點(diǎn)相比于其它的數(shù)據(jù)結(jié)構(gòu),布隆過濾器在空間和時(shí)間方面都有巨大的優(yōu)勢(shì)。下載布隆過濾器文件,將其拷貝至包中。修改其函數(shù)按照分布式爬蟲部署步驟,繼續(xù)進(jìn)行即可使用布隆去重策略 scrapy-redis的布隆去重 - 為什么要使用布隆去重? scrapy自帶去重機(jī)制,即將所需要爬取的網(wǎng)頁放在set中來達(dá)到去重的目的,但是在實(shí)際工作中,我們需要更新數(shù)據(jù)的時(shí)候往往不需要爬取已經(jīng)爬...
閱讀 6179·2021-11-22 15:32
閱讀 813·2021-11-11 16:54
閱讀 3157·2021-10-13 09:40
閱讀 2162·2021-09-03 10:35
閱讀 1824·2021-08-09 13:47
閱讀 1865·2019-08-30 15:55
閱讀 1933·2019-08-30 15:43
閱讀 2455·2019-08-29 17:06