我有以下python代码:
session = requests.Session()
for i in range(0, len(df_1)):
page = session.head(df_1['listing_url'].loc[i], allow_redirects=False, stream=True)
if page.status_code == 200:
df_1['condition'][i] = 'active'
else:
df_1['condition'][i] = 'false'
df_1是我的数据帧,列"listing_url"500行以上
我想请求URL列表是否活跃,并将其附加在我的数据帧中。但是这个代码需要很长时间。我怎样才能减少时间呢?
当前方法的问题是requests
按顺序(同步)运行,这意味着在前一个请求完成之前不能发送新请求。
您正在寻找的是异步处理这些请求。遗憾的是,requests
库不支持异步请求。httpx
是一个较新的库,具有与requests
类似的API,但可以做到这一点。aiohttp
是另一个流行的选择。使用httpx
,你可以这样做:
import asyncio
import httpx
listing_urls = list(df_1['listing_url'])
async def do_tasks():
async with httpx.AsyncClient() as client:
tasks = [client.head(url) for url in listing_urls]
responses = await asyncio.gather(*tasks)
return {r.url: r.status_code for r in responses}
url_2_status = asyncio.run(do_tasks())
这将给你一个{url: status_code}
的映射。你应该可以从那里开始。
此解决方案假设您正在使用Python3.7或更新版本。还记得安装httpx
。