python - 在scrapy中调用几个回调函数
问题描述
我正在使用scrapy,但有几个问题:
第一个问题:我把 start_requests 放在一个循环中,但函数不是从每次迭代开始的
第二个问题:我需要调用与循环给出的 start_urls 相关的不同回调,但我无法为回调提供动态名称。我想把 callback=parse_i 和我来自上面的循环。
liste [[liste1],[liste2],[liste3]]
for i in range (0, 2):
start_urls = liste[i]
def start_requests(self):
#print(self.start_urls)
for u in self.start_urls:
try:
req = requests.get(u)
except requests.exceptions.ConnectionError:
print("Connection refused")
if req.status_code != 200:
print("Request failed, status code is :", req.status_code)
continue
yield scrapy.Request(u, callback=self.parse, meta={'dont_merge_cookies': True}, dont_filter=False)
谢谢
解决方案
我需要调用与
start_urls
循环给定的相关的不同回调,但我无法为回调提供动态名称。我想把callback=parse_i
和i
来自上面的循环。
回调属性只需要是一个可调用的,所以你可以getattr
像往常一样使用:
my_callback = getattr(self, 'parse_{}'.format(i))
yield Request(u, callback=my_callback)
另外,虽然您没有问这个问题,但从内部进行 URL 调用是非常不寻常的,start_requests
因为 (a) 这就是为什么人们会使用 Scrapy 开始处理所有非 200 的东西,并且 (b) 这样做withrequests
不会尊重任何一个节流、代理、用户代理、恢复或其他希望影响抓取工作的旋钮。
推荐阅读
- c# - Umbraco 安装页面未加载,重定向到自身
- python - Pandas:如何包含多个数据透视表的所有列和所有索引
- html - Rails 6.1 将 submit_tag 链接到 form_with
- python - 为什么我的请求装饰器总是对我的 python webscraper 说“太多调用”?
- c# - 如何在 API 控制器中抑制和忽略 500 个代码
- javascript - 如何更改哪个按钮具有在
- mysql - phpmyadmin 上的 Sql 更新,具有 count 和 group by 语句
- python - 基于它们在python中的合并顺序的层次聚类标签
- awk - 使用 bash 过滤 gzip 文件
- function - 如何在每个时间步重新初始化 Fortran 函数