我最近开始使用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
答案 0 :(得分:0)
如果我理解正确,那么这里的问题是因为会话信息存储在有状态的服务器中。对吧?
一种处理此问题的方法是为每个状态建立一个会话,并通过cookiejar对其进行管理。例如:
new
有关cookiejars
的更多信息。
是的,scrapy中的请求被安排为异步运行。那就是我们为什么要为其提供回调函数的原因。