基于Python获取亚马逊的评论信息的处理

文章目录

    • 一、分析亚马逊的评论请求
    • 二、获取亚马逊评论的内容
    • 三、亚马逊评论信息的处理
    • 四、代码整合
      • 4.1 代理设置
      • 4.2 while循环翻页
    • 总结
      • 关于Python技术储备
        • 一、Python所有方向的学习路线
        • 二、Python基础学习视频
        • 三、精品Python学习书籍
        • 四、Python工具包+项目源码合集
        • ①Python工具包
        • ②Python实战案例
        • ③Python小游戏源码
        • 五、面试资料
        • 六、Python兼职渠道


上次亚马逊的商品信息都获取到了,自然要看一下评论的部分。用户的评论能直观的反映当前商品值不值得购买,亚马逊的评分信息也能获取到做一个评分的权重。

亚马逊的评论区由用户ID,评分及评论标题,地区时间,评论正文这几个部分组成,本次获取的内容就是这些。

测试链接:https://www.amazon.it/product-reviews/B08GHGTGQ2/ref=cm_cr_arp_d_paging_btm_14?ie=UTF8&pageNumber=14&reviewerType=all_reviews&pageSize=10&sortBy=recent

一、分析亚马逊的评论请求

首先打开开发者模式的Network,Clear清屏做一次请求:

在这里插入图片描述

你会发现在Doc中的get请求正好就有我们想要的评论信息。

可是真正的评论数据可不是全部都在这里的,页面往下翻,有个翻页的button:

点击翻页请求下一页,在Fetch/XHR选项卡中多了一个新的请求,刚才的Doc选项卡中并无新的get请求。这下发现了所有的评论信息是XHR类型的请求。

获取到post请求的链接和payload数据,里面含有控制翻页的参数,真正的评论请求已经找到了。

这一堆就是未处理的信息,这些请求未处理的信息里面,带有data-hook=\"review\"的就是带有评论的信息。分析完毕,下面开始一步一步去写请求。

二、获取亚马逊评论的内容

首先拼凑请求所需的post参数,请求链接,以便之后的自动翻页,然后带参数post请求链接:

headers = {'authority': 'www.amazon.it',"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.9","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",
}page = 1
post\_data = {"sortBy": "recent","reviewerType": "all\_reviews","formatType": "","mediaType": "","filterByStar": "","filterByLanguage": "","filterByKeyword": "","shouldAppend": "undefined","deviceType": "desktop","canShowIntHeader": "undefined","pageSize": "10","asin": "B08GHGTGQ2",
}
# 翻页关键payload参数赋值
post\_data\["pageNumber"\] = page,
post\_data\["reftag"\] = f"cm\_cr\_getr\_d\_paging\_btm\_next\_{page}",
post\_data\["scope"\] = f"reviewsAjax{page}",
# 翻页链接赋值
spiderurl=f'https://www.amazon.it/hz/reviewsrender/ajax/reviews/get/ref=cm\_cr\_getr\_d\_paging\_btm\_next\_{page}'
res = requests.post(spiderurl,headers=headers,data=post\_data)
if res and res.status\_code == 200:res = res.content.decode('utf-8')print(res)

现在已经获取到了这一堆未处理的信息,接下来开始对这些数据进行处理。

三、亚马逊评论信息的处理

上图的信息会发现,每一段的信息都由“&&&”进行分隔,而分隔之后的每一条信息都是由’“,”'分隔开的:

所以用python的split方法进行处理,把字符串分隔成list列表:

\# 返回值字符串处理
contents = res.split('&&&')
for content in contents:infos = content.split('","')

由’“,”'分隔的数据通过split处理生成新的list列表,评论内容是列表的最后一个元素,去掉里面的"\“,”\n"和多余的符号,就可以通过css/xpath选择其进行处理了:

for content in contents:infos = content.split('","')info = infos\[-1\].replace('"\]','').replace('\\\\n','').replace('\\\\','')# 评论内容判断if 'data-hook="review"' in info:sel = Selector(text=info)data = {}data\['username'\] = sel.xpath('//span\[@class="a-profile-name"\]/text()').extract\_first() #用户名data\['point'\] = sel.xpath('//span\[@class="a-icon-alt"\]/text()').extract\_first() #评分data\['date'\] = sel.xpath('//span\[@data-hook="review-date"\]/text()').extract\_first() #日期地址data\['review'\] = sel.xpath('//span\[@data-hook="review-title"\]/span/text()').extract\_first() #评价标题data\['detail'\] = sel.xpath('//span\[@data-hook="review-body"\]').extract\_first() #评价内容image = sel.xpath('div\[@class="review-image-tile-section"\]').extract\_first()data\['image'\] = image if image else "not image" #图片print(data)

