使用 scrapy 抓取许多页面

Scraping many pages using scrapy

我正在尝试使用 scrapy 抓取多个网页。 link 的页面如下:

http://www.example.com/id=some-number

在下一页末尾的数字减少 1

所以我正在尝试构建一个蜘蛛,它可以导航到其他页面并抓取它们。我的代码如下:

import scrapy
import requests
from scrapy.http import Request

URL = "http://www.example.com/id=%d"
starting_number = 1000
number_of_pages = 500
class FinalSpider(scrapy.Spider):
    name = "final"
    allowed_domains = ['example.com']
    start_urls = [URL % starting_number]

    def start_request(self):
        for i in range (starting_number, number_of_pages, -1):
            yield Request(url = URL % i, callback = self.parse)

    def parse(self, response):
        **parsing data from the webpage**

这进入了一个无限循环,在打印页码时我得到的是负数。我认为这是因为我在我的 parse() 函数中请求一个页面。

但是 here 给出的示例可以正常工作。我哪里错了?

请求的第一页是“http://www.example.com/id=1000”(starting_number)

它的响应通过 parse()for i in range (0, 500): 您正在请求 http://www.example.com/id=999http://www.example.com/id=998http://www.example.com/id=997...http://www.example.com/id=500

self.page_number 是一个蜘蛛属性,所以当你递减它的值时,你在第一个 parse().

之后有 self.page_number == 500

因此,当 Scrapy 调用 parse 以响应 http://www.example.com/id=999 时,您正在生成对 http://www.example.com/id=499http://www.example.com/id=498http://www.example.com/id=497 的请求... http://www.example.com/id=0

你猜第三次会发生什么:http://www.example.com/id=-1, http://www.example.com/id=-2...http://www.example.com/id=-500

对于每个响应,您将生成 500 个请求。

您可以通过测试 self.page_number >= 0

来停止循环

在评论中的 OP 问题后编辑:

无需多线程,Scrapy 异步工作,您可以将所有请求放入重写的 start_requests() 方法中(而不是请求 1 个页面,然后在 parse 方法)。 Scrapy 将接受足够的请求来填充它的管道、解析页面、选择要发送的新请求等等。

参见 start_requests documentation

像这样的东西会起作用:

class FinalSpider(scrapy.Spider):
    name = "final"
    allowed_domains = ['example.com']
    start_urls = [URL % starting_number]
    def __init__(self):
        self.page_number = starting_number

    def start_requests(self):
        # generate page IDs from 1000 down to 501
        for i in range (self.page_number, number_of_pages, -1):
            yield Request(url = URL % i, callback=self.parse)

    def parse(self, response):
        **parsing data from the webpage**