首页 > 解决方案 > Beautiful Soup 需要很长时间才能用于特定站点

问题描述

我在脚本中使用 Beautiful Soup 来抓取几个网站。他们中的大多数都工作得很好。我习惯于在我的主计算机上看到 0.01 到 0.02 秒之间的任何解析。但是,当我尝试从某些网站(例如 slickdeals.net)抓取链接时,我看到的时间在 0.9 到 2 秒之间;几乎慢了 100 倍。这在我的主计算机上并不算太糟糕,但这是我计划在我的 Raspberry Pi 3 模型 B 上运行的脚本,在此之上,此站点上的链接平均需要 30 到 40 秒(很少有 60+偶尔几秒钟)。

由于我的主计算机比我的 Pi 强大得多,因此从该站点同时抓取 20 多个链接总共需要大约 6 - 10 秒(相比之下,所有其他站点的总和可以忽略不计)。但是在我的 Pi 上,它可能需要超过 240 秒(每个其他站点在几秒钟内完成)。我的目标是每分钟运行一次脚本,所以这需要的时间太长了。这只是这个特定网站的问题吗?或者我可以做些什么来减少时间?这是我使用的相关代码:

with futures.ProcessPoolExecutor() as executor:
    executor.map(parseStuff, urls)
def parseStuff(url):
    ... ## doing some stuff before scraping
    req = urllib.request.Request(url)
    req.add_header('User-Agent', 'Mozilla/5.0')
    try:
        pageContents = urllib.request.urlopen(req).read()
        openurlArray.append((url, pageContents)) ## using this for other stuff later
        start2 = time.time()
        soup = BeautifulSoup(pageContents, 'lxml', parse_only=SoupStrainer(['span','div'], attrs={'class': possibleClasses[urlName]})) ## looking for a different value for class depending on the site, will either be in div or span tag
        end2 = time.time()
        time_taken2 = end2 - start2
        print("soup stuff for " + url + " took " + str(time_taken2) + " seconds")

标签: pythonmultithreadingweb-scrapingbeautifulsoupraspberry-pi

解决方案


所以我没有设法减少美味汤的时间,但我设法解决了这个问题。我改用正则表达式,这将我的 Pi 上的时间降低到不到 0.1 秒。由于正则表达式的许多情况,它更加混乱,但它在我的用例中效果更好。


推荐阅读