我试图覆盖Scrapy的start_requests
方法,但不成功。我已经很好地遍历页面了。问题是现在我必须首先遍历城市而不是页面。
我的代码如下所示:
URL = "https://example.com/%s/?page=%d"
starting_number = 1
number_of_pages = 3
cities = [] # there are array of cities
selected_city = "..."
def start_requests(self):
for city in cities:
selected_city = city
print "####################"
print "##### CITY: " + selected_city + " #####"
for i in range(self.page_number, number_of_pages, +1):
print "##### page: " + str(i) + " #####"
yield scrapy.Request(url=(URL % (selected_city, i)), callback = self.parse)
print "####################"
在控制台中,我看到当爬虫开始工作时,它会打印所有城市和页面,而不仅仅是启动请求。因此,我的抓取工具只解析了第一个城市。它们是异步工作的,而我需要同步。
在我的情况下迭代的正确方法是什么?
感谢您的帮助!
答案 0 :(得分:0)
我的问题是我在其余代码中使用了错误的全局变量selected_city
。
我认为在每次迭代时都会停止执行parse
方法,而不是继续下一次迭代。因此,我在item['city'] = selected_city
方法中设置参数parse
。
现在我只是将参数city
传递给Request
的元参数。
示例代码:
def start_requests(self):
requests = []
for city in cities:
for i in range(self.page_number, number_of_pages, +1):
requests.append(scrapy.Request(url=(URL % (city, i)), callback = self.parse, meta = {'city': city}))
return requests
在parse
方法中,通过执行item['city'] = response.request.meta['city']