通过抓取淘宝评论为例讲解Python爬取ajax动态生成的数据(经典)
在网上购物中,淘宝是 和最大的在线购物平台之一。在许多情况下,消费者在购买商品之前需要了解其他客户的购买体验和他们对商品的评价。淘宝商品页面通常会显示其他消费者对该商品的评价和评论。这些评论是通过Ajax动态生成的,因此在没有适当的技术支持的情况下很难直接爬取。
在本文中,我们将学习如何使用Python来爬取淘宝评论,并从获取的数据中提取有用的信息。本文使用Requests库和BeautifulSoup库爬取评论数据,代码语法易懂,适用于初学Python的爬虫学习者。
步:分析页面源代码
在爬取动态生成数据前,我们要先找出Ajax请求的地址和对应的参数。为了完成这一步,我们需要使用浏览器开发者工具来分析页面源代码。
在浏览器中打开一个淘宝商品页面,右键单击并选择“检查元素”来打开开发人员工具。在开发者工具中找到“Network”选项卡并选择“XHR”子选项卡。在此选项卡下,我们可以找到页面Ajax请求的地址。
在此例中,我们可以找到请求地址为:
https://rate.tmall.com/list_detail_rate.htm?itemId=xxxxxx&sellerId=xxxxxx¤tPage=1
其中,itemId和sellerId参数是 的商品和卖家标识符号。currentPage参数用于分页,每个页面最多显示20个评论。
第二步:将分析数据转化为Python代码
现在我们已经知道了评论数据请求的地址和参数。接下来,我们需要将此信息转换为Python代码,以便我们可以使用Requests库来访问URL并获取数据。
运行下面的代码以获取该商品的 页评论数据:
import requests
from bs4 import BeautifulSoup
item_id = 'xxxxxx' # 填入商品ID
seller_id = 'xxxxxx' # 填入卖家ID
url = 'https://rate.tmall.com/list_detail_rate.htm?itemId={}&sellerId={}¤tPage=1'.format(item_id, seller_id)
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
comments = soup.find_all('div', {'class': 'tm-rate-content'})
for comment in comments:
print(comment.text.strip())
当运行该代码时,控制台将输出该商品的 页评论。在这个例子中,我们使用了Requests库来获取评论页面的HTML源代码。随后,使用BeautifulSoup库从返回的HTML中提取评论的内容。我们的业务逻辑是查找在div标签中,类名为tm-rate-content的所有元素,并打印他们的内容。
第三步:下载和解析JSON数据
通过网页请求提交的评论数据是一个JSON文件,其中包含许多有用信息。我们需要将数据从JSON文件中提取出来并重新格式化以便进一步使用。
我们可以使用requests库中的json()方法将JSON格式数据转换为Python对象。我们还使用了bs4库的findAll方法查找评论中的所有内容。解析JSON数据包含两个步骤。首先,获取JSON文件的URL。其次,使用requests库和json库解析文件内容。
> 注意:我们还需要使用'rateCount'来获取前x条评论。例如,如果我们需要获取前100条评论信息,则设置count = 100。
import requests
import json
from bs4 import BeautifulSoup
item_id = 'xxxxxx' # 填入商品ID
seller_id = 'xxxxxx' # 填入卖家ID
count = 100 # 填入需要爬取的评论数量
url = 'https://rate.tmall.com/list_detail_rate.htm?itemId={}&sellerId={}¤tPage=1&rateType=3&orderType=sort_weight&append=0&content=1&tagId=&posi=&picture=&auctionSku=&ua=098%23E1hvNpvRvBfvUpCkvvvvvjiPPiOkOjrPRLlj1jthPmPzuDtj3qWtjSzzjF5jR2V3RphvCvvGCvpvRVpvERrvuHmHppMvpZCvvpvvPmmphvvvv2MMvvmUrnphvmvv9UUmCnCW4WM8y73x4G5rNKirCkn8sHfzJofcOQ0qZWHfUtW4P%2Ba%2BxZZguC7LmJXVn7JMYRyv9wTDwA5T%2Ffjvh4jz%2BJKEkzqYzC6Q9Z84RF%2Frl1lIl6Od8%2FCEi9FiLZv2m7euRfNpkjQckcIv1vpvhvvvGCvvpvvUmmphvCvpvvv2yCvhCvphvCvv%2BRYzpvpvIvvvvvvvyCvhCvGCvpCGBtvpvhvvvvBf9phv8hCvvpvZvCv9vv2Rmm&isg=BFpbIgOS2GRJj-1lWakDhYPplTmnd26kHtt3dpIfW4pJ6YEzzUPvb-53J93lC1w-&needFold=0&_ksTS=1588985721393_3574&callback=jsonp3575'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36',
'Referer': 'https://detail.tmall.com/item.htm?id={}'.format(item_id)
}
response = requests.get(url, headers=headers)
json_data = json.loads(response.text[14:-1])['rateDetail']['rateList']
comments = []
for i in range(count):
if i < len(json_data):
comment = json_data[i]['rateContent']
comments.append(comment)
else:
break
print(comments)
第四步:文本清理和分析
现在,我们已经成功地获取淘宝评论,但是评论中的文本内容可能含有不必要的字符,如“
”和“\r”。在这一步,我们需要将文本进行清理并分析。一个常见的去除无用字符的方法是使用正则表达式。
`Python
import requests
import json
import re
from bs4 import BeautifulSoup
item_id = 'xxxxxx' # 填入商品ID
seller_id = 'xxxxxx' # 填入卖家ID
count = 100 # 填入需要爬取的评论数量
url = 'https://rate.tmall.com/list_detail_rate.htm?itemId={}&sellerId={}¤tPage=1&rateType=3&orderType=sort_weight&append=0&content=1&tagId=&posi=&picture=&auctionSku=&ua=098%23E1hvNpvRvBfvUpCkvvvvvjiPPiOkOjrPRLlj1jthPmPzuDtj3qWtjSzzjF5jR2V3RphvCvvGCvpvRVpvERrvuHmHppMvpZCvvpvvPmmphvvvv2MMvvmUrnphvmvv9UUmCnCW4WM8y73x4G5rNKirCkn8sHfzJofcOQ0qZWHfUtW4P%2Ba%2BxZZguC7LmJXVn7JMYRyv9wTDwA5T%2Ffjvh4jz%2BJKEkzqYzC6Q9Z84RF%2Frl1lIl6Od8%2FCEi9FiLZv2m7euRfNpkjQckcIv1vpvhvvvGCvvpvvUmmphvCvpvvv2yCvhCvphvCvv%2BRYzpvpvIvv
