大多数网络抓取的数据来自动态网站,亚马逊和油管。这些网站根据用户输入提供交互式和响应式的用户体验。例如,当您访问油管帐户时,网站会根据您的输入呈现个性化的视频内容。因此,从动态网站抓取数据可能更具挑战性,因为数据会因用户交互而持续修改。

要从动态网站抓取数据,你需要使用高级技术,模仿用户与网站的交互,浏览和选择由JavaScript生成的特定内容,并处理异步JavaScript和XML (AJAX)请求。

在本指南中,您将了解如何使用名为Selenium的开源 Python 库抓取动态网站数据。

使用Selenium从动态网站抓取数据

在开始抓取数据之前,您需要了解将要使用的Python包:Selenium。

Selenium是什么?

Selenium是一个开源Python包和自动化测试框架,让您能在动态网站上执行各种操作或任务,包括打开/关闭对话框、在油管上搜索特定关键词或填写表单等。所有这些都可以在您首选的网络浏览器中执行。

当您将Selenium与Python结合使用时,只需使用Selenium Python包编写几行Python代码即可控制网络浏览器并自动从动态网站中提取数据。

现在您已经了解了Selenium的工作原理,我们开始使用吧!

新建一个Python项目

首先,您需要创建一个新的Python项目。创建一个名为data_scraping_project的目录,用于存储采集的所有数据和源代码文件。该目录会有两个子目录:

  • 脚本/scripts会包含从动态网站提取和采集数据的所有Python脚本。

  • 数据/data存储了从动态网站提取的所有数据。

安装Python软件包

创建data_scraping_project目录后,您需要安装以下Python软件包来帮助您从动态网站中抓取、采集和保存数据:

  • Selenium

  • Webdriver Manager将管理不同浏览器的二进制驱动程序。Webdriver提供了一组API,可运行不同的命令来与站点交互,从而更轻易地解析、加载和更改内容。

  • pandas将从动态网站抓取的数据保存到简单的CSV文件中。

您可以在终端运行以下pip命令来安装Selenium Python软件包:

Selenium将使用二进制驱动程序来控制您选择的网页浏览器。此Python包为以下受支持的网页浏览器提供二进制驱动程序:Chrome、Chromium、Brave、Firefox、IE、Edge和Opera。

接着在终端中运行以下pip命令来安装webdriver-manager :

图片

要安装pandas,请运行以下pip命令:

图片

你将抓取什么内容

在本文中,你将会 抓取YouTube 频道,名为 Programming with Mosh 和 Hacker News:

图片

您将从“与Mosh一起编程”油管频道抓取以下信息:

  • 视频标题。

  • 视频链接或URL。

  • 图片链接或URL。

  • 特定视频的观看次数。

  • 视频发布时间。

  • 特定油管视频链接中的评论。

从黑客新闻频道中,您将采集以下数据:

  • 文章标题。

  • 文章链接。

图片

现在您知道了抓取内容,那我们来创建一个新的Python脚本(即data_scraping_project/scripts/youtube_videos_list.py)。

想要直接取得海量成品数据集? Bright Data 拥有世界上最好的代理服务器,为数十家财富500强公司和超过20,000个客户提供服务。Bright Data除了是爬取网络公开数据的专家,同时还提供现成的数据集,内容含盖全球各大电商、社交媒体、商业信息平台等网站,现在就可以点击「阅读原文」申请下载免费数据集。

导入Python包

首先,您需要导入用于抓取、采集数据并将数据保存到CSV文件中的Python包:

图片

实例化Webdriver

要实例化Webdriver,您需要选择Selenium 要使用的浏览器(在本例中为谷歌Chrome),然后安装二进制驱动程序。

Chrome浏览器具有开发人员工具,能显示网页的HTML代码并识别 HTML元素以抓取和采集数据。要显示HTML代码,您需要在Chrome网页中单击右键,然后选择检查元素/Inspect Element 。

要安装Chrome的二进制驱动程序,请运行以下代码:

图片

Chrome的二进制驱动程序将安装在您的计算机上并自动实例化Webdriver。

使用Selenium抓取数据

要使用Selenium抓取数据,您需要在一个简单的Python变量中定义油管YouTube URL(即 网址)。您可以从此链接中采集到前文提到的除了特定YouTube URL评论以外的所有数据:

图片

Selenium 会自动在谷歌浏览器中加载YouTube链接。此外,还指定了一个时间范围(即十秒),以确保网页完全加载(包括所有HTML元素)。这有助于您抓取由JavaScript渲染的数据。

