关于人工智能:入门用Python进行Web爬取数据为数据科学项目提取数据的有效方法

48次阅读

共计 6725 个字符,预计需要花费 17 分钟才能阅读完成。

作者 |LAKSHAY ARORA
编译 |Flin
起源 |analyticsvidhya

总览

  • Web 抓取是一种从网站提取数据的高效办法(取决于网站的规定)
  • 理解如何应用风行的 BeautifulSoup 库在 Python 中执行网页抓取
  • 咱们将介绍能够抓取的不同类型的数据,例如文本和图像

介绍

咱们领有的数据太少,无奈建设机器学习模型。咱们须要更多数据!

如果这句话听起来很相熟,那么你并不孤独!心愿取得更多数据来训练咱们的机器学习模型是一个始终困扰人们的问题。咱们无奈在数据迷信我的项目中取得能够间接应用的 Excel 或.csv 文件,对吗?

那么,如何应答数据匮乏的问题呢?

实现此目标最无效,最简略的办法之一就是通过网页抓取。我集体发现网络抓取是一种十分有用的技术,能够从多个网站收集数据。现在,某些网站还为你可能心愿应用的许多不同类型的数据提供 API,例如 Tweets 或 LinkedIn 帖子。

然而有时你可能须要从不提供特定 API 的网站收集数据。这就是 web 抓取能力派上用场的中央。作为数据科学家,你能够编写一个简略的 Python 脚本并提取所需的数据。

因而,在本文中,咱们将学习 Web 抓取的不同组件,而后间接钻研 Python,以理解如何应用风行且高效的 BeautifulSoup 库执行 Web 抓取。

咱们还为本文创立了一个收费课程:

  • 应用 Python 进行 Web 爬网简介。这种结构化的格局将帮忙你更好地学习。

    • https://courses.analyticsvidh…

请留神,网页抓取要恪守许多准则和规定。并非每个网站都容许用户抓取内容,因而存在肯定的法律限度。在尝试执行此操作之前,请务必确保已浏览网站的网站条款和条件。

目录

  1. 3 个风行的工具和库,用于 Python 中的 Web 爬虫
  2. Web 爬网的组件

    1. Crawl
    2. Parse and Transform
    3. Store
  3. 从网页中爬取 URL 和电子邮件 ID
  4. 爬取图片
  5. 在页面加载时抓取数据

3 个风行的工具和库,用于 Python 中的 Web 爬虫

你将在 Python 中遇到多个用于 Web 抓取的库和框架。以下是三种高效实现工作的热门工具:

BeautifulSoup

  • BeautifulSoup 是 Python 中一个了不起的解析库,可用于从 HTML 和 XML 文档进行 Web 抓取。
  • BeautifulSoup 会自动检测编码并优雅地解决 HTML 文档,即便带有特殊字符也是如此。咱们能够浏览已解析的文档并找到所需的内容,这使得从网页中提取数据变得快捷而轻松。在本文中,咱们将具体学习如何应用 Beautiful Soup 构建 web Scraper

Scrapy

  • Scrapy 是用于大规模 Web 抓取的 Python 框架。它为你提供了从网站中高效提取数据,依据须要进行解决并以你喜爱的构造和格局存储数据所需的所有工具。你能够在这里浏览更多无关 Scrapy 的信息。

    • https://www.analyticsvidhya.c…

Selenium

  • Selenium 是另一个使浏览器自动化的风行工具。它次要用于行业中的测试,但也十分不便进行网页抓取。看看这篇很棒的文章,以理解更多无关应用 Selenium 进行 Web 抓取的工作形式的信息。

    • https://www.analyticsvidhya.c…

Web 爬网的组件

这是形成网页抓取的三个次要组成部分的杰出阐明:

让咱们具体理解这些组件。咱们将通过 goibibo 网站抓取酒店的详细信息,例如酒店名称和每间客房的价格,以实现此目标:

留神:请始终遵循指标网站的 robots.txt 文件,该文件也称为漫游器排除协定。这能够通知网络漫游器不要抓取哪些页面。

  • https://www.goibibo.com/robot…

