鱼C论坛

 找回密码
 立即注册
查看: 2614|回复: 13

[已解决]异步爬虫问题

[复制链接]
发表于 2023-4-7 09:55:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个requests 我怎么携带 header  cookies等参数
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)

这两个都是网上找的答案,都不行,不知道怎么写了。
最佳答案
2023-4-7 11:37:37
我不是第一个 发表于 2023-4-7 11:19
好的,搞定记得告诉我啊


requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参数

这时候得配合偏函数解决了,以下是示例代码:

  1. import asyncio
  2. import requests
  3. from functools import partial                                      # 注意这里


  4. async def main():
  5.     url = 'http://httpbin.org/get'
  6.     headers = {
  7.         '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'
  8.     }
  9.     cookies = {'session_id': '12345'}
  10.     loop = asyncio.get_running_loop()
  11.     get = partial(requests.get, headers=headers, cookies=cookies)                                     # 注意这里
  12.     response = await loop.run_in_executor(None, get, url)                                                 # 注意这里
  13.     print(response.json())

  14. loop = asyncio.get_event_loop()
  15. loop.run_until_complete(main())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-7 10:13:56 | 显示全部楼层
你的代码在使用 run_in_executor 方法时,尝试将关键字参数传递给 requests.get 函数。

但是 run_in_executor 只接受位置参数,而不能直接接受关键字参数。

为了解决这个问题,你可以创建一个简单的包装函数,将关键字参数传递给 requests.get,然后将这个包装函数传递给 run_in_executor。

这是一个示例:

  1. import asyncio
  2. import requests

  3. async def main():
  4.     async def fetch(url, **kwargs):
  5.         loop = asyncio.get_running_loop()
  6.         return await loop.run_in_executor(None, requests.get, url, **kwargs)

  7.     headers = {
  8.         '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'
  9.     }
  10.     cookies = {'session_id': '12345'}
  11.     url = 'https://example.com'
  12.    
  13.     response = await fetch(url, headers=headers, cookies=cookies, verify=False, timeout=5)
  14.     print(response.text)

  15. loop = asyncio.get_event_loop()
  16. loop.run_until_complete(main())
复制代码


在这个示例中,我们定义了一个名为 fetch 的异步函数,它可以接受关键字参数并在内部将它们传递给 requests.get。

然后我们将 fetch 函数传递给 run_in_executor,这样就可以异步地执行 HTTP 请求并传递我们需要的参数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 10:34:02 | 显示全部楼层
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'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 10:41:01 | 显示全部楼层
异步你为什么不用aiohttp呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 10:46:31 | 显示全部楼层
isdkz 发表于 2023-4-7 10:41
异步你为什么不用aiohttp呢?

一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 10:49:05 | 显示全部楼层
我不是第一个 发表于 2023-4-7 10:46
一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。


requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 10:54:41 | 显示全部楼层
isdkz 发表于 2023-4-7 10:49
requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人 ...

requests 是不支持,看视频 好像用线程池可以转换啥的,你上面的代码不加 header cookies等参数应该是可以跑的,但是怕被反扒,想加参数进去,不知道怎么搞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 10:58:07 | 显示全部楼层
我不是第一个 发表于 2023-4-7 10:54
requests 是不支持,看视频 好像用线程池可以转换啥的,你上面的代码不加 header cookies等参数应该是可 ...

上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已

你看的什么视频?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 11:01:23 | 显示全部楼层
isdkz 发表于 2023-4-7 10:58
上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已

你看的什么视频?

B站的  可以发链接吗   bilibili.com拼一下/video/BV1Ke411W71L
应该在10章节左右
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 11:14:54 | 显示全部楼层
isdkz 发表于 2023-4-7 10:58
上面的不管他,就是机器人理解错了,那个跟你原来的也没什么区别,就是封装一下而已

你看的什么视频?

上面的代码不是你贴的啊,用的chatgpt ???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 11:17:50 | 显示全部楼层
我不是第一个 发表于 2023-4-7 11:14
上面的代码不是你贴的啊,用的chatgpt ???

对呀,我去研究一下,看看用 run_in_executor 怎么实现
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 11:19:47 | 显示全部楼层
isdkz 发表于 2023-4-7 11:17
对呀,我去研究一下,看看用 run_in_executor 怎么实现

好的,搞定记得告诉我啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 11:37:37 | 显示全部楼层    本楼为最佳答案   
我不是第一个 发表于 2023-4-7 11:19
好的,搞定记得告诉我啊


requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参数

这时候得配合偏函数解决了,以下是示例代码:

  1. import asyncio
  2. import requests
  3. from functools import partial                                      # 注意这里


  4. async def main():
  5.     url = 'http://httpbin.org/get'
  6.     headers = {
  7.         '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'
  8.     }
  9.     cookies = {'session_id': '12345'}
  10.     loop = asyncio.get_running_loop()
  11.     get = partial(requests.get, headers=headers, cookies=cookies)                                     # 注意这里
  12.     response = await loop.run_in_executor(None, get, url)                                                 # 注意这里
  13.     print(response.json())

  14. loop = asyncio.get_event_loop()
  15. loop.run_until_complete(main())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-7 12:07:51 | 显示全部楼层
isdkz 发表于 2023-4-7 11:37
requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参 ...

谢谢了, 可以跑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表