四、代码整合

4.1 代理设置

稳定的IP代理是你数据获取最有力的工具。目前国内还是无法稳定的访问亚马逊,会出现连接失败的情况。我这里使用的ipidea代理请求的意大利地区的亚马逊,可以通过账密和api获取代理,速度还是非常稳定的。

地址:http://www.ipidea.net/?utm-source=csdn&utm-keyword=?wb

下面的代理获取的方法:

\# api获取ipdef getApiIp(self):# 获取且仅获取一个ip------意大利api\_url = '获取代理地址'res = requests.get(api\_url, timeout=5)try:if res.status\_code == 200:api\_data = res.json()\['data'\]\[0\]proxies = {'http': 'http://{}:{}'.format(api\_data\['ip'\], api\_data\['port'\]),'https': 'http://{}:{}'.format(api\_data\['ip'\], api\_data\['port'\]),}print(proxies)return proxieselse:print('获取失败')except:print('获取失败')

4.2 while循环翻页

while循环进行翻页,评论最大页数是99页,99页之后就break跳出while循环:

 def getPLPage(self):while True:# 翻页关键payload参数赋值self.post\_data\["pageNumber"\]= self.page,self.post\_data\["reftag"\] = f"cm\_cr\_getr\_d\_paging\_btm\_next\_{self.page}",self.post\_data\["scope"\] = f"reviewsAjax{self.page}",# 翻页链接赋值spiderurl = f'https://www.amazon.it/hz/reviews-render/ajax/reviews/get/ref=cm\_cr\_getr\_d\_paging\_btm\_next\_{self.page}'res = self.getRes(spiderurl,self.headers,'',self.post\_data,'POST',check)#自己封装的请求方法if res:res = res.content.decode('utf-8')# 返回值字符串处理contents = res.split('&&&')for content in contents:infos = content.split('","')info = infos\[-1\].replace('"\]','').replace('\\\\n','').replace('\\\\','')# 评论内容判断if 'data-hook="review"' in info:sel = Selector(text=info)data = {}data\['username'\] = sel.xpath('//span\[@class="a-profile-name"\]/text()').extract\_first() #用户名data\['point'\] = sel.xpath('//span\[@class="a-icon-alt"\]/text()').extract\_first() #评分data\['date'\] = sel.xpath('//span\[@data-hook="review-date"\]/text()').extract\_first() #日期地址data\['review'\] = sel.xpath('//span\[@data-hook="review-title"\]/span/text()').extract\_first() #评价标题data\['detail'\] = sel.xpath('//span\[@data-hook="review-body"\]').extract\_first() #评价内容image = sel.xpath('div\[@class="review-image-tile-section"\]').extract\_first()data\['image'\] = image if image else "not image" #图片print(data)if self.page <= 99:print('Next Page')self.page += 1else:break

最后的整合代码:

