使用 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=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 调用 parse
以响应 http://www.example.com/id=999
时,您正在生成对 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=-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**
我正在尝试使用 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=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 调用 parse
以响应 http://www.example.com/id=999
时,您正在生成对 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=-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**