我们可以在scrapy shell之外运行scrapy代码吗?

har*_*han 2 python scrapy web-scraping

我正在尝试使用 Scrapy 构建一个爬虫。Scrapy 的官方文档或博客中的每个教程,我都看到有人在 .py 代码中创建一个类并通过 scrapy shell 执行它。

在他们的主页上,给出了以下示例

import scrapy

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        for title in response.css('h2.entry-title'):
            yield {'title': title.css('a ::text').extract_first()}

        for next_page in response.css('div.prev-post > a'):
            yield response.follow(next_page, self.parse)
Run Code Online (Sandbox Code Playgroud)

然后代码运行使用

scrapy runspider myspider.py
Run Code Online (Sandbox Code Playgroud)

我无法找到一种可以用类似的方式执行的方式来编写相同的代码

python myspider.py
Run Code Online (Sandbox Code Playgroud)

我还查看了他们网站的请求和响应部分,以了解如何在 shell 中处理请求和响应,但尝试在 python shell 中运行这些代码

( >> python myspider.py)

没有显示任何东西。任何有关如何转换代码以使其用完scrapy shell 的指导,或指向详细说明这一点的任何文档的指针,将不胜感激。

编辑 Downvoters 请不要过度利用您的匿名性。如果您有一个有效的反对意见,请在您反对后在评论中提出您的观点。

Ami*_*der 5

您可以使用 CrawlerProcess 在 Python 主脚本中运行您的蜘蛛,并使用 python myspider.py

例如:

import scrapy
from scrapy.crawler import CrawlerProcess


class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        for title in response.css('h2.entry-title'):
            yield {'title': title.css('a ::text').extract_first()}

        for next_page in response.css('div.prev-post > a'):
            yield response.follow(next_page, self.parse)


if __name__ == '__main__':
    class MySpider(scrapy.Spider):
        # Your spider definition
        ...


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

    process.crawl(BlogSpider)
    process.start()
Run Code Online (Sandbox Code Playgroud)

有用的链接 https://doc.scrapy.org/en/latest/topics/practices.html