簡體   English   中英

運行CrawlSpider的多個實例

[英]Running multiple instances of a CrawlSpider

我剛剛開始使用scrapy,我想執行以下操作

Have a list of n domains
i=0
loop for i to n
Use a (mostly) generic CrawlSpider to get all links (a href) of domain[i]
Save results as json lines

為此,Spider需要接收必須爬網的域作為參數。

我已經成功創建了CrawlSpider:

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy.item import Item, Field
from scrapy.crawler import CrawlerProcess

class MyItem(Item):
    #MyItem Fields


class SubsiteSpider(CrawlSpider):
    name = "subsites"
    start_urls = []
    allowed_domains = []
    rules = (Rule(LinkExtractor(), callback='parse_obj', follow=True),)

    def __init__(self, starturl, allowed, *args, **kwargs):
        print(args)
        self.start_urls.append(starturl)
        self.allowed_domains.append(allowed)
        super().__init__(**kwargs)

    def parse_obj(self, response):
        item = MyItem()
        #fill Item Fields
        return item


process = CrawlerProcess({'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'})
process.crawl(SubsiteSpider)
process.start()

如果我使用scrapy crawl subsites -a starturl=http://example.com -a allowed=example.com -o output.jl進行調用,則結果完全符合我的要求,因此這部分已經很好。

我無法做的是創建多個SubsiteSpider實例,每個實例都以不同的域作為參數。

我嘗試過(在SpiderRunner.py中)

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

process = CrawlerProcess(get_project_settings())

process.crawl('subsites', ['https://example.com', 'example.com'])
process.start()

變體:

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

process = CrawlerProcess(get_project_settings())

allowed = ["example.com"]
start = ["https://example.com"]
process.crawl('subsites', start, allowed)
process.start()

但是我想會發生錯誤,因為該參數未正確傳遞給__init__ ,例如TypeError: __init__() missing 1 required positional argument: 'allowed'TypeError: __init__() missing 2 required positional arguments: 'starturl' and 'allowed' (循環尚未實現)

所以,這是我的問題:1)如果我不是通過scrapy shell而是從python代碼中開始爬網,將參數傳遞給init的正確方法是什么? 2)我怎么也可以傳遞-o output.jl參數? (或者,也許使用允許的參數作為文件名?)3)每次運行每個蜘蛛我都很好-這樣做仍然被認為是最佳/好習慣嗎? 如果有的話,您能否指向一個更廣泛的教程,內容涉及“使用不同的參數(=目標域),可選地並行運行一次又一次地運行同一蜘蛛”?

提前非常感謝大家! 如果有任何拼寫錯誤(不是英語為母語的人),或者問題/細節不夠精確,請告訴我如何糾正。

您的代碼存在一些問題:

  1. start_urlsallowed_domains是您在__init__()修改的類屬性,使它們在您的類的所有實例之間共享。
    相反,您應該使它們成為實例屬性:

     class SubsiteSpider(CrawlSpider): name = "subsites" rules = (Rule(LinkExtractor(), callback='parse_obj', follow=True),) def __init__(self, starturl, allowed, *args, **kwargs): self.start_urls = [starturl] self.allowed_domains = [allowed] super().__init__(*args, **kwargs) 
  2. 最后三行不應與Spider類一起放在文件中,因為您可能不想在每次導入Spider時都運行該代碼。

  3. 您對CrawlProcess.crawl()調用略有錯誤。 您可以像這樣使用它,以與將它們傳遞給蜘蛛類的__init__()相同的方式傳遞參數。

     process = CrawlerProcess(get_project_settings()) process.crawl('subsites', 'https://example.com', 'example.com') process.start() 

我還如何傳遞-o output.jl參數? (或者,也許使用允許的參數作為文件名?

您可以使用custom_settings達到相同的效果,為每個實例指定不同的FEED_URI設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM