繁体   English   中英

使用scrapy刮取许多页面

[英]Scraping many pages using 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()函数中请求了一个页面。

但是, 这里给出的示例就可以了。 我要去哪里错了?

请求的第一页是“ 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为http://www.example.com/id=999的响应调用parse时,您正在生成http://www.example.com/id=499请求, http://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=-1 : http://www.example.com/id=-2 ... http://www.example.com/id=-500

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

您可以通过测试self.page_number >= 0来停止循环


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

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

请参阅start_requests文档

这样的事情会起作用:

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**

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM