Python爬虫之Selenium使用无头浏览器来爬取数据

已收录   阅读次数: 1,242
2022-02-1010:15:23 发表评论
摘要

有关使用Python编程语言编写爬虫脚本,伯衡君此前已经有所介绍,具体可以参看下方的前情提要。而本篇文章则是利用一个名为Selenium的依赖库,结合Chrome driver,以无头浏览器模拟用户访问网站,更自然爬取网站数据,那么该如何操作呢?请看本篇文章……

分享至:
Python爬虫之Selenium使用无头浏览器来爬取数据

开篇寄语

有关使用Python编程语言编写爬虫脚本,伯衡君此前已经有所介绍,具体可以参看下方的前情提要。而本篇文章则是利用一个名为Selenium的依赖库,结合Chrome driver,以无头浏览器模拟用户访问网站,更自然爬取网站数据,那么该如何操作呢?请看本篇文章。

前情提要

内容详情

让我们看看如何在一个网站的多个页面中导航并使用 Python 中的 Selenium 抓取大量数据。

在开始之前,请阅读以下有关安装所需软件包的说明:

  • Python3
  •  Selenium package

安装Selenium package,使用以下命令:

pip install selenium
  • Chrome 驱动程序:从此处安装最新版本的 chrome 驱动程序。请注意,为此,您需要在 PC 上安装 Google Chrome。下载地址:Chrome Driver

在抓取之前我们需要做的第一件事是了解网页的结构。我们的目标是爬取 Edmunds.com——一个汽车论坛。人们在论坛上发布他们对不同汽车的评论并做出购车决定。

我们要讨论的主题将是入门级豪华汽车品牌。我们将抓取用户 ID 和评论并将它们导出到 CSV 文件中以供进一步分析。

让我们从导入重要的包开始

#Importing packages
from selenium import webdriver
import pandas as pd

现在我们将创建一个新的 Google Chrome 实例来打开所需的 URL。

driver = webdriver.Chrome('Path in your computer where you have installed chromedriver')

然后我们将访问谷歌浏览器并打开网站。

driver.get('https://forums.edmunds.com/discussion/2864/general/x/entry-level-luxury-performance-sedans/p702')

检查html情况,可以发现用户 id:查看用户 id,我们可以看到突出显示的文本代表@id 的 XML 代码。

用户 ID 的 XML 路径 (XPath) 如下所示。请注意,XML 路径包含一个评论 id,它唯一地表示网站上的每条评论。

//*[@id=”Comment_5561090"]/div/div[2]/div[1]/span[1]/a[2]

查看上图,可以看到 XPath 包含用户 id 'dino001'。

那么,我们如何提取 XPath 中的值呢?

Selenium 有一个名为“find_elements_by_xpath”的函数。我们将 XPath 传递给这个函数并获得一个 selenium 元素。

然后,我们可以使用“text”函数提取 XPath 中的文本。在我们的例子中,文本基本上是用户 ID('dino001')。

userid_element = driver.find_elements_by_xpath('//*[@id="Comment_5561090"]/div/div[2]/div[1]/span[1]/a[2]')[0]
userid = userid_element.text

评论:现在,让我们了解如何提取每个用户的评论。

您可以在下面找到用户评论的 XPath

//*[@id="Comment_5561090"]/div/div[3]/div/div[1]

一旦我们在 XPath 中获得了评论 id,我们就可以从上面的 XPath 中提取评论,就像我们在用户 id 的情况下所做的那样。

user_message = driver.find_elements_by_xpath('//*[@id="Comment_5561090"]/div/div[3]/div/div[1]')[0]
comment = user_message.text

因此,我们已经知道如何从网页中抓取独特的元素。现在让我们探索如何为 5000 个用户提取这些项目。

如上所述,我们将使用评论 ID,每个评论都是唯一的。如果我们看到整个评论块的 XPath,我们会看到它有一个与之关联的评论 id。

//*[@id="Comment_5561090"]

以下代码片段将帮助我们提取网页上的所有评论 ID。我们将再次在上述 XPath 上使用函数“find_elements_by_xpath”并从“id”属性中提取 id。

ids = driver.find_elements_by_xpath("//*[contains(@id,'Comment_')]")
comment_ids = []
for i in ids:
comment_ids.append(i.get_attribute('id'))

上面的代码将为我们提供来自网页的所有评论 ID 的列表。

现在是时候将所有这些整合到一个代码中以提取 5000 条评论了。我们可以通过遍历我们在前面代码中找到的所有评论 id 来提取网页上每个用户的用户 id 和评论。

下面是提取所有评论的代码片段:

driver = webdriver.Chrome('C:/Users/bandi/Desktop/Text Analytics/TA Session/chromedriver_win32/chromedriver')
driver.get('https://forums.edmunds.com/discussion/2864/general/x/entry-level-luxury-performance-sedans/p702')
comments = pd.DataFrame(columns = ['user_id','comments']) 
ids = driver.find_elements_by_xpath("//*[contains(@id,'Comment_')]")
comment_ids = []
for i in ids:
    comment_ids.append(i.get_attribute('id'))
for x in comment_ids:
    #Extract user ids from each user on a page
    userid_element = driver.find_elements_by_xpath('//*[@id="' + x +'"]/div/div[2]/div[1]/span[1]/a[2]')[0]
    userid = userid_element.text
    #Extract Message for each user on a page
    user_message = driver.find_elements_by_xpath('//*[@id="' + x +'"]/div/div[3]/div/div[1]')[0]
    comment = user_message.text
    #Adding userid and comment for each user in a dataframe    
    comments.loc[len(comments)] = [userid,comment]

如果您检查我们的 URL 有页码,从 702 开始。因此,我们可以通过简单地更改 URL 中的页码来提取更多评论,直到我们获得所需数量的评论。

这就是您在 Python 中使用 Selenium 抓取网站并获取大量数据的方式。在此之后,您可以使用这些数据进行多个非结构化数据分析并得出有趣的结论。

  • 我的微信
  • 微信扫一扫加好友
  • weinxin
  • 我的微信公众号
  • 扫描关注公众号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: