async def rss_downloader(rss):
global counter
async with download_limit:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'
}
try:
response = await httpx.get(rss, headers=headers, verify=False)
if response.status_code == 200:
r_text = response.text
await downloaded_rss.put({'url': rss, 'feed': r_text})
else:
counter += 1
print(f'№{counter} - {response.status_code} - {rss}')
except (
ConnectTimeout, ConnectionClosed
):
not_found_rss.append(rss)
except Exception:
not_found_rss.append(rss)
logging.exception(f'{rss}')
async def main():
parser_task = asyncio.create_task(parser_queue())
tasks = [
asyncio.create_task(rss_downloader(item['url'])) for item in db[config['mongodb']['channels_collection']].find({'url': {'$ne': 'No RSS'}})
]
await asyncio.gather(*tasks, parser_task)
字符串
很多时候,这段代码无法加载某些页面,导致各种错误。Here is an example的一些错误。但当我尝试一次加载一个相同的页面时,一切都很好:
In [1]: import httpx
In [2]: r = await httpx.get('http://www.spinmob.com/nirvanictrance.xml')
In [3]: r
Out[3]: <Response [200 OK]>
In [4]:
型
作为一个信号量,我设置了20个工人的限制,这不是那么多,我尝试越来越少-所有的相同,这些错误出现,为什么会发生这种情况,我能做些什么呢?
1条答案
按热度按时间mkshixfv1#
httpx
文档介绍了您正在使用的ReadTimeout
:HTTPX在默认情况下会小心地在所有地方强制超时。默认行为是在网络不活动5秒后引发TimeoutException。read timeout指定等待接收数据块(例如,响应正文的一部分)的最长持续时间。如果HTTPX无法在此时间范围内接收数据,则会引发
ReadTimeout
异常。首先尝试禁用读取的超时持续时间(改编自上面链接中的示例):
字符串
然后尝试不同的超时持续时间,看看对您的用例来说什么是合理的。
编辑:更新了API,参数名从
read_timeout
改为read
:型