我制作了一个基本的Internet抓取机器人(特别是可以读到好书并抓取有关所请求书籍的信息的机器人)。由于它必须进行一定程度的抓取(可能是因为我将其托管在笔记本电脑上),因此每个请求大约需要10秒钟。
我注意到,如果我彼此紧接着输入两个请求,则只有在完成第一个请求后,它才会执行第二个请求。我将如何使其并行运行?我读了一些有关分片的内容,但这似乎适用于多台服务器(也只能用于100台左右的服务器)。现在,它仅在一台服务器(我的测试服务器)上。
更新:根据一个答案,我可以使用aiohttp代替请求来做我想做的事情。我可以使用有关此代码的aiohttp的一些帮助:
sess = requests.session()
req = sess.get(i) #i is a url
soup = BeautifulSoup(req.content, 'html.parser')
link = soup.find('a')['href']
print(link)
with sess.get(link, stream=True) as req2:
with open(os.path.join('C:\\save\\location', f"{file}.txt"), "wb") as x_file:
shutil.copyfileobj(req2.raw, x_file)
file
是较早初始化的变量。本质上,这里发生的是我正在将下载文件的内容写入所需目录中的文本文件。
答案 0 :(得分:2)
问题是您使用requests
,在异步函数中使用requests
导致整个代码被阻塞,导致仅在第一个命令完成后才使用另一个命令。最好使用aiohttp
而不是requests
,因为它为HTTP请求提供了异步支持。
详细了解What blocking means?
here
示例:
import aiohttp
URL = "https://www.reddit.com/r/aww/hot.json?limit=10"
async with aiohttp.request("GET", URL) as response:
# Check if the request was vaild.
if response.status == 200:
# Converts response into dict.
json_data = await response.json()
# Gives you plain text.
text_data = await response.text()
else:
print(f"The request was not successful\nStatus code: {response.status}")