从网页抓取数据(如何应对数据匮乏?最简单的方法在这里!!)
优采云 发布时间: 2021-12-01 06:20从网页抓取数据(如何应对数据匮乏?最简单的方法在这里!!)
介绍
我们的数据太少,无法构建机器学习模型。我们需要更多数据!
如果这句话听起来很熟悉,那么您并不孤单!希望得到更多的数据来训练我们的机器学习模型是一直困扰着人们的问题。我们无法获得可以直接在数据科学项目中使用的 Excel 或 .csv 文件,对吗?
那么,如何应对数据稀缺的问题呢?
实现这一目标的最有效和最简单的方法之一是通过网络爬行。我个人认为网页抓取是一种非常有用的技术,可以从多个 网站 采集数据。现在,一些 网站 还为您可能想要使用的许多不同类型的数据提供 API,例如 Tweets 或 LinkedIn 帖子。
但有时您可能需要从不提供特定 API 的 网站 采集数据。这是网页抓取功能派上用场的地方。作为数据科学家,您可以编写一个简单的 Python 脚本并提取所需的数据。
因此,在本文中,我们将学习网页抓取的不同组件,然后直接学习 Python 以了解如何使用流行且高效的 BeautifulSoup 库进行网页抓取。
请注意,网络抓取受许多准则和规则的约束。并不是每一个网站都允许用户抓取内容,所以有一定的法律限制。在尝试此操作之前,请确保您已阅读 网站 的 网站 条款和条件。
目录 3 种流行的 Python 网络爬虫工具和库 网络爬虫组件 抓取解析和转换存储 从网页中抓取 URL 和电子邮件 ID 抓取图片 当页面加载时抓取数据 3 种流行的 Python 网络爬虫工具和库
您将在 Python 中遇到多个用于网页抓取的库和框架。以下是三种用于高效完成任务的流行工具:
美汤
刮痧
硒
网络爬虫组件
这是构成网络爬行的三个主要组件的极好说明:
让我们详细了解这些组件。我们将使用 goibibo网站 来捕获酒店的详细信息,例如酒店名称和每个房间的价格,以实现这一点:
注意:请始终遵循目标网站的robots.txt文件,也称为robots排除协议。这可以告诉网络机器人不抓取哪些页面。
因此,我们可以从目标 URL 中抓取数据。我们很高兴编写我们的网络机器人脚本。让我们开始吧!
第 1 步:爬网
网络爬虫的第一步是导航到目标网站并下载网页的源代码。我们将使用请求库来做到这一点。http.client 和 urlib2 是另外两个用于发出请求和下载源代码的库。
下载网页源代码后,我们需要过滤需要的内容:
"""Web Scraping - Beautiful Soup"""# importing required librariesimport requestsfrom bs4 import BeautifulSoupimport pandas as pd# target URL to scrapurl = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"# headersheaders = { 'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" }# send request to download the dataresponse = requests.request("GET", url, headers=headers)# parse the downloaded datadata = BeautifulSoup(response.text, 'html.parser')print(data)
第 2 步:解析和转换
网络抓取的下一步是将此数据解析为 HTML 解析器。为此,我们将使用 BeautifulSoup 库。现在,如果您注意到我们的登录页面,就像大多数页面一样,特定酒店的详细信息也在不同的卡片上。
因此,下一步将是从完整的源代码中过滤卡片数据。接下来,我们将选择卡片,然后单击“检查元素”选项以获取该特定卡片的源代码。您将获得以下信息:
所有卡片的类名都是一样的。我们可以通过传递标签名称和属性(例如标签)来获取这些卡片的列表。名称如下:
# find all the sections with specifiedd class namecards_data = data.find_all('div', attrs={'class', 'width100 fl htlListSeo hotel-tile-srp-container hotel-tile-srp-container-template new-htl-design-tile-main-block'})# total number of cardsprint('Total Number of Cards Found : ', len(cards_data))# source code of hotel cardsfor card in cards_data: print(card)
我们从网页的完整源代码中过滤掉了卡片数据,这里的每张卡片都收录有关单个酒店的信息。仅选择酒店名称,执行“检查元素”步骤,并对房价执行相同操作:
现在,对于每张卡,我们必须找到上面的酒店名称,这些名称只能来自
从标签中提取。这是因为每张卡和费率只有一个标签、标签和类别名称:
# extract the hotel name and price per roomfor card in cards_data: # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) print(hotel_name.text, room_price.text)
第 3 步:Store(存储数据)
最后一步是将提取的数据存储在 CSV 文件中。在这里,对于每张卡片,我们将提取酒店名称和价格并将其存储在 Python 字典中。然后,我们最终将其添加到列表中。
接下来,让我们继续将此列表转换为 Pandas 数据框,因为它允许我们将数据框转换为 CSV 或 JSON 文件:
# create a list to store the datascraped_data = []for card in cards_data: # initialize the dictionary card_details = {} # get the hotel name hotel_name = card.find('p') # get the room price room_price = card.find('li', attrs={'class': 'htl-tile-discount-prc'}) # add data to the dictionary card_details['hotel_name'] = hotel_name.text card_details['room_price'] = room_price.text # append the scraped data to the list scraped_data.append(card_details)# create a data frame from the list of dictionariesdataFrame = pd.DataFrame.from_dict(scraped_data)# save the scraped data as CSV filedataFrame.to_csv('hotels_data.csv', index=False)
恭喜!我们已经成功创建了一个基本的网络爬虫。我希望您尝试这些步骤并尝试获取更多数据,例如酒店的类别和地址。现在,让我们看看如何在页面加载时执行一些常见任务,例如抓取 URL、电子邮件 ID、图像和抓取数据。
从网页中获取 URL 和电子邮件 ID
我们尝试使用网页抓取功能抓取的两个最常见的功能是 网站 URL 和电子邮件 ID。我确定您参与过需要提取大量电子邮件 ID 的项目或挑战。那么,让我们看看如何在 Python 中抓取这些内容。
使用网络浏览器的控制台