用ID和标签抓取数据

Selenium的优势之一是它可以使用网页上呈现的不同元素(包括ID和标签)提取数据。例如,您可以使用ID元素(即后标题)或标签(即h1和p) 来抓取数据:

图片

或者,如果您想从YouTube链接中抓取数据,需要使用网页上显示的ID。在网络浏览器中打开YouTube链接,然后右键单击并选择“检查”以识别 ID。接着使用鼠标查看页面,识别保存了频道上呈现的视频列表的 ID:

图片

使用Webdriver抓取在所识别ID内的数据。要根据ID属性查找HTML元素,请调用Selenium的find_element()方法并将By.ID作为第一个参数,将ID作为第二个参数。

要采集每个视频的标题和链接,您需要使用video-title-link ID属性。由于您要使用此ID属性采集多个HTML元素,因此需要使用find_elements()方法:

图片

此代码执行以下任务:

  • 采集在内容contents yID属性内的数据。

  • 从WebElement内容对象中采集元素具有video-title-link ID属性的所有HTML元素。

  • 创建两个列表来附加标题和链接。

  • 使用get_attribute()方法提取视频标题并传递标题。

  • 将视频标题附加到标题列表中。

  • 使用get_atribute()方法提取视频链接并将href作为参数传递。

  • 它将视频链接附加到链接列表中。

此时,所有视频标题和链接将位于两个Python列表中:标题titles和链接links。

接下来,您需要先抓取网页上可用图片的链接,再单击YouTube视频链接观看视频。要抓取此图片链接,您需要调用 find_elements () Selenium来查找所有 HTML 元素,并将By.TAG_NAME作为第一个参数,将标签名称作为第二个参数:

图片

此代码从名为contents的WebElement对象中采集带有img标签名称的所有HTML元素。它还创建了一个列表来附加图片链接,并使用get_attribute()方法提取链接,并将src作为参数传递。最后,此代码将图片链接附加到img_links列表中。

您还可以使用ID和标签名称为每个YouTube视频抓取更多数据。在YouTube URL的网页上,您应该能够看到页面上列出每个视频的观看次数和发布时间。要提取这些数据,您需要采集所有具有metadata-line ID的HTML元素,然后从具有span标签名称的HTML元素中采集数据:

图片

此代码块从WebElement内容对象中采集ID属性为metadata-line的所有HTML元素,并创建列表以附加来自span标签的数据,包含浏览量和发布时间。

代码块还从名为meta_data_elements的WebElement 对象中采集标签名称为span的所有HTML 元素,并创建一个包含此span数据的列表。然后,它从span HTML元素中提取文本数据并将其附加到span_data列表中。最后,它将span_data列表中的数据附加到meta_data中。

从span HTML元素中提取的数据如下所示:

图片

接下来,您需要创建两个Python列表,将浏览量和发布时间分别保存

图片

这一步,您创建了两个从meta_data中提取数据的Python列表,并将每个子列表的浏览量附加到浏览列表view_list,将发布时间附加到发布列表published_list。

至此,您已经抓取了视频标题、视频页面URL、图片URL、浏览量及视频发布时间数据。您可以使用pandas Python包将此数据保存到pandas DataFrame中。使用以下代码将标题、链接、图片链接、浏览列表和发布列表中的数据保存到pandas DataFrame中:

图片

在pandas DataFrame中抓取的数据如下所示:

图片

保存的数据通过to_csv()从pandas导出到名为youtube_data.csv的CSV文件中。

现在您可以运行youtube_videos_list.py,确保一切正常。

使用CSS选择器抓取数据

Selenium还可以根据HTML元素中的特定模式,使用网页上的CSS 选择器提取数据。CSS选择器根据ID、标签名、class类或其他属性来定位特定元素。例如,这里的HTML页面有一些div元素,其中一个类名为“inline-code” :

图片

