我不是第一个 发表于 2023-4-7 09:55:59

异步爬虫问题

这个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)

这两个都是网上找的答案,都不行,不知道怎么写了。

isdkz 发表于 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 请求并传递我们需要的参数。

我不是第一个 发表于 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'

isdkz 发表于 2023-4-7 10:41:01

异步你为什么不用aiohttp呢?

我不是第一个 发表于 2023-4-7 10:46:31

isdkz 发表于 2023-4-7 10:41
异步你为什么不用aiohttp呢?

一个是不太熟练,二是我项目里面有些库不支持异步,所以用这个方法先用着。{:5_109:}

isdkz 发表于 2023-4-7 10:49:05

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

requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人用

我不是第一个 发表于 2023-4-7 10:54:41

isdkz 发表于 2023-4-7 10:49
requests应该不支持异步操作的吧,支持异步操作的就 httpx和 asyncio 这两个库了,貌似 asyncio 更多人 ...

requests 是不支持,看视频 好像用线程池可以转换啥的,你上面的代码不加 header cookies等参数应该是可以跑的,但是怕被反扒,想加参数进去,不知道怎么搞

isdkz 发表于 2023-4-7 10:58:07

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

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

你看的什么视频?

我不是第一个 发表于 2023-4-7 11:01:23

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

你看的什么视频?

B站的可以发链接吗   bilibili.com拼一下/video/BV1Ke411W71L
应该在10章节左右

我不是第一个 发表于 2023-4-7 11:14:54

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

你看的什么视频?

上面的代码不是你贴的啊,用的chatgpt ???

isdkz 发表于 2023-4-7 11:17:50

我不是第一个 发表于 2023-4-7 11:14
上面的代码不是你贴的啊,用的chatgpt ???

对呀,我去研究一下,看看用 run_in_executor 怎么实现

我不是第一个 发表于 2023-4-7 11:19:47

isdkz 发表于 2023-4-7 11:17
对呀,我去研究一下,看看用 run_in_executor 怎么实现

好的,搞定记得告诉我啊{:5_109:}

isdkz 发表于 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())

我不是第一个 发表于 2023-4-7 12:07:51

isdkz 发表于 2023-4-7 11:37
requests 的 headers 和 cookies 得用关键字参数的形式来传,但是 run_in_executor 没有办法传关键字参 ...

谢谢了, 可以跑{:5_106:}
页: [1]
查看完整版本: 异步爬虫问题