因而,咱们被容许从指标 URL 中抓取数据。咱们很快乐去写咱们的网络机器人的脚本。让咱们开始!

第 1 步:Crawl(抓取)

Web 抓取的第一步是导航到指标网站并下载网页的源代码。咱们将应用申请库来执行此操作。http.client 和 urlib2 是另外两个用于发出请求和下载源代码的库。

  • http.client:https://docs.python.org/3/lib…
  • urlib2:https://docs.python.org/2/lib…

下载了网页的源代码后,咱们须要过滤所需的内容:

"""Web Scraping - Beautiful Soup"""

# importing required libraries
import requests
from bs4 import BeautifulSoup
import pandas as pd

# target URL to scrap
url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"

# headers
headers = {'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 data
response = requests.request("GET", url, headers=headers)

# parse the downloaded data
data = BeautifulSoup(response.text, 'html.parser')
print(data)

步骤 2:Parse and Transform(解析和转换)

Web 抓取的下一步是将这些数据解析为 HTML 解析器,为此,咱们将应用 BeautifulSoup 库。当初,如果你曾经留神到咱们的指标网页,则与大多数网页一样,特定酒店的详细信息也位于不同的卡片上。

因而,下一步将是从残缺的源代码中过滤卡片数据。接下来,咱们将抉择该卡片,而后单击“Inspect Element”选项以获取该特定卡的源代码。你将取得如下内容:

所有卡的类名都雷同,咱们能够通过传递标签名称和属性(如 <class> 标签)来取得这些卡的列表,其名称如下所示:

# find all the sections with specifiedd class name
cards_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 cards
print('Total Number of Cards Found :', len(cards_data))

# source code of hotel cards
for card in cards_data:
    print(card)

咱们从网页的残缺源代码中过滤出了卡数据,此处的每张卡都蕴含无关独自酒店的信息。仅抉择酒店名称,执行“Inspect Element”步骤,并对房间价格执行雷同操作:

当初,对于每张卡,咱们必须找到下面的酒店名称,这些名称只能从 <p> 标签中提取。这是因为每张卡和房价只有一个 < p > 标签和 < class > 标签和类名:

# extract the hotel name and price per room
for 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 data
scraped_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 dictionaries
dataFrame = pd.DataFrame.from_dict(scraped_data)

# save the scraped data as CSV file
dataFrame.to_csv('hotels_data.csv', index=False)

祝贺!咱们曾经胜利创立了一个根本的网页抓取工具。我心愿你尝试这些步骤,并尝试获取更多数据,例如酒店的等级和地址。当初,让咱们看看如何执行一些常见工作,例如在页面加载时抓取 URL,电子邮件 ID,图像和抓取数据。

从网页中抓取 URL 和电子邮件 ID

咱们尝试应用网络抓取性能抓取的两个最常见的性能是网站 URL 和电子邮件 ID。我敢肯定你已经参加过须要大量提取电子邮件 ID 的我的项目或挑战。因而,让咱们看看如何在 Python 中抓取这些内容。

应用 Web 浏览器的控制台

假如咱们要跟踪咱们的 Instagram 关注者,并想晓得勾销关注咱们帐户的人的用户名。首先,登录到你的 Instagram 帐户,而后单击关注者以查看列表:

  • 始终向下滚动,以便将所有用户名都加载到浏览器内存中的后盾
  • 右键单击浏览器窗口,而后单击“查看元素”
  • 在控制台窗口中,键入以下命令:
urls = $$(‘a’); for (url in urls) console.log (urls[url].href);

仅需一行代码,咱们就能够找到该特定页面上存在的所有 URL:

  • 接下来,将此列表保留在两个不同的工夫戳中,一个简略的 Python 程序将使你晓得两者之间的区别。咱们将可能晓得勾销了咱们的帐户的用户名!
  • 咱们能够应用多种办法来简化此工作。次要思维是,只需一行代码,咱们就能够一次性取得所有 URL。

应用 Chrome 扩大程序电子邮件提取器

电子邮件提取器是一个 Chrome 插件,可捕捉咱们以后正在浏览的页面上显示的电子邮件 ID

它甚至容许咱们下载 CSV 或文本文件中的电子邮件 ID 列表:

BeautifulSoup 和正则表达式

仅当咱们只想从一页抓取数据时,以上解决方案才无效。然而,如果咱们心愿对多个网页执行雷同的步骤怎么办?

有许多网站能够通过免费为咱们做到这一点。但这里有个好消息——咱们还能够应用 Python 编写本人的 Web 爬虫!让咱们在上面的实时编码窗口中查看操作方法。

  • https://id.analyticsvidhya.co…://www.analyticsvidhya.com/blog/2019/10/web-scraping-hands-on-introduction-python

在 Python 中爬取图片

在本节中,咱们将从同一个 Goibibibo 网页抓取所有图片。第一步是导航到指标网站并下载源代码。接下来,咱们将应用 < img > 标签查找所有图像:

"""Web Scraping - Scrap Images"""

# importing required libraries
import requests
from bs4 import BeautifulSoup

# target URL
url = "https://www.goibibo.com/hotels/hotels-in-shimla-ct/"

headers = {'User-Agent': "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
    }

response = requests.request("GET", url, headers=headers)

data = BeautifulSoup(response.text, 'html.parser')

# find all with the image tag
images = data.find_all('img', src=True)

print('Number of Images:', len(images))

for image in images:
    print(image)

从所有图像标签中,仅抉择 src 局部。另外,请留神,酒店图片以 jpg 格局提供。因而,咱们将仅抉择那些:

# select src tag
image_src = [x['src'] for x in images]

# select only jp format images
image_src = [x for x in image_src if x.endswith('.jpg')]

for image in image_src:
    print(image)

当初咱们有了图像 URL 的列表,咱们要做的就是申请图像内容并将其写入文件中。确保关上文件“wb”(写二进制文件)模式


image_count = 1
for image in image_src:
    with open('image_'+str(image_count)+'.jpg', 'wb') as f:
        res = requests.get(image)
        f.write(res.content)
    image_count = image_count+1

你还能够按页码更新初始页面 URL,并重复申请它们以收集大量数据。

在页面加载时抓取数据

让咱们看一下 Steam 社区 Grant Theft Auto V Reviews 的网页。你会留神到网页的残缺内容不会一口气加载。

  • https://steamcommunity.com/ap…

咱们须要向下滚动以在网页上加载更多内容。这是网站后端开发人员应用的一种称为“提早加载”的优化技术。

然而对咱们来说,问题是,当咱们尝试从该页面抓取数据时,咱们只会失去该页面的无限内容:

一些网站还创立了“加载更多”按钮,而不是无休止的滚动想法。仅当你单击该按钮时,它将加载更多内容。内容无限的问题依然存在。因而,让咱们看看如何抓取这些网页。

导航到指标 URL 并关上“查看元素网络”窗口。接下来,点击从新加载按钮,它将为你记录网络,如图像加载,API 申请,POST 申请等的程序。

革除以后记录并向下滚动。你会留神到,向下滚动时,该网页正在发送更多数据的申请:


进一步滚动,你将看到网站发出请求的形式。查看以下 URL——仅某些参数值正在更改,你能够通过简略的 Python 代码轻松生成这些 URL:

你须要依照雷同的步骤来抓取和存储数据,办法是将申请一页一页地发送到每个页面。

尾注

这是应用功能强大的 BeautifulSoup 库对 Python 中的网络抓取进行的简略且对初学者敌对的介绍。诚实说,当我正在寻找一个新我的项目或须要一个现有我的项目的信息时,我发现网络抓取十分有用。

留神:如果你想以更结构化的模式学习本教程,咱们有一个收费课程,咱们将传授网络抓取 BeatifulSoup。你能够在此处查看—— 应用 Python 进行 Web 爬网简介。

  • https://courses.analyticsvidh…

如前所述,还有其余一些库可用于执行 Web 抓取。我很想听听你更喜爱的库的想法(即便你应用 R 语言!),以及你对该主题的教训。在上面的评论局部中通知我,咱们将与你分割!

原文链接:https://www.analyticsvidhya.c…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

正文完
 0