如何使Scrap请求同步

时间:2019-03-01 13:21:44

标签: python-3.x loops request scrapy synchronous

我最近开始使用Scrapy和Python,所以请多多包涵。 我从这里基于我的代码 tutorial。 我需要从website开始,从不同国家(巴西)的所有城市中获取一些信息。 下拉选项是通过AJAX请求动态生成的。因此,首先我获得了所有的州和州,然后我请求从每个州获得城市。

我了解到,如果在循环内使用return,如代码中所示,它将完成我的功能,问题是,如果我使用YIELD,则请求将不遵循任何顺序(可能是因为请求是异步的?我也知道原因),即它向状态错误的城市发出请求。因此,我收到了错误的回复。 顺便说一句,尽管使用return可以完成功能,但可以发出正确的请求。

def parse(self, response):
        years = response.xpath(...).getall()
        states = response.xpath(...).getall()`

        # Start from the second element since the first one is '-- Select --'
        for year in years[1:]:
            for state in states[1:]:
                print (year)
                print (state)        
                # I need this request to get all cities from the current state, since it's generated with an AJAX REQUEST
                request = { ...,
                  callback = self.parse_city
                return request

    def parse_city(self, response):
        keys = response.xpath(...).getall()
        values = response.xpath(...).getall()

        # Build dictionary with the key (city IBGE code) and value (city name)
        cities = dict(zip(keys[1:], values[1:]))

        for code, city in cities.items():
            request = ...,
              callback = self.parse_result
            return request

    def parse_result(self, response):
        yield {
           #The information that I want
        }

我的请求是在循环内创建的,我希望发生的是:   首先:打印年份和状态,然后提出要求。   第二:回调将抓住所有城市并提出要求     城市,在那年的那个州。   第三:parse_result将获取我需要的信息。 相反,发生的事情是它会打印所有年份和状态,这意味着它不会同步执行

如何使它同步?我如何确保我的请求将遵循数组的正确顺序?

非常感谢

要清楚一点:

for each year   
    select year   
    for each state
        select state
        wait for cities options to load
        for each city
            get the information

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么这里的问题是因为会话信息存储在有状态的服务器中。对吧?

一种处理此问题的方法是为每个状态建立一个会话,并通过cookiejar对其进行管理。例如:

new

有关cookiejars的更多信息。

是的,scrapy中的请求被安排为异步运行。那就是我们为什么要为其提供回调函数的原因。