使用scrapy刮擦许多页面

时间:2015-01-05 12:49:26

标签: python web-scraping scrapy

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

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的例子没问题。我哪里错了?

1 个答案:

答案 0 :(得分:4)

请求的第一页是“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是一个蜘蛛属性,所以当你递减它的值时,你会在第一个self.page_number == 500之后parse()

因此,当Scrapy针对parse的回复调用http://www.example.com/id=999时,您就会生成http://www.example.com/id=499http://www.example.com/id=498http://www.example.com/id=497 ... {{ 1}}

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

对于每个回复,您将生成500个请求。

您可以通过测试http://www.example.com/id=-500

来停止循环

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

不需要多个线程,Scrapy异步工作,您可以在重写的self.page_number >= 0方法中排队所有请求(而不是请求1个页面,然后在start_requests()中返回Request个问题} 方法)。 Scrapy将收集足够的请求来填充它的管道,解析页面,选择新的发送请求等等。

请参阅start_requests documentation

这样的事情会起作用:

parse