在先前的问题中,一位作者aiohttp
建议使用aiohttp的新asyncwith
语法从中获取多个网址Python 3.5
:
import aiohttp
import asyncio
async def fetch(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
return await response.text()
async def fetch_all(session, urls, loop):
results = await asyncio.wait([loop.create_task(fetch(session, url))
for url in urls])
return results
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# breaks because of the first url
urls = ['http://SDFKHSKHGKLHSKLJHGSDFKSJH.com',
'http://google.com',
'http://twitter.com']
with aiohttp.ClientSession(loop=loop) as session:
the_results = loop.run_until_complete(
fetch_all(session, urls, loop))
# do something with the the_results
但是,当其中一个session.get(url)
请求中断时(如上所述,由于http://SDFKHSKHGKLHSKLJHGSDFKSJH.com
导致错误),则错误不会得到处理,整个中断。
我就开始寻找插入有关的结果的测试session.get(url)
,比如找地方了try ... except ...
,或者一个if response.status != 200:
,但我只是不理解如何与工作async with
,await
与各种对象。
由于async with
仍然很新,因此没有很多示例。如果asyncio
向导可以显示如何执行此操作,对许多人来说将非常有帮助。毕竟,大多数人想要测试的第一件事asyncio
就是同时获取多个资源。
目标
我们的目标是我们可以检查the_results
并快速查看:
我将使用gather
代替wait
,它可以将异常作为对象返回,而无需引发它们。然后,您可以检查每个结果(如果它是某些异常的实例)。
import aiohttp
import asyncio
async def fetch(session, url):
with aiohttp.Timeout(10):
async with session.get(url) as response:
return await response.text()
async def fetch_all(session, urls, loop):
results = await asyncio.gather(
*[fetch(session, url) for url in urls],
return_exceptions=True # default is false, that would raise
)
# for testing purposes only
# gather returns results in the order of coros
for idx, url in enumerate(urls):
print('{}: {}'.format(url, 'ERR' if isinstance(results[idx], Exception) else 'OK'))
return results
if __name__ == '__main__':
loop = asyncio.get_event_loop()
# breaks because of the first url
urls = [
'http://SDFKHSKHGKLHSKLJHGSDFKSJH.com',
'http://google.com',
'http://twitter.com']
with aiohttp.ClientSession(loop=loop) as session:
the_results = loop.run_until_complete(
fetch_all(session, urls, loop))
测试:
$python test.py
http://SDFKHSKHGKLHSKLJHGSDFKSJH.com: ERR
http://google.com: OK
http://twitter.com: OK
我面临的问题很简单。如果我试图从一个网站获取一些数据,有两个同名的类。但是它们都包含一个具有不同信息的表。我所拥有的代码只向我输出第一个类的内容。它看起来像这样: 如何让代码输出两个表的内容或仅输出第二个表的内容?提前感谢您的回答!
我想刮从多个网站与类似的网址的,如https://woollahra.ljhooker.com.au/our-team, https://chinatown.ljhooker.com.au/our-team和https://bondibeach.ljhooker.com.au/our-team. 我已经写了一个脚本,第一个网站的工作,但我不知道如何告诉它从其他两个网站刮。 我的代码: 有没有一种方
我在Ubuntu 16上使用python 3.5。 我正在尝试使用aiohttp编写一个简单的客户端。 这是我的代码。我从这里拿走了。这是禁用ssl检查的第一个代码示例: 对于某些站点,此代码有效。对于其他人,包括或则不起作用。相反,代码会产生以下错误: 我尝试了一个简单的脚本,类似这样: 这工作,我能够达到谷歌。curl和wget也可以访问谷歌。 做一些研究,我遇到了一个不同的问题。那个问题和我
问题内容: 我需要抓取一个网站,其内容由Angular“插入”。它需要用java完成。 我已经尝试过Selenium Webdriver(因为我之前曾使用Selenium来抓取较少动态的网页)。但是我不知道如何处理Angular部分。除了页面顶部的script标签之外,网站中只有一个地方具有Angular属性: 我在这里找到了这篇文章,但是说实话…我不知道。看来作者正在选择(这样称呼他们)’ng-
我正试图浏览一个网站。我尝试过使用两种方法,但都没有提供完整的网站源代码,我正在寻找。我正试图从下面提供的网站URL中获取新闻标题。 URL:"https://www.todayonline.com/" 这是我尝试过但失败的两种方法。 请帮忙。我试着抓取其他新闻网站,这要容易得多。谢谢你。
问题内容: 所以,我的问题相对简单。我有一只蜘蛛在多个站点上爬行,我需要它按照我在代码中写入的顺序返回数据。它发布在下面。 结果以随机顺序返回,例如,返回29,然后28,然后30。我已经尝试将调度程序的顺序从DFO更改为BFO,以防万一这是问题所在,但这并没有改变。 问题答案: 定义在方法中使用的URL 。下载页面时,将为你的方法调用每个起始URL的响应。但是你无法控制加载时间-第一个起始URL可