使用Python进行异步Web抓取
随着越来越多的数据在线发布,异步Web抓取 服务的需求 空前高涨。许多企业都依靠数据驱动的方法来实现其组织目标。通过同步Web抓取,可以满足大多数通常针对小批数据的数据需求。尽管前一部分效果很好,但是在刮除大量数据的情况下, Web刮除仍然会遇到执行时间差的问题。
在此博客中,我们将研究从在线网站上获取大量数据时遇到的问题。继续,我们将进一步探索异步Web抓取,以使我们的python Web抓取工具快速有效地用于数据繁重的Web抓取。
仍然怀疑网页抓取的合法性,这将帮助您清除一些误解
什么是网页抓取
简单地说,网络抓取是从网站提取内容的 过程。当要获取的内容量较小时,手动复制内容是一种方法,但是当所需内容的大小增加时,将使用自动Web抓取。市场上有很多用于抓取内容的工具。诸如Beautiful Soup和Scrapy之类的库是Python编程语言中可用的抓取库的几个示例。
Web抓取使用户可以从在线资源收集数据以进行分析和其他要求。收集到的数据通常会保存回本地存储中,或推送到数据库中以进行持久存储。
Web抓取通常涉及一个代码,该代码可打开目标网站并从中提取所有必需的内容。所需信息通常可以由用户事先提及。
Web抓取中的挑战
对于希望从在线资源中检索数据的用户而言,Web抓取很简单。但是这个故事还有更多。该网站的所有者希望保留其数据以防止网络上发生的所有抓取情况如何? 网站所有者倾向于阻止其网站上的网络抓取活动。他们通过识别和阻止从该网站请求内容的IP地址来实现此目的。
同样,普通的网页抓取对于大多数用例都是有益的,但是 当提取的数据量很高时,它会失败,因为这是一个非常耗时的过程。迫切需要一种在不影响整个过程执行速度的情况下从网站提取大量内容的解决方案。为了迎合前面提到的限制,异步编程的好处得到了最大的发挥。在下一节中,我们将探讨异步编程如何解决快速有效地提取大量内容的问题
克服异步Web抓取的挑战
为了了解异步Web抓取 在加快抓取过程中的作用 ,我们需要首先了解异步编程。让我们以现实生活中的一个简单示例为例,以更深入的了解它。
每次早晨,当我离开办公室时,我需要做些家务,例如洗个澡,准备午餐等,然后再准备离开。如果我一个接一个地执行这些任务,过去每天早上我要消耗近45分钟的时间。只有当我不迟到工作时,我对此总会感到满意。那么我们如何优化呢?
天真的方法可以并行执行所有任务。我可以醒来,先打开间歇泉。我将不去等待间歇泉加热水,而是奔赴厨房开始准备午餐。水准备好后,我会回来洗个澡。在这种情况下,我们能够利用间歇泉所花费的额外等待时间,并有效地利用它来准备午餐。现在整个活动仅需15分钟!简而言之,这是异步编程的主要本质。
异步Web抓取 使我们能够 并行处理和收集大量Web页面中的数据。在并行线程中进行所有报废,可以节省时间。我们不再需要等待刮完一页才能开始刮另一页!
异步Web抓取如何工作
同步性能和异步性能之间的区别起初可能看起来有些不同。在大多数高级语言中,程序性能通常非常简单。源代码的第一行从您的程序开始,然后依次执行每一行代码。同步程序的实现与上面类似。您正在一次一行一行地运行程序(逐行)每当调用一个函数时,程序的执行都会等待该函数返回下一行代码。但是在异步Web抓取的情况下,您的抓取器在并行过程中运行以从网站收集数据,而无需等待一个代码完成其执行。当等待时间到来时,程序一旦遇到等待任务的响应,便开始执行其他任务,
使用python进行异步Web抓取
在本节中,我们将 使用python 实现 异步Web抓取。为了显示同步对象和异步对象之间的差异,我们将同时执行这两个代码,并尝试查看执行时间差。
我们正在使用Beautiful Soup库从网站上抓取内容。我们收集了10个包含手机数据的Web链接。我们的目的是在尽可能短的时间内抓取所有数据。
让我们首先从同步部分开始。下面是初始化所有变量的代码。
### Importing libraries ###
from bs4 import BeautifulSoup
import grequests
import requests
import time/code>/span>/code>/pre>
### Starting the timer ###
start_time = time.time()
### List of urls to scrape data from ###
links = [
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
https://www.croma.com/phones-wea ... s/c/10?q=%3Arele...
]
同步刮网方法
设置好所有变量后,就可以开始抓取手机数据了。我们要做的就是一个接一个地迭代所有Web链接,并提取产品名称,价格和提供的折扣。我们正在使用请求库来获取Web内容,并使用漂亮的汤库来解析所有内容并获取我们所需的清单。下面的代码执行上述任务
for link in links:
req = requests.get(link)
soup = BeautifulSoup(req.text
lists = soup.find_all('a'
print(lists[0].text)
prices = soup.find_all('span'
print(prices[0].text)
discount = soup.find_all("div"
print(discount[0].text)
print("--- %s seconds ---" % (time.time() - start_time))
运行上面的代码后,我们可以在命令行控制台中看到清单。一张一张地取出所有页面并提取我们的数据大约需要14秒钟。这是异步编程的示例。在下一部分中,我们将实现异步版本
异步刮网方法
为了执行异步Web抓取,我们将使用GRequests库。它从所有网页执行并行数据提取,而无需等待一个过程完成。GRequests允许您将Requests与Gevent一起使用,以轻松发出异步HTTP请求。
如果您发现很难赶上这些主题,请尝试优质的视频教程以简化研究。可靠的视频制作公司正在制作这些模式的视频,以简化流程。
以下是用于从10个不同的网站提取数据的异步实现。
reqs = (grequests.get(link) for link in links)
resp=grequests.imap(reqs
for r in resp:
soup = BeautifulSoup(r.text
results = soup.find_all('a'
print(results[0].text)
prices = soup.find_all('span'
print(prices[0].text)
discount = soup.find_all("div"
print(discount[0].text)
print("--- %s seconds ---" % (time.time() - start_time))
运行上述程序后,您可以轻松地看到异步提取数据的效果。该程序花费3秒来获取所有数据,而同步副本花费了14秒。我们在这里节省了将近11秒的时间,这在处理批量数据抓取时实际上是一个很大的问题。

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!