国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

scrapy_redis 和 docker 實現簡單分布式爬蟲

_DangJin / 3053人閱讀

摘要:簡介在使用爬取桔子公司信息,用來進行分析,了解創業公司的一切情況,之前使用寫了一個默認線程是的單個實例,為了防止被設置了下載的速度,萬多個公司信息爬了天多才完成,現在想到使用分布式爬蟲來提高效率。

簡介

在使用 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 里也是通過redislpop方法彈出并刪除鏈接的;

db_util.py

使用 SQLAlchemy 作為 ORM 工具,當表結構不存在時,自動創建表結構

middlewares.py

增加了很多 User-Agent,每一個請求隨機使用一個,防止防止網站通過 User-Agent 屏蔽爬蟲

settings.py

配置middlewares.py scrapy_redis redis 鏈接相關信息

部署

在上面的「目錄結構圖」中有,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

說明:

使用 python3.5作為基礎鏡像

/usr/local/bin設置環境變量

映射 hostcontainer 的目錄

安裝 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.yml
version: "2"
services:
  spider:
    build: .
    volumes:
     - .:/code
    links:
     - redis
    depends_on:
     - redis
  redis:
    image: redis
    ports:
    - "6379:6379"

說明:

使用第2版本的 compose 描述語言

定義了 spiderredis 兩個 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為空

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45489.html

相關文章

  • scrapy_redis docker 實現簡單布式爬蟲

    摘要:簡介在使用爬取桔子公司信息,用來進行分析,了解創業公司的一切情況,之前使用寫了一個默認線程是的單個實例,為了防止被設置了下載的速度,萬多個公司信息爬了天多才完成,現在想到使用分布式爬蟲來提高效率。 簡介 在使用 scrapy 爬取 IT桔子公司信息,用來進行分析,了解 IT 創業公司的一切情況,之前使用 scrapy 寫了一個默認線程是10的單個實例,為了防止被 ban IP 設置了下...

    shaonbean 評論0 收藏0
  • Python3網絡爬蟲實戰---11、爬蟲框架的安裝:ScrapySplash、ScrapyRedi

    摘要:上一篇文章網絡爬蟲實戰爬蟲框架的安裝下一篇文章網絡爬蟲實戰部署相關庫的安裝的安裝是一個中支持渲染的工具,本節來介紹一下它的安裝方式。另外一個是的庫的安裝,安裝之后即可在中使用服務。 上一篇文章:Python3網絡爬蟲實戰---10、爬蟲框架的安裝:PySpider、Scrapy下一篇文章:Python3網絡爬蟲實戰---12、部署相關庫的安裝:Docker、Scrapyd Scrap...

    harryhappy 評論0 收藏0
  • scrapy使用心得

    摘要:前言在公司一部分業務是爬蟲相關了,有涉及到登錄,驗證碼,也有國外的大社交網站。雖然是,但是在爬取大量網站可能需要用分布式的爬蟲,當然也有操作流程圖指定一個起始后,就可以根據以上原理圖進行工作了。 前言 在公司一部分業務是爬蟲相關了,有涉及到登錄,驗證碼,也有國外的4大社交網站。所以記錄下 scrapy 是什么 scrapy 是一個異步爬蟲框架,使用它,可以屏蔽很多復雜的底層設計,只需要...

    sourcenode 評論0 收藏0
  • scrapy-redis的布隆去重

    摘要:布隆去重的優點和缺點優點相比于其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優勢。下載布隆過濾器文件,將其拷貝至包中。修改其函數按照分布式爬蟲部署步驟,繼續進行即可使用布隆去重策略 scrapy-redis的布隆去重 - 為什么要使用布隆去重? scrapy自帶去重機制,即將所需要爬取的網頁放在set中來達到去重的目的,但是在實際工作中,我們需要更新數據的時候往往不需要爬取已經爬...

    jaysun 評論0 收藏0

發表評論

0條評論

_DangJin

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<