[英]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=999
, http://www.example.com/id=998
, http://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=498
, http://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.