异步爬虫问题
这个requests 我怎么携带 headercookies等参数loop.run_in_executor(None, requests.get, data)
报错代码1:
loop.run_in_executor(None, requests.get, url, headers=headers, cookies=cookies, verify=False, timeout=5)
报错代码2:
kwargs = {'headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}, 'cookies': {'session_id': '12345'}, 'verify': False, 'timeout': 5}
response = await loop.run_in_executor(None, requests.get, url, **kwargs)
这两个都是网上找的答案,都不行,不知道怎么写了。 你的代码在使用 run_in_executor 方法时,尝试将关键字参数传递给 requests.get 函数。
但是 run_in_executor 只接受位置参数,而不能直接接受关键字参数。
为了解决这个问题,你可以创建一个简单的包装函数,将关键字参数传递给 requests.get,然后将这个包装函数传递给 run_in_executor。
这是一个示例:
import asyncio
import requests
async def main():
async def fetch(url, **kwargs):
loop = asyncio.get_running_loop()
return await loop.run_in_executor(None, requests.get, url, **kwargs)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
cookies = {'session_id': '12345'}
url = 'https://example.com'
response = await fetch(url, headers=headers, cookies=cookies, verify=False, timeout=5)
print(response.text)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
在这个示例中,我们定义了一个名为 fetch 的异步函数,它可以接受关键字参数并在内部将它们传递给 requests.get。
然后我们将 fetch 函数传递给 run_in_executor,这样就可以异步地执行 HTTP 请求并传递我们需要的参数。 isdkz 发表于 2023-4-7 10:13
你的代码在使用 run_in_executor 方法时,尝试将关键字参数传递给 requests.get 函数。
但是 run_in_exe ...
我贴不了图片,不过好像不行哦。和我遇到的问题一样。我的是python3.79 我google类似问题,说是python版本不够,必须大于3.5可我的是3.7的啊。。
问题:unexpected argument
报错代码:
return await loop.run_in_executor(None, requests.get, url, **kwargs)
TypeError: run_in_executor() got an unexpected keyword argument 'headers' 异步你为什么不用aiohttp呢? isdkz 发表于 2023-4-7 10:41
异步你为什么不用aiohttp呢?
一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。{:5_109:} 我不是第一个 发表于 2023-4-7 10:46
一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。
requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人用 isdkz 发表于 2023-4-7 10:49
requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人 ...
requests 是不支持,看视频 好像用线程池可以转换啥的,你上面的代码不加 header cookies等参数应该是可以跑的,但是怕被反扒,想加参数进去,不知道怎么搞 我不是第一个 发表于 2023-4-7 10:54
requests 是不支持,看视频 好像用线程池可以转换啥的,你上面的代码不加 header cookies等参数应该是可 ...
上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已
你看的什么视频? isdkz 发表于 2023-4-7 10:58
上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已
你看的什么视频?
B站的可以发链接吗 bilibili.com拼一下/video/BV1Ke411W71L
应该在10章节左右 isdkz 发表于 2023-4-7 10:58
上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已
你看的什么视频?
上面的代码不是你贴的啊,用的chatgpt ??? 我不是第一个 发表于 2023-4-7 11:14
上面的代码不是你贴的啊,用的chatgpt ???
对呀,我去研究一下,看看用 run_in_executor 怎么实现 isdkz 发表于 2023-4-7 11:17
对呀,我去研究一下,看看用 run_in_executor 怎么实现
好的,搞定记得告诉我啊{:5_109:} 我不是第一个 发表于 2023-4-7 11:19
好的,搞定记得告诉我啊
requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参数
这时候得配合偏函数解决了,以下是示例代码:
import asyncio
import requests
from functools import partial # 注意这里
async def main():
url = 'http://httpbin.org/get'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
cookies = {'session_id': '12345'}
loop = asyncio.get_running_loop()
get = partial(requests.get, headers=headers, cookies=cookies) # 注意这里
response = await loop.run_in_executor(None, get, url) # 注意这里
print(response.json())
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
isdkz 发表于 2023-4-7 11:37
requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参 ...
谢谢了, 可以跑{:5_106:}
页:
[1]