覆盖start_requests是Scrapy不同步

时间:2016-01-16 06:08:43

标签: scrapy scrapy-spider

我试图覆盖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 "####################"

在控制台中,我看到当爬虫开始工作时,它会打印所有城市和页面,而不仅仅是启动请求。因此,我的抓取工具只解析了第一个城市。它们是异步工作的,而我需要同步。

在我的情况下迭代的正确方法是什么?

感谢您的帮助!

1 个答案:

答案 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']

进行检索