开篇寄语
有关使用Python编程语言编写爬虫脚本,伯衡君此前已经有所介绍,具体可以参看下方的前情提要。而本篇文章则是利用一个名为Selenium的依赖库,结合Chrome driver,以无头浏览器模拟用户访问网站,更自然爬取网站数据,那么该如何操作呢?请看本篇文章。
前情提要
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(一)》
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(二)》
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(三)》
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(四)》
- 《来和伯衡君一起快速入门Python爬虫——Beautifulsoup篇(五)》
内容详情
让我们看看如何在一个网站的多个页面中导航并使用 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 抓取网站并获取大量数据的方式。在此之后,您可以使用这些数据进行多个非结构化数据分析并得出有趣的结论。
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号