【问题标题】:Going through 120k web pages (urllib, requests seem slow)浏览 120k 网页(urllib,请求似乎很慢)
【发布时间】:2020-12-31 00:54:36
【问题描述】:

这是我在这里的第一个问题。最近我参加了一门网络抓取课程,想自己做点什么,但我被卡住了。那么问题来了:

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

我看到其中一些返回 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

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

感谢您抽出宝贵时间分享一些关于修复或不同方法的知识。

【问题讨论】:

标签: python web-scraping urllib


【解决方案1】:

我最近完成了一项蛮力挑战,其中包括大量请求。我使用了here 的并行方法,我可以一次运行 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}")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 2019-10-13
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多