\# coding=utf-8
import requests
from scrapy import Selectorclass getReview():page = 1headers = {'authority': 'www.amazon.it',"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,\*/\*;q=0.8,application/signed-exchange;v=b3;q=0.9","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36",}post\_data = {"sortBy": "recent","reviewerType": "all\_reviews","formatType": "","mediaType": "","filterByStar": "","filterByLanguage": "","filterByKeyword": "","shouldAppend": "undefined","deviceType": "desktop","canShowIntHeader": "undefined","pageSize": "10","asin": "B08GHGTGQ2",#post\_data中asin参数目前写死在#"https://www.amazon.it/product-reviews/B08GHGTGQ2?ie=UTF8&pageNumber=1&reviewerType=all\_reviews&pageSize=10&sortBy=recent"#这个链接里,不排除asin值变化的可能,如要获取get请求即可def getPLPage(self):while True:# 翻页关键payload参数赋值self.post\_data\["pageNumber"\]= self.page,self.post\_data\["reftag"\] = f"cm\_cr\_getr\_d\_paging\_btm\_next\_{self.page}",self.post\_data\["scope"\] = f"reviewsAjax{self.page}",# 翻页链接赋值spiderurl = f'https://www.amazon.it/hz/reviews-render/ajax/reviews/get/ref=cm\_cr\_getr\_d\_paging\_btm\_next\_{self.page}'res = self.getRes(spiderurl,self.headers,'',self.post\_data,'POST',check)#自己封装的请求方法if res:res = res.content.decode('utf-8')# 返回值字符串处理contents = res.split('&&&')for content in contents:infos = content.split('","')info = infos\[-1\].replace('"\]','').replace('\\\\n','').replace('\\\\','')# 评论内容判断if 'data-hook="review"' in info:sel = Selector(text=info)data = {}data\['username'\] = sel.xpath('//span\[@class="a-profile-name"\]/text()').extract\_first() #用户名data\['point'\] = sel.xpath('//span\[@class="a-icon-alt"\]/text()').extract\_first() #评分data\['date'\] = sel.xpath('//span\[@data-hook="review-date"\]/text()').extract\_first() #日期地址data\['review'\] = sel.xpath('//span\[@data-hook="review-title"\]/span/text()').extract\_first() #评价标题data\['detail'\] = sel.xpath('//span\[@data-hook="review-body"\]').extract\_first() #评价内容image = sel.xpath('div\[@class="review-image-tile-section"\]').extract\_first()data\['image'\] = image if image else "not image" #图片print(data)if self.page <= 99:print('Next Page')self.page += 1else:break# api获取ipdef getApiIp(self):# 获取且仅获取一个ip------意大利api\_url = '获取代理地址'res = requests.get(api\_url, timeout=5)try:if res.status\_code == 200:api\_data = res.json()\['data'\]\[0\]proxies = {'http': 'http://{}:{}'.format(api\_data\['ip'\], api\_data\['port'\]),'https': 'http://{}:{}'.format(api\_data\['ip'\], api\_data\['port'\]),}print(proxies)return proxiesprint('获取失败')except:print('获取失败')#专门发送请求的方法,代理请求三次,三次失败返回错误def getRes(self,url,headers,proxies,post\_data,method):if proxies:for i in range(3):try:# 传代理的post请求if method == 'POST':res = requests.post(url,headers=headers,data=post\_data,proxies=proxies)# 传代理的get请求else:res = requests.get(url, headers=headers,proxies=proxies)if res:return resexcept:print(f'第{i+1}次请求出错')else:return Noneelse:proxies = self.getApiIp()# 请求代理的post请求res = requests.post(url, headers=headers, data=post\_data, proxies=proxies)# 请求代理的get请求res = requests.get(url, headers=headers, proxies=proxies)print(f"第{i+1}次请求出错")
if \_\_name\_\_ == '\_\_main\_\_':getReview().getPLPage()

总结

本次的亚马逊评论获取就是两个坑,一是评论信息通过的XHR请求方式,二是评论信息的处理。
分析之后这次的数据获取还是非常简单的,找到正确的请求方式,稳定的IP代理让你事半功倍,找到信息的共同点进行处理,问题就迎刃而解了。


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100 和为 K 的子数组 前缀和

&#x1f468;‍&#x1f3eb; 题目地址 &#x1f37b; AC code class Solution {public int subarraySum(int[] nums, int k){int ans 0;int n nums.length;int[] s new int[n 1];// 前缀和s[0] 0;s[1] nums[0];for (int i 2; i < n; i)s[i] s[i - 1] nums[i - 1…

C#-基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record&#xff08;记录&#xff09;&#xff0c;编译器会在后台创建一个类。支持类似于结构的值定义&#xff0c;但被实现为一个类&#xff0c;方便创建不可变类型&#xff0c;成员在初始化后不能再被改变 &#xff08;C#9新增&#xff09; …

PostgreSQL + SQL Server = WiltonDB

WiltonDB 是一个基于 PostgreSQL 的开源数据库&#xff0c;通过 Babelfish 插件支持 Microsoft SQL Server 协议以及 T-SQL 语句。 Babelfish 是亚马逊提供的一个开源项目&#xff0c;使得 PostgreSQL 数据库同时具有 Microsoft SQL Server 数据查询和处理的能力。Babelfish 可…

如何提高学生的课堂参与度

提高学生的课堂参与度是让许多教师头疼的问题。不过通过采取一些简单的方法&#xff0c;就可以让学生更积极的参与课堂活动。那么&#xff0c;这些方法是什么呢&#xff1f; 激发学生的兴趣 学生如果对课堂内容感兴趣&#xff0c;他们就会更加积极地参与其中。教师可以通过使用…

详解Java中的泛型(泛型的语法,擦除机制,泛型的上界)

目录 一.什么是泛型 二.Java中为什么要使用泛型 三.泛型的语法 四.泛型类的使用 五.泛型的编译机制&#xff08;擦除机制&#xff09; 六.泛型的上界 一.什么是泛型 泛型&#xff08;Generics&#xff09;是Java SE 5中引入的一个新特性&#xff0c;可以使Java中的类和方…

联邦学习Federated Learning(FL)

联邦学习Federated Learning 序言FL流程细节FL代码实现&#xff08;Pytorch&#xff09;Reference 序言 手机的数据涉及到个人隐私和安全&#xff0c;如果将客户端的数据上传到服务端&#xff0c;终究是很容易泄漏出用户的信息&#xff0c;何况 用户也不愿意把自己的数据交给服…

Java基础小结

Java 基础小结 Java 基础概念与常识 什么是 Java ? Java 是 1995 年由 sun 公司推出的一门高级语言。 Java 的四个基本特性是面向对象、平台无关性、安全性和简单性。 具体特点如下: 简单易学。 平台无关性。 面向对象 面向对象是一种程序设计技术&#xff0c;以木匠工…

[C++]六大默认成员函数详解

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C和Linux &#x1f33c;博客专栏&#xff1a;C入门 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&#x1f3fb; …

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写,80+随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路(电阻、开关、发光二极管)模拟逻辑门电路 二、画出并填写实验指导书上的预表

数字IC芯片验证流程及验证工具推荐?收藏专用

验证其实是一个“证伪”的过程&#xff0c;从流程到工具&#xff0c;验证工程师的终极目的都只有一个&#xff1a; 发现所有BUG&#xff0c;或者证明没有BUG&#xff0c;以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的&#xff1a; 从项…

数据结构 | 排序

插入排序 直接插入排序&#xff08;空间复杂度为1&#xff0c;排序后稳定&#xff09; 思路&#xff1a; 在待排序的元素中&#xff0c;假设前n-1个元素已有序&#xff0c;现将第n个元素插入到前面已经排好的序列中&#xff0c;使得前n个元素有序。按照此法对所有元素进行插入&…

【华为OD】B\C卷真题 100%通过:找城市 多叉树实现 python源码

【华为OD】B\C卷真题 100%通过:找城市 多叉树实现 python源码 目录 题目描述&#xff1a; 示例1 示例2 解题思路&#xff1a; 代码实现&#xff1a; 题目描述&#xff1a; 一张地图上有n个城市&#xff0c;城市和城市之间有且只有一条道路相连&#xff1a;要么直接相连&…

快速排序算法,这么写打败95%的程序员

1960年&#xff0c;英国计算机科学家霍尔提出了一种高效的排序算法——快速排序。其核心思想是选定一个基准元素&#xff0c;将需排序的数组分割成两部分。其中一部分都比基准元素小&#xff0c;另一部分都比基准元素大。接着对这两部分分别进行快速排序&#xff0c;最后通过递…

jQuery_07 函数的使用

在jQuery中&#xff0c;如何使用函数呢&#xff1f; 1.基本函数 函数(常用的) 其实有很多函数&#xff0c;但是我们只需要掌握常用的函数即可 1.val 操作dom对象的value val() 没有参数 获取dom数组中第一个dom对象的value值 val(value) 有参数 设置dom数组中所有dom对象的…

UE5人物残影学习(材质实现)

学习视频 UE4简单的材质球残影人教学&#xff0c;你学会了吗&#xff01;_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rY411q7Yb/?spm_id_from333.788.top_right_bar_window_history.content.click 结果预览 1.创建残值&#xff0c;混合模式勾选半透明 “混合模…

经典神经网络——GoogLeNet模型论文详解及代码复现

论文地址&#xff1a;[1409.4842] Going Deeper with Convolutions (arxiv.org) 一、GoogLeNet概述 创新点 我认为&#xff0c;这篇文章最大的创新点是引入了一个名为Inception块的结构&#xff0c;能够增加神经网络模型大小的同时&#xff0c;减缓参数量的爆炸式增长&#x…

【数据结构】图<简单认识图>

对于下面的内容&#xff0c;大家着重观察和理解图即可&#xff0c;可以直接绕过一些文字性的概念&#xff0c;对图有一个大概的认识。 图 简单认识图图的定义有向图和无向图完全图无向完全图有向完全图 图的基本存储结构邻接矩阵存储邻接矩阵的优点 网络的邻接矩阵邻接表无向图…

计算机视觉面试题-02

图像处理和计算机视觉基础 什么是图像滤波&#xff1f;有哪些常见的图像滤波器&#xff1f; 图像滤波是一种通过在图像上应用滤波器&#xff08;卷积核&#xff09;来改变图像外观或提取图像特征的图像处理技术。滤波器通常是一个小的矩阵&#xff0c;通过在图像上进行卷积…

pytorch安装GPU版本 (Cuda12.1)教程

使用本教程前&#xff0c;默认您已经安装并配置好了python3以上版本 1. 去官网下载匹配的Cuda Cuda下载地址 当前最高版本的Cuda是12.1 我安装的就是这个版本 小提示&#xff1a;自定义安装可以只选择安装Cuda Runtime。Nvidia全家桶不必全部安装。把全家桶全部安装完直接系统…

C#学习-8课时

P10 输入输出程序编写 相同类型的可以直接相加&#xff1b; cwtabtabconsole.Writeline(); using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace C_8_1 { class Program { s…