【转】淘宝评论爬取 python

本文介绍如何使用Python爬取天猫商品评论数据,包括分析页面请求、利用正则表达式提取评论内容并使用Pandas处理数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://blog.youkuaiyun.com/neuwangmingqiang/article/details/50234539

本文记录一下爬取天猫某商品的全过程,淘宝上面的店铺也是类似的做法,不赘述。主要是分析页面以及用Python实现简单方便的抓取。

使用的工具如下

Python 3——极其方便的编程语言。选择3.x的版本是因为3.x对中文处理更加友好。

Pandas——Python的一个附加库,用于数据整理。

IE 11——分析页面请求过程(其他类似的流量监控工具亦可)。

剩下的还有requests,re,这些都是Python自带的库。

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

实例页面(美的某热水器):http://detail.tmall.com/item.htm?id=41464129793
评论在哪里?

要抓取评论数据,首先得找到评论究竟在哪里。打开上述网址,然后查看源代码,发现里面并没有评论内容!那么,评论数据究竟在哪里呢?原来天猫使用了ajax加密,它会从另外的页面中读取评论数据。

这时候IE 11就发挥作用了(当然你也可以使用其他的流量监控工具),使用前,先打开上述网址,待页面打开后,清除一下IE 11的缓存、历史文件等,然后按F12,会出现如下界面
F12.png

这时候点击绿色的三角形按钮,启动网络流量捕获(或者直接按F5),然后点击天猫页面中的“累计评价”:
捕获.png
出现如下结果
捕获结果.png
在URL下面出现很多网址,而评论数据正隐藏在其中!我们主要留意类型为“text/html”或者“application/json”的网址,经过测试发现,天猫的评论在下面这个网址之中

http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&spuId=296980116&sellerId=1652490016&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=166UW5TcyMNYQwiAiwVQX1EeUR5RH5Cd0xiNGI%3D%7CUm5Ockt1SHxBe0B0SXNOdCI%3D%7CU2xMHDJxPk82UjVOI1h2VngRd1snQSJEI107F2gFfgRlAmRKakQYeR9zFGoQPmg%2B%7CVGhXd1llXGJfa1ZsV2NeZFljVGlLdUt2TXFOc0tyT3pHe0Z6QHlXAQ%3D%3D%7CVWldfS0SMgo3FysUNBonHyMdNwI4HStHNkVrPWs%3D%7CVmhIGCIWNgsrFykQJAQ6DzQAIBwiGSICOAM2FioULxQ0DjEEUgQ%3D%7CV25OHjAePgA0DCwQKRYsDDgHPAdRBw%3D%3D%7CWGFBET8RMQ04ACAcJR0iAjYDNwtdCw%3D%3D%7CWWBAED5%2BKmIZcBZ6MUwxSmREfUl2VmpSbVR0SHVLcU4YTg%3D%3D%7CWmFBET9aIgwsECoKNxcrFysSL3kv%7CW2BAED5bIw0tESQEOBgkGCEfI3Uj%7CXGVFFTsVNQw2AiIeJxMoCDQIMwg9az0%3D%7CXWZGFjhdJQsrECgINhYqFiwRL3kv%7CXmdHFzkXNws3DS0RLxciAj4BPAY%2BaD4%3D%7CX2ZGFjgWNgo1ASEdIxsjAz8ANQE1YzU%3D%7CQHtbCyVAOBY2Aj4eIwM%2FAToONGI0%7CQXhYCCYIKBMqFzcLMwY%2FHyMdKRItey0%3D%7CQntbCyULKxQgGDgEPQg8HCAZIxoveS8%3D%7CQ3paCiQKKhYoFDQIMggwEC8SJh8idCI%3D%7CRH1dDSMNLRIrFTUJMw82FikWKxUueC4%3D%7CRX5eDiAOLhItEzMOLhIuFy4VKH4o%7CRn5eDiAOLn5GeEdnW2VeYjQUKQknCSkQKRIrFyN1Iw%3D%3D%7CR35Dfl5jQ3xcYFllRXtDeVlgQHxBYVV1QGBfZUV6QWFZeUZ%2FX2FBfl5hXX1AYEF9XXxDY0J8XGBbe0IU&isg=B2E8ACFC7C2F2CB185668041148A7DAA&_ksTS=1430908138129_1993&callback=jsonp1994

 
  • 1
  • 2

是不是感觉长到晕了?不要紧,只需要稍加分析,就发现可以精简为以下部分

http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016&currentPage=1

 
  • 1
  • 2

我们发现天猫还是很慷慨的,评论页面的地址是很有规律的(像京东就完全没规律了,随机生成。),其中itemId是商品id,sellerid是卖家id,currentPage是页面号。
怎么爬取?

费了一番周折,终于找到评论在哪里了,接下来是爬取,怎么爬取呢?首先分析一下页面规律。
页面格式.png

我们发现页面数据是很规范的,事实上,它是一种被称为JSON的轻量级数据交换格式(大家可以搜索JSON),但它又不是通常的JSON,事实上,页面中的方括号[]里边的内容,才是一个正确的JSON规范文本。

下面开始我们的爬取,我使用Python中的requests库进行抓取,在Python中依次输入:

import requests as rq
url='http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016&currentPage=1'
myweb = rq.get(url)
 
  • 1
  • 2
  • 3

现在该页面的内容已经保存在myweb变量中了这里写代码片,我们可以用myweb.text查看文本内容。

接下来就是只保留方括号里边的部分,这需要用到正则表达式了,涉及到的模块有re。

import re
myjson = re.findall('\"rateList\":(\[.*?\])\,\"tags\"',myweb.text)[0]
 
  • 1
  • 2

