鱼C论坛

 找回密码
 立即注册
查看: 2097|回复: 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 没有办法传关键字参数

这时候得配合偏函数解决了,以下是示例代码:
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())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-7 10:13:56 | 显示全部楼层
你的代码在使用 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 请求并传递我们需要的参数。
想知道小甲鱼最近在做啥?请访问 -> 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 10:41:01 | 显示全部楼层
异步你为什么不用aiohttp呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

你看的什么视频?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你看的什么视频?

B站的  可以发链接吗   bilibili.com拼一下/video/BV1Ke411W71L
应该在10章节左右
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你看的什么视频?

上面的代码不是你贴的啊,用的chatgpt ???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对呀,我去研究一下,看看用 run_in_executor 怎么实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,搞定记得告诉我啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-7 11:37:37 | 显示全部楼层    本楼为最佳答案   
我不是第一个 发表于 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())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢了, 可以跑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 20:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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