浏览12万个网页urllib,请求似乎很慢

问题描述

这是我在这里的第一个问题。最近,我参加了一门有关网络抓取的课程,想自己做一些事情,但是在这里我陷入了困境。所以这是问题:

我的文件中有12万个网址。网址看起来像这样的www.example.com/.../3542/../may/.。 因此,我们总共有10,000个组合(0000-9999)乘以12个月,得出12万个链接

我看到其中一些返回HTTP ERROR 500,其中一些重定向到指定的页面,其余的应该是我需要的页面,但是我正在努力筛选不需要的页面

我尝试在try catch块中使用urllib.request.openurl(url)来过滤http 500代码。还使用BeautifulSoup检索网页的标题并检查它是否与我重定向到的页面匹配。但是,这似乎真的很慢。

我尝试过通过带有“请求”的状态代码进行过滤,但这也不是很快。

这是我上面讨论的代码的一部分:

# fname is a file handle
for line in fname:
    try:
        f = urllib.request.urlopen(line)
        soup = BeautifulSoup(f.read().decode(),'html.parser')
        title = soup.title.string
        if title != "Redirected Title":
            filtered_links.write(line)
    except:
        pass

我想知道以某种方式访问​​标题是否更快,以及如何实现。

感谢您的时间,您可以自由分享一些有关修补程序或其他方法的知识。

解决方法

我最近进行了一次蛮力挑战,其中包括大量请求。我使用了here中的Parallelism方法,并且可以一次运行40个请求(每个包大约需要2秒钟)。您可以根据自己的连接速度随意更改请求数。

from requests_futures import sessions
from concurrent.futures import ThreadPoolExecutor

urls = []         #add your list of urls here
session = sessions.FuturesSession(executor=ThreadPoolExecutor(max_workers=40))
#change max_workers as you wish

futures = [session.get(url) for url in urls]

results = [f.result().url for f in futures if f.result().status_code is 200]
# results will give you the url of requests that was successful(200 code)

print(f"Results: {results}")