Scrapy之"並行"爬蟲

NullSpider發表於2017-11-29

問題反饋

在使用中有任何問題,可以反饋給我,以下聯絡方式跟我交流

  • Author: Leo
  • Wechat: Leo-sunhailin
  • E-mail: 379978424@qq.com

  • 開發環境

    • Win10 x64
    • Python 3.4.4
    • Scrapy 1.4.0(目前最新版本,截至2017-11-29)

題目

  1. 題目或許應該叫: Multiple Spiders in the same process.
  2. 官方文件的解釋就是: 預設情況下Scrapy支援一個爬蟲在多執行緒的情況下進行爬取,但是實際上也支援多個爬蟲執行在每一個執行緒上.(官方也補充了一個internal API,實際上就是Crawl(爬蟲)的核心啟動介面)
  3. 有空的我可以寫寫Scrapy的技巧,如果遇到的話哈哈~有前提的.

示例

  • 網上其實有很多參照官網給的例子跑的commands程式碼,但是多少都一些問題,你不信可以跑一下,很多都是能跑成功但是有報錯。但是就是看著不舒服,所幸自己看著原始碼和官方示例寫了一個。
  • 其實講回上面這點,官方也是很奇葩的,給了怎麼併發爬蟲,不告訴別人怎麼執行,直接只是一個scrapy crawl不帶引數的,實際上這樣寫不規範,但是那樣也能跑,就是會有報錯提示。這時候就要引出自定義命令了。
  • 正確的寫法和不會報錯的寫法請往下看~
  • 建立一個Scrapy的專案. 對!就是一個普通專案,並沒有什麼特別的模板.
# 建立一個Scrapy專案
scrapy startproject multiple_spiders複製程式碼
  • 生成的檔案結構是這樣的:

  • multiple_spiders

    • multiple_spiders
      • commands (一開始沒有的,建立完專案後自行建立)
        • <雙下劃線>init<雙下劃線>.py
        • crawlall.py
      • spiders (核心程式碼)
        • <雙下劃線>init<雙下劃線>.py
        • multiple.py
      • <雙下劃線>init<雙下劃線>.py
      • items.py
      • middlewares.py
      • pipelines.py
      • settings.py
    • scrapy.cfg
  • spiders/multiple.py的程式碼:

# -*- coding: UTF-8 -*-
"""
Created on 2017年11月8日
@author: Leo
"""

import scrapy


# 測試程式碼,功能是把網址的原始碼儲存到txt中
class MySpider1(scrapy.Spider):
    name = "spider-1"
    start_urls = ["<爬取的地址1>"]

    def parse(self, response):
        filename = "./multiple_spiders/test-1.txt"
        with open(filename, 'wb') as f:
            f.write(response.body)


# 測試程式碼,功能是把網址的原始碼儲存到txt中
class MySpider2(scrapy.Spider):
    name = "spider-2"
    start_urls = ["<爬取的地址2>n"]

    def parse(self, response):
        filename = "./multiple_spiders/test-2.txt"
        with open(filename, 'wb') as f:
            f.write(response.body)複製程式碼
  • 建立commands資料夾,以及資料夾下的init.py檔案
    (init.py裡面不用寫東西)

  • 建立crawlall.py<名字可以自定義>

# -*- coding: utf-8 -*-
"""
Created on 2017年11月8日
@author: Leo
"""

from scrapy.commands import ScrapyCommand
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess

from multiple_spiders.spiders.multiple import MySpider1, MySpider2


class Command(ScrapyCommand):
    requires_project = True

    def syntax(self):
        return '[options]'

    def short_desc(self):
        return 'Runs all of the spiders'

    def add_options(self, parser):
        ScrapyCommand.add_options(self, parser)

    def process_options(self, args, opts):
        ScrapyCommand.process_options(self, args, opts)

    def run(self, args, opts):
        settings = get_project_settings()
        one = MySpider1()
        two = MySpider2()
        process = CrawlerProcess(settings)
        process.crawl(one)
        process.crawl(two)
        process.start()複製程式碼
  • settings.py中加一入一個程式碼:
COMMANDS_MODULE = 'multiple_spiders.commands'複製程式碼
  • 最後就可以執行了
scrapy crawlall<名字和你commands資料夾的下的py檔名字對應即可>複製程式碼
  • 至於不想同時啟動兩個爬蟲,或者同時啟動三個,或者有三個爬蟲同時啟動其中2個,過一段時間關閉其中一個再開啟另外一個的這類需求。。動動腦子就好了。

  • 最終還是去參考一下官方文件,畢竟Scrapy的文件還是比較豐富的。但有能力的可以直接去看原始碼,去研究啟動的方式,比看文件容易理解一點。

  • 具體要看哪些模組我大致提一下(CrawlProcess, CrawlerRunner, Command)

相關文章