使用 Beautiful Soup 的 Python 网页抓取指南
已发表: 2020-06-23使用 Python 进行网页抓取简介:
在网络抓取方面,某些编程语言比其他编程语言更受欢迎。 其中最受欢迎的之一是 Python。 除了由于其更温和的学习曲线而成为最容易学习的语言之一之外,它还具有作为具有大量开发人员支持的语言的优势 - 这导致了许多第三方软件包。 这些包可用于多种功能,这可能难以使用核心 Python 执行。 一些常见的例子是——对于图像处理或计算机视觉,我们使用 OpenCV,对于机器学习,我们使用 TensorFlow,对于绘图,我们使用 MatplotLib。 说到网页抓取,最常用的库之一是 BeautifulSoup。 该库并不专门从互联网上抓取数据,但如果您可以获取网页的 HTML 文件,它可以帮助从中提取特定的数据点。 通常,该库用于从 XML 和 HTML 文档中提取数据点。
BeautifulSoup 是如何工作的?
在继续用 Python 编写代码之前,您必须了解 BeautifulSoup 的工作原理。 一旦你提取了网页的 HTML 内容并将其存储在一个变量中,比如 html_obj,你就可以只用一行代码将它转换成一个 BeautifulSoup 对象——
| soup_obj = BeautifulSoup(html_obj, 'html.parser') |
其中 html_obj 是 HTML 数据,soup_obj 是已获取的 bs 对象,“html.parser”是用于进行转换的解析器。 一旦有了bs 对象,称为soup_obj,遍历它就非常容易,而且由于遍历它很简单,数据提取也变得简单。 让我们举个例子。 假设您需要获取一个名为产品标题的数据点,该数据点出现在电子商务网站的每个页面上。 现在,您从该网站下载了一个 HTML 产品页面,并意识到每个页面都有一个类型为 span 的元素中提到的产品名称,其 id 为 productTitle。 那么你将如何从 1000 个产品页面中获取这些数据呢? 好吧,您将获取每个页面的 HTML 数据,并以这种方式获取数据点 -
| 对于 soup.findAll('span', attrs={'id': 'productTitle'}) 中的跨度: name_of_product = spans.text.strip() |
虽然这是一种获取某个标签元素之间存在的文本数据的方法,但您也可以从标签的属性中获取数据。

如何使用 BeautifulSoup 从网页中抓取数据?
现在我们对如何遍历 bs 对象有了一些基本的了解,让我们编写一些代码,看看它是如何工作的。 使用下面的代码片段,您可以非常轻松地从美国领先的房地产市场 Zillow 中抓取数据。 您可以运行此代码并输入列表的 URL,以获取 JSON 格式的输出数据。 让我们逐行理解代码。 首先,确保您的机器上安装了 Python 3.7 或更高版本。 使用 pip 安装 BeautifulSoup。 所有其他软件包都与 Python 预先捆绑在一起,因此您无需安装任何软件包。 完成后,安装 Atom 或 VS Code 之类的代码编辑器,即可开始使用。 理解代码很重要,因此我们将从第一行开始。 您需要四个导入语句来实现特定功能。 接下来,您有三行以“ctx”开头。 这些专门用于忽略您在通过代码访问网站时可能遇到的 SSL 证书错误。 接下来,我们将网站 URL 作为用户的输入。 在这里,您也可以对 URL 进行硬编码,甚至可以拥有多个 URL 的数组。
网页抓取过程:
接下来,我们使用urllib的Request函数访问网页。 确保在标题中添加 User-Agent 以使网站相信您正在使用浏览器。 这样做的原因是网站是由浏览器而不是代码访问的,因此如果他们抓住你,他们可能会阻止你的 IP。 完成后,我们完成了所有基本步骤,接下来,我们将 HTML 对象转换为 bs 对象,然后将其美化为 utf-8 格式,以处理网页中的特殊字符和符号。 完成后,我们通过解析 bs 对象来提取标题、简短细节和其他属性。 可以看到,在属性type = application/ld+json的script标签中,有多个数据点都以JSON格式存储。 此外,您可以看到我们使用了 i==0 和 i==1 检查。 这是因为在一个页面中有两个这样的脚本标签(具有相同的属性)。 第一个标签给了我们一些数据点,而第二个给了我们剩下的。 一旦我们提取了所有数据点,您就可以将其存储在 JSON 文件中并按原样保存。 如果需要,您还可以保存、将其上传到站点,甚至可以使用数据访问 API。
| 导入json 导入 ssl from urllib.request 导入请求,urlopen 从 bs4 导入 BeautifulSoup # 忽略 SSL 证书错误 ![]() # 将 Zillow 列表 URL 作为输入 # 让网站相信你正在使用浏览器 # HTML 页面 -> BeautifulSoup 对象汤 = BeautifulSoup(webpage, 'html.parser') # 提取属性列表的不同数据点 对于 soup.findAll('meta', attrs={'name': 'description'}) 中的元数据: 对于soup.findAll('div',attrs = {'class':'character-count-truncated'})中的div: for (i, script) in enumerate(soup.findAll('script', 使用 open('house_listing_data.json', 'w') 作为输出文件: 使用 open('house_listing_data.html', 'wb') 作为文件: print('———-数据提取完成。检查json文件。———-') |
输出 JSON 应该看起来像这样 -
| { “details_long”:{ “no_of_rooms”:3, “floor_size_in_sqrft”:“1,392” }, “地址”: { “街”:“22516 琼博士”, “地点”:“加利福尼亚”, “地区”:“MD”, “邮政编码”:“20619” }, “标题”:“22516 Joan Dr, California, MD 20619 | MLS #MDSM167670”, “details_short”:“22516 Joan Dr , California, MD 20619-3175 是一栋挂牌出售的单户住宅,售价 150,000 美元。 这座 1,392 平方英尺的住宅是一个 3 床、2.0 浴室的房产。 在 Zillow 上查找 22516 Joan Dr 家的 40 张照片。 在 Zillow 上查看更多房产详情、销售历史和 Zestimate 数据。 MLS # MDSM167670”, “price_in_dollars”:150000, “inage”:“https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg” } |
结论:
只要您首先可以手动分析 HTML 页面并确定需要定位的标签,就可以轻松地使用 BeautifulSoup 来满足您的网络抓取需求。 它可以在没有任何动态内容且不位于登录页面后面的页面上工作。 对于更复杂的网页,您将需要更复杂的工具。 我们在 PromptCloud 的团队帮助那些希望利用数据并做出数据支持决策的公司。 我们不仅帮助建立在云端频繁运行的全自动网络抓取引擎,还帮助公司分析数据以提取趋势和其他有用信息。

