亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

scrapy_redis 和 docker 實(shí)現(xiàn)簡(jiǎn)單分布式爬蟲(chóng)

_DangJin / 3131人閱讀

摘要:簡(jiǎn)介在使用爬取桔子公司信息,用來(lái)進(jìn)行分析,了解創(chuàng)業(yè)公司的一切情況,之前使用寫(xiě)了一個(gè)默認(rèn)線程是的單個(gè)實(shí)例,為了防止被設(shè)置了下載的速度,萬(wàn)多個(gè)公司信息爬了天多才完成,現(xiàn)在想到使用分布式爬蟲(chóng)來(lái)提高效率。

簡(jiǎn)介

在使用 scrapy 爬取 IT桔子公司信息,用來(lái)進(jìn)行分析,了解 IT 創(chuàng)業(yè)公司的一切情況,之前使用 scrapy 寫(xiě)了一個(gè)默認(rèn)線程是10的單個(gè)實(shí)例,為了防止被 ban IP 設(shè)置了下載的速度,3萬(wàn)多個(gè)公司信息爬了1天多才完成,現(xiàn)在想到使用分布式爬蟲(chóng)來(lái)提高效率。

源碼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;

代碼編寫(xiě)

分析頁(yè)面信息:
我需要獲取的是每一個(gè)「公司」的詳情頁(yè)面鏈接 和 分頁(yè)按鈕鏈接;

統(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 = [
        # 獲取每一頁(yè)的鏈接
        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

說(shuō)明:

class 繼承了RedisCrawlSpider 而不是CrawlSpider

start_urls 改為一個(gè)自定義的 itjuziCrawler:start_urls,這里的itjuziCrawler:start_urls 就是作為所有鏈接存儲(chǔ)到 redis 中的 key,scrapy_redis 里也是通過(guò)redislpop方法彈出并刪除鏈接的;

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)站通過(guò) User-Agent 屏蔽爬蟲(chóng)

settings.py

配置middlewares.py scrapy_redis redis 鏈接相關(guān)信息

部署

在上面的「目錄結(jié)構(gòu)圖」中有,Dockerfiledocker-compose.yml

Dockerfile
FROM 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

說(shuō)明:

使用 python3.5作為基礎(chǔ)鏡像

/usr/local/bin設(shè)置環(huán)境變量

映射 hostcontainer 的目錄

安裝 requirements.txt

特別要說(shuō)明的是COPY spiders.py /usr/local/lib/python3.5/site-packages/scrapy_redis,將 host 中的 spiders.py 拷貝到container 中的 scrapy_redis 安裝目錄中,因?yàn)?lpop 獲取redis 的值在 python2中是 str 類(lèi)型,而在 python3中是 bytes 類(lèi)型,這個(gè)問(wèn)題在 scrapy_reids 中需要修復(fù),spiders.py 第84行需要修改;

啟動(dòng)后立即執(zhí)行爬行命令 scrapy crawl itjuzi_dis

docker-compose.yml
version: "2"
services:
  spider:
    build: .
    volumes:
     - .:/code
    links:
     - redis
    depends_on:
     - redis
  redis:
    image: redis
    ports:
    - "6379:6379"

說(shuō)明:

使用第2版本的 compose 描述語(yǔ)言

定義了 spiderredis 兩個(gè) service

spider默認(rèn)使用當(dāng)前目錄的 Dockerfile 來(lái)創(chuàng)建,redis使用 redis:latest 鏡像創(chuàng)建,并都映射6379端口

開(kāi)始部署

啟動(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)行情況;

在沒(méi)有設(shè)置 start_urls 時(shí),4個(gè) container 中的爬蟲(chóng)都處于饑渴的等待狀態(tài)

現(xiàn)在給 redis 中放入 start_urls:

lpush itjuziCrawler:start_urls http://www.itjuzi.com/company

4個(gè)爬蟲(chóng)都動(dòng)起來(lái)了,一直爬到start_urls為空

以上です!ありがとうございました!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/45489.html

Failed to recv the data from server completely (SIZE:0/8, REASON:closed)