最近在写关于评论数据主题建模和情感分析的作业,本来想用八爪鱼直接爬TapTap的评论数据,但是自动识别网页总是定位错误,还是回归BeautifulSoup和Request来进行评论内容的爬取,具体操作步骤如下
导入所需的库
import re
import requests
import pandas as pd
from bs4 import BeautifulSoup
BeautifulSoup库:BeautifulSoup是基于re开发的,可以从HTML或XML文件中提取数据的python库;它能够通过转换器实现惯用的文档导航、查找、修改文档的方式 ,可以提高提取数据的效率和爬虫开发的效率。
Requsts库:equests是基于urllib,使用Apache2 Licensed许可证开发的HTTP库。其在python内置模块的基础上进行了高度封装,使得Requests能够模拟浏览器的需求,轻松完成浏览器相关的任何操作。
获取User-Agent
首先进入需要爬取的评论界面,复制网页URL,这里以无限暖暖 - 游戏评价 - TapTap为例,进入界面后,按F12或者鼠标右键选择检查,打开控制台,选择网络。
刷新网页,即可看到刷新出review
点击review,拉到最下方,可以看到User-Agent,复制下来,它很重要
分析HTML结构
Ctrl+Shift+C,选择页面中的评论数据
复制 outerHTML,这里太长了就只用图片来表示
--------------------------------------------------------------------------------------------------------------------------------
(不过这里用不到)
我们可以发现,所有的评论都嵌套在text-box__content中,就find_all来匹配就好了。我一开始误以为嵌套在heading-m14-w14中,结果爬出来的评论数据每一条评论都重复,大家不要犯这种低智的错啊。
爬虫代码
# 定义函数 get_taptap_reviews,用于爬取评论
def get_taptap_reviews(url, user_agent, max_reviews=300):
# 设置请求头,模拟浏览器访问
headers = {'User-Agent': user_agent}
reviews = []
page = 1
# 循环直到获取到足够的评论或者没有更多的评论页面
while len(reviews) < max_reviews:
# 构建评论页面的URL
review_url = f"{url}?page={page}"
# 发送GET请求
response = requests.get(review_url, headers=headers)
# 解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# 查找所有的评论div
review_divs = soup.find_all('div', class_='text-box__content')
# 如果没有找到评论,则退出循环
if len(review_divs) == 0:
break
# 遍历每个评论div
for review_div in review_divs:
# 获取评论文本并去除前后空白
review = review_div.text.strip()
# 将评论添加到列表中
reviews.append(review)
# 如果已经获取到足够的评论,则退出循环
if len(reviews) >= max_reviews:
break
# 翻页
page += 1
# 返回评论列表
return reviews
# 定义函数 save_reviews_to_excel,用于将评论保存到Excel文件
def save_reviews_to_excel(reviews, filename='taptap.xlsx'):
# 将评论列表转换为DataFrame
df = pd.DataFrame(reviews, columns=['comment'])
# 将DataFrame保存到Excel文件
df.to_excel(filename, index=False)
主程序如下
# 主程序入口
if __name__ == "__main__":
# 目标网页URL
url = "https://www.taptap.cn/app/247283/review"
# 模拟浏览器的User-Agent
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
# 设置最大爬取评论数为300
max_reviews = 300
# 调用函数爬取评论
reviews = get_taptap_reviews(url, user_agent, max_reviews)
# 调用函数将评论保存到Excel文件
save_reviews_to_excel(reviews)
在实际操作的过程中,需要将user_agent换成你自己的。
完整代码
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
# 定义函数 get_taptap_reviews,用于爬取评论
def get_taptap_reviews(url, user_agent, max_reviews=300):
# 设置请求头,模拟浏览器访问
headers = {'User-Agent': user_agent}
reviews = []
page = 1
# 循环直到获取到足够的评论或者没有更多的评论页面
while len(reviews) < max_reviews:
# 构建评论页面的URL
review_url = f"{url}?page={page}"
# 发送GET请求
response = requests.get(review_url, headers=headers)
# 解析HTML内容
soup = BeautifulSoup(response.text, 'html.parser')
# 查找所有的评论div
review_divs = soup.find_all('div', class_='text-box__content')
# 如果没有找到评论,则退出循环
if len(review_divs) == 0:
break
# 遍历每个评论div
for review_div in review_divs:
# 获取评论文本并去除前后空白
review = review_div.text.strip()
# 将评论添加到列表中
reviews.append(review)
# 如果已经获取到足够的评论,则退出循环
if len(reviews) >= max_reviews:
break
# 翻页
page += 1
# 返回评论列表
return reviews
# 定义函数 save_reviews_to_excel,用于将评论保存到Excel文件
def save_reviews_to_excel(reviews, filename='taptap.xlsx'):
# 将评论列表转换为DataFrame
df = pd.DataFrame(reviews, columns=['comment'])
# 将DataFrame保存到Excel文件
df.to_excel(filename, index=False)
# 主程序入口
if __name__ == "__main__":
# 目标网页URL
url = "https://www.taptap.cn/app/247283/review"
# 模拟浏览器的User-Agent
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
# 设置最大爬取评论数为300
max_reviews = 300
# 调用函数爬取评论
reviews = get_taptap_reviews(url, user_agent, max_reviews)
# 调用函数将评论保存到Excel文件
save_reviews_to_excel(reviews)