呃,这句代码什么意思?懂Python的读者大概都能读懂它,不懂的话,请先阅读一下相关的正则表达式的教程。上面的意思是,在文本中查找下面标签

"rateList":[...],"tags"

 
  • 1
  • 2

找到后保留方括号及方括号里边的内容。为什么不直接以方括号为标签呢,而要多加几个字符?这是为了防止用户评论中出现方括号而导致抓取出错。

现在抓取到了myjson,这是一个标准的JSON文本了,怎么读取JSON?也简单,直接用Pandas吧。这是Python中强大的数据分析工具,用它可以直接读取JSON。当然,如果仅仅是为了读取JSON,完全没必要用它,但是我们还要考虑把同一个商品的每个评论页的数据都合并成一个表,并进行预处理等,这时候Pandas就非常方便了。

import pandas as pd
mytable = pd.read_json(myjson)
 
  • 1
  • 2

现在mytable就是一个规范的Pandas的DataFrame了:
mytable1.png
mytable2.png

如果有两个表mytable1和mytable2需要合并,则只要

pd.concat([mytable1, mytable2], ignore_index=True)
 
  • 1

等等。更多的操作请参考Pandas的教程。

最后,要把评论保存为txt或者Excel(由于存在中文编码问题,保存为txt可能出错,因此不妨保存为Excel,Pandas也能够读取Excel文件)

mytable.to_csv('mytable.txt')
mytable.to_excel('mytable.xls')
 
  • 1
  • 2

一点点结论

让我们看看一共用了几行代码?

import requests as rq
url='http://rate.tmall.com/list_detail_rate.htm?itemId=41464129793&sellerId=1652490016¤tPage=1'
myweb = rq.get(url)

import re
myjson = re.findall('\"rateList\":(\[.*?\])\,\"tags\"',myweb.text)[0]

import pandas as pd
mytable = pd.read_json(myjson)

mytable.to_csv('mytable.txt')
mytable.to_excel('mytable.xls')
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

九行!十行不到,我们就完成了一个简单的爬虫程序,并且能够爬取到天猫上的数据了!是不是跃跃欲试了?

当然,这只是一个简单的示例文件。要想实用,还要加入一些功能,比如找出评论共有多少页,逐页读取评论。另外,批量获取商品id也是要实现的。这些要靠大家自由发挥了,都不是困难的问题,本文只希望起到抛砖引玉的作用,为需要爬取数据的读者提供一个最简单的指引。

其中最困难的问题,应该是大量采集之后,有可能被天猫本身的系统发现,然后要你输入验证码才能继续访问的情况,这就复杂得多了,解决的方案有使用代理、使用更大的采集时间间隔或者直接OCR系统识别验证码等等,笔者也没有很好的解决办法。

原文地址:http://spaces.ac.cn/index.php/archives/3298/



### 使用Python进行淘宝评论网页抓取的最佳实践 #### 法律合规性和道德准则 在开始编写任何网络爬虫之前,务必阅读并遵守目标网站的服务条款以及所在国家/地区的法律法规。对于淘宝这样的大型电商平台,通常会严格限制自动化访问行为。因此,在实际操作前应先确认是否有合法途径获取所需数据。 #### 技术方案概述 为了高效稳定地完成这项任务,推荐采用`Selenium`配合浏览器驱动的方式模拟真实用户的交互过程来加载动态生成的内容;同时利用`BeautifulSoup`解析HTML文档结构提取有用信息[^1]。 #### 准备工作环境 安装必要的第三方库: ```bash pip install selenium beautifulsoup4 pandas openpyxl ``` 下载对应版本的ChromeDriver并本地已安装的Google Chrome匹配。 #### 编写脚本逻辑 下面给出一段简化版的代码框架用于示范目的: ```python from selenium import webdriver from bs4 import BeautifulSoup import time import pandas as pd def init_driver(): options = webdriver.ChromeOptions() # 设置无头模式运行(可选) options.add_argument('--headless') driver_path = 'path/to/chromedriver' # 替换成自己的chromedriver路径 return webdriver.Chrome(executable_path=driver_path, chrome_options=options) def fetch_reviews(driver, product_url): review_list = [] try: driver.get(product_url) while True: soup = BeautifulSoup(driver.page_source, "html.parser") reviews = soup.find_all('div', class_='review-item') # 假设这是存储每条评论节点的选择器 for item in reviews: user_name = item.select_one('.username').get_text(strip=True) rating = int(item.select_one('.rating')['class'][0][-2:]) comment_time = item.select_one('.time').get_text(strip=True) content = item.select_one('.content').get_text(strip=True).replace('\n', '') review_list.append({ 'User': user_name, 'Rating': rating, 'Time': comment_time, 'Content': content }) next_button = driver.find_element_by_css_selector(".next-page") # 同样假设这是翻页按钮的选择器 if not next_button.is_enabled() or 'disabled' in next_button.get_attribute('class'): break next_button.click() time.sleep(3) # 等待页面加载完毕再继续循环 except Exception as e: print(f"Error occurred during fetching data: {e}") finally: driver.quit() df = pd.DataFrame(review_list) output_file = './taobao_reviews.xlsx' df.to_excel(output_file, index=False) print(f"All done! Reviews saved to file '{output_file}'.") if __name__ == '__main__': url = input("Please enter the URL of the Taobao product page you want to scrape:") browser = init_driver() fetch_reviews(browser, url) ``` 这段程序实现了通过输入指定的商品链接地址后自动打开该页面,并尝试逐页读取消费者评价直至最后一页为止的功能。最终结果会被保存成Excel表格文件以便后续分析处理。 请注意以上CSS选择器仅为示意用途,请根据实际情况调整以适应具体网页布局变化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值