python - 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")
解决方案
所以我没有设法减少美味汤的时间,但我设法解决了这个问题。我改用正则表达式,这将我的 Pi 上的时间降低到不到 0.1 秒。由于正则表达式的许多情况,它更加混乱,但它在我的用例中效果更好。
推荐阅读
- firebase - Firestore 规则:resource.data.keys() 不包含读取的所有字段
- c# - .Net Core API JWT 令牌验证
- php - 固定价格产品收银员
- mips - mips的嵌套循环问题:打印模式并在我的代码中出现错误
- python - 如何使用pickle保存加载数据并在另一个脚本中重新使用锚数据
- mysql - IBM CDC Replication 获取 SQL 错误代码 1172,SQL 状态 42000
- amazon-web-services - Elastic Beanstalk 错误,工作了几个月
- r - 使用 mppm 将非均匀 Cox LGCP 拟合到复制点过程
- c# - 如何更改动画速度?
- selenium - Xunit 按类型参数化 Selenium