从脚本中scrapy运行蜘蛛

问题描述 投票:0回答:5

我想从脚本运行我的蜘蛛而不是

scrap crawl

我找到了这个页面

http://doc.scrapy.org/en/latest/topics/practices.html

但实际上它并没有说明将该脚本放在哪里。

请问有什么帮助吗?

python python-2.7 scrapy
5个回答
44
投票

简单明了:)

只需查看官方文档。我会做一点改变,这样你就可以控制蜘蛛仅在你执行

python myscript.py
时运行,而不是每次你从它导入时运行。只需添加一个
if __name__ == "__main__"

import scrapy
from scrapy.crawler import CrawlerProcess

class MySpider(scrapy.Spider):
    # Your spider definition
    pass

if __name__ == "__main__":
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
    })

    process.crawl(MySpider)
    process.start() # the script will block here until the crawling is finished

现在将文件另存为

myscript.py
并运行 'python myscript.py`。

享受吧!


6
投票

幸运的是,scrapy 源代码是开放的,因此您可以按照 crawl 命令 的工作方式并在代码中执行相同的操作:

...
crawler = self.crawler_process.create_crawler()
spider = crawler.spiders.create(spname, **opts.spargs)
crawler.crawl(spider)
self.crawler_process.start()

6
投票

你为什么不这样做呢?

from scrapy import cmdline

cmdline.execute("scrapy crawl myspider".split())

将该脚本放在与您放置

scrapy.cfg

相同的路径中

3
投票

您可以创建一个普通的Python脚本,然后使用Scrapy的命令行选项

runspider
,它允许您运行蜘蛛而无需创建项目。

例如,您可以创建一个文件

stackoverflow_spider.py
,如下所示:

import scrapy

class QuestionItem(scrapy.item.Item):
    idx = scrapy.item.Field()
    title = scrapy.item.Field()

class StackoverflowSpider(scrapy.spider.Spider):
    name = 'SO'
    start_urls = ['http://stackoverflow.com']
    def parse(self, response):
        sel = scrapy.selector.Selector(response)
        questions = sel.css('#question-mini-list .question-summary')
        for i, elem in enumerate(questions):
            l = scrapy.contrib.loader.ItemLoader(QuestionItem(), elem)
            l.add_value('idx', i)
            l.add_xpath('title', ".//h3/a/text()")
            yield l.load_item()

然后,如果你已经正确安装了 scrapy,你可以使用以下命令运行它:

scrapy runspider stackoverflow_spider.py -t json -o questions-items.json

0
投票

基于上面 @AlmogCohen 的回复:

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from spider_project.spiders.spider import MySpider

def run_spider():
    process = CrawlerProcess(get_project_settings())

    # Run the spider programmatically
    process.crawl(MySpider)
    process.start()

if __name__ == "__main__":
    run_spider()  # Example usage

这里的“spider_project”是您的文件夹,其中包含文件夹“spiders”,其中包含您的蜘蛛。 “MySpider”是

scrapy.Spider
的子类。

如果您的蜘蛛采用命令行参数,您可以在

run_spider
的函数定义中声明它们,并在函数调用期间传递它们。

这非常有用,例如,当从 FastAPI 中的 Rest API 端点调用蜘蛛时。

© www.soinside.com 2019 - 2024. All rights reserved.