首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多个CrawlSpider实例

运行多个CrawlSpider实例
EN

Stack Overflow用户
提问于 2018-02-26 06:08:54
回答 1查看 678关注 0票数 1

我刚刚开始使用刮伤,我想做以下几件事

代码语言:javascript
复制
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

要做到这一点,蜘蛛需要接收它必须作为参数爬行的域。

我已经成功地创建了CrawlSpider:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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()

变式:

代码语言:javascript
复制
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)我不介意这样一个接一个地运行每个蜘蛛--这样做仍然被认为是最好的/良好的实践吗?如果有这样的教程,你能指出一个关于“使用不同参数(=目标域)一次又一次运行同一蜘蛛”的更广泛的教程吗?

非常感谢大家提前!如果有任何拼写错误(不是以英语为母语的人),或者问题/细节不够精确,请告诉我如何改正。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-26 13:53:03

您的代码有几个问题:

  1. start_urlsallowed_domains是您在__init__()中修改的类属性,使它们在类的所有实例中共享。 您应该做的是让它们具有实例属性: 类SubsiteSpider(CrawlSpider):name = "subsites“rules =(LinkExtractor(),回调=‘parse’,follow=True),) def __init__(self,starturl,rules,*args,**kwargs):self.start_urls = starturl self.allowed_domains =self super().__init__(*args,**kwargs)
  2. 这最后3行不应该在文件中与蜘蛛类一起使用,因为您可能不希望每次导入蜘蛛时都运行该代码。
  3. 您对CrawlProcess.crawl()的调用略有错误。您可以像这样使用它,以传递参数的方式将它们传递给蜘蛛类‘__init__()’。 process = CrawlerProcess(get_project_settings()) process.crawl(‘subsite’,'https://example.com','example.com') process.start()

我还如何传递-o output.jl参数?(或者使用允许的参数作为文件名?

您可以使用custom_settings实现相同的效果,为每个实例提供不同的FEED_URI设置。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48982416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档