如何解决Scrapy回调异步
def parse(self,response):
category_names = []
category_urls = []
for item in response.css("#zg_browseRoot ul li"):
category_url = item.css("a").css(self.CSS_URL).extract()
category_name = item.css("a").css(self.CSS_TEXT).extract()
category_url = [
self.parse_url(category_url,4) for category_url in category_url
]
(category_url,) = category_url
(category_name,) = category_name
category_names.append(category_name)
category_urls.append(category_url)
for c_name,url in zip(category_names,category_urls):
self.c_name = [c_name]
yield scrapy.Request(url,callback=self.parse_categories)
def parse_url(self,url,number):
parse = urlparse(url)
split = parse.path.split("/")[:number]
return f'{self.BASE_URL}{"/".join(split)}'
def parse_categories(self,response):
sub_names = []
sub_urls = []
for item in response.css("#zg_browseRoot ul ul li"):
sub_name = item.css("a").css(self.CSS_TEXT).extract()
sub_url = item.css("a").css(self.CSS_URL).extract()
sub_url = [self.parse_url(sub_url,5) for sub_url in sub_url]
(sub_url,) = sub_url
(sub_name,) = sub_name
sub_names.append(sub_name)
sub_urls.append(sub_url)
for sub_name,url in zip(sub_names,sub_urls):
self.sub_name = [sub_name]
# print("{}: {},{}".format(url,self.sub_name,self.c_name))
yield scrapy.Request(url,callback=self.parse_subcategories)
def parse_subcategories(self,response):
url = self.parse_url(response.request.url,5)
print(f"{self.c_name},{self.sub_name},{url}")
大家好, 我的Scrapy方法有问题。我正在尝试抓取具有类别和子类别的页面。我要在每个已抓取的项目中包括类别和子类别。 问题在于Scrapys回调函数是异步的,并且用名称压缩URL似乎不起作用,因为先处理了for循环,将URL存储在生成器中,而名称却留在后面。有人可以帮我解决这个问题吗?
预先感谢, 丹尼尔。
解决方法
您可以使用cb_kwargs
参数将任意数据与请求一起传递。您可以阅读有关详细信息here。
这是一个简化的示例:
def parse(self,response):
rows = response.xpath('//div[@id="some-element"]')
for row in rows:
request_url = row.xpath('a/@href').get()
category = row.xpath('a/text()').get()
yield Request(
url=request_url,callback=self.parse_category,cb_kwargs={'category': category}
)
def parse_category(self,response,category): # Notice category arg in the func
# Process here
yield item
插入到cb_kwargs
中的数据作为关键字arg传递到回调函数中,因此dict中的键必须与方法定义中的参数名称匹配。 >
Scrapy v1.7中引入了
cb_kwargs
,如果您使用的是旧版本,则应使用meta
参数。您可以here对其进行阅读,请注意用法略有不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。