您可以使用CSS选择器来查找网页上标签名为div、类名为“’inline-code”`的HTML元素。您可以应用相同的方法从YouTube视频的评论部分提取评论。

现在,让我们使用CSS选择器来采集在此YouTube视频上发布的评论。您可以在以下标签和类名下找到YouTube的评论部分:

图片

我们来创建一个新脚本(即data_scraping_project/scripts/youtube_video_comments.py)。像之前一样导入所有必要的包,并添加以下代码以自动启动 Chrome网络浏览器,浏览YouTube视频URL,然后使用CSS选择器抓取评论:

图片

这段代码实例化了Chrome驱动程序并定义 YouTube 视频链接以抓取发布的评论。然后,此代码在浏览器中加载网页,并等待十秒,直到与CSS选择器匹配的HTML元素可用。

接下来,使用名为ytd-comment-thread-renderer.ytd-item-section-renderer的CSS选择器采集所有评论HTML元素,并将所有评论元素保存在comment_blocks WebElement对象中。

然后,您可以使用ID author-text提取作者姓名,并使用ID content-text提取评论文本,从comment_blocks WebElement对象的每个评论中采集数据:

图片

这段代码指定了作者和评论的ID。然后创建了两个Python列表来添加作者姓名和评论文本。该代码从WebElement对象中采集具有指定ID属性的每个HTML元素,并将数据附加到Python列表。

最后,它将抓取的数据保存到pandas DataFrame中,并将数据导出到名为youtube_comments_data.csv的 CSV文件中。在pandas DataFrame中,前十行的作者和评论如下所示:

图片

使用Class类名抓取数据

除了使用CSS选择器抓取数据之外,您还可以根据特定的类名提取数据。要使用Selenium根据类名属性查找HTML元素,您需要调用find_element()方法,将By.CLASS_NAME作为第一个参数传递,将类名作为第二个参数。

在本节中,您将使用类名来采集黑客咨询上发布的文章标题和链接。在此网页上,包含每篇文章标题和链接的HTML元素都有一个titleline类名,如网页代码中所示:

图片

创建一个新的Python脚本(即data_scraping_project/scripts/hacker_news.py),导入所有必要的包,并添加以下Python代码来抓取发布在黑客咨询页面上每篇文章的标题和链接:

图片

这段代码将定义网页的URL,自动启动Chrome网络浏览器,然后浏览黑客咨询的URL。并等待十秒,直到匹配类名的HTML 元素可用。

然后,此代码会创建两个Python列表来附加每篇文章的标题和链接。它还从WebElement驱动程序对象中采集具有titleline类名的每个HTML元素,并从Story_elements WebElement 对象中提取每篇文章的标题和链接。

后,此代码将文章标题追加到titles列表,并从story_element对象中采集具有a标签名的HTML元素。它使用get_attribute()方法提取链接,并将链接附加到links列表。

接下来,您需要使用pandas的to_csv()方法导出抓取的数据。您会将标题和链接导出到名为hacker_news_data.csv的CSV文件中,并将数据保存在目录:

图片

以下是前五行的标题和链接在pandas DataFrame中的显示方式:

图片

如何处理无限滚动Infinite Scrolls

当您滚动到页面底部时,一些动态网页会加载附加内容。如果您不滚动到底部,Selenium可能只会抓取屏幕上可见的数据。

要抓取更多数据,您需要指示Selenium滚动到页面底部,等待新内容加载,然后自动抓取您想要的数据。例如,以下Python脚本将滚动浏览Python图书的前40个结果并提取链接:

图片

图片

图片

这段代码将要使用的Python包导入并实例化,打开了Chrome浏览器。然后导航到网页并创建一个Python列表来附加每个搜索结果的链接。

通过运行return document.body.scrollHeight脚本获取当前页面的高度,并设置要采集的链接数量。接下来,只要图书数量book_count变量的值大于图书列表book_list的长度,页面就会继续向下滚动,并等待五秒钟加载。

通过运行return document.body.scrollHeight脚本计算网页的新高度,并检查是否到达页面底部。如果是,则终止循环;否则,将更新last_height并继续向下滚动页面。最后,此代码从WebElement对象中采集标签名称为a的HTML元素,提取链接并将其附加到链接列表中。采集链接后,Webdriver将关闭。

请注意:如果页面能够无限滚动,为了让脚本在某个时刻结束,您必须设置要抓取的项目总数。否则,您的代码将继续执行。

使用亮数据Bright Data抓取网页

虽然使用像 Selenium 这样的开源爬虫工具可以抓取数据,但它们往往缺乏支持。此外,该过程可能复杂且耗时。如果您正在寻找强大且可靠的网络爬取解决方案,您应该考虑 Bright Data。

想要直接取得海量成品数据集? Bright Data 拥有世界上最好的代理服务器,为数十家财富500强公司和超过20,000个客户提供服务。Bright Data除了是爬取网络公开数据的专家,同时还提供现成的数据集,内容含盖全球各大电商、社交媒体、商业信息平台等网站,现在就可以点击亮数据主页的「数据集产品」申请下载免费数据集。

图片

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