Python爬虫之抓取某东苹果手机评价
目录
- 1. 网站分析
- 2. 示例代码
- 3. 注意事项
1. 网站分析
本文实现的爬虫是抓取京东商城指定苹果手机的评论信息。使用 requests
抓取手机评论 API
信息,然后通过 json
模块的相应 API
将返回的 JSON
格式的字符串转换为 JSON
对象,并提取其中感兴趣的信息。读者可以点击此处打开 京东商城,如下图所示:
URL
是 苹果手机商品 。商品页面如下图所示:
在页面的下方是导航条,读者可以单击导航条上的数字按钮,切换到不同的页面,会发现浏览器地址栏的 URL
并没改变,这种情况一般都是通过另外的通道获取的数据,然后将数据动态显示在页面上。那么如何来寻找这个通道的 URL
呢?
在 Chrome
浏览器的开发者工具的 Network
选项中单击 XHR
按钮,再切换到其他页,并没有发现要找的 API URL
,可能京东商城获取数据的方式有些特殊,不是通过 XMLHttpRequest
发送的请求。
所以重新选中 All
按钮,显示所有的 URL
。现在用另外一种方式寻找这个 URL
,就是 Filter
。通过左上角的 Filter
输入框,可以通过关键字搜索 URL
,由于本文是抓取评论数据,所以可以尝试输入 comments
,在左下角的列表中会出现如下图所示的内容。
在搜索结果中会看到 1个名为 productPageComments.action
的 URL
,单机这个 URL
,在右侧切换到 Preview
选项卡,会看到如上图所示的内容,很明显,这是 JSON
格式的数据,展开 comments
,会看到有 10
项 ,这是返回的 10
条评论。在展开某一条评论,如下图所示:
从属性的内容可以看出,content
属性是评论内容,creationTime
是评论时间,days
是购买多长时间后才来评论的。通过 Headers
选项卡可以得到如下完整的 URL
。
1
从这个 URL
可以看出,page
参数表示页数,从 0
开始,pageSize
参数表示每页获取的评论数,默认是 10
,这个参数可以保留默认值,只改变 page
参数即可。
2. 示例代码
根据前面的描述实现抓取苹果手机评论信息的爬虫,通过 fetch_comment_count
变量可以控制抓取的评论条数。最后将抓取的结果显示在控制台中。示例代码如下:
# -*- coding: UTF-8 -*-
"""
@file:4.抓取京东苹果手机评论.py
"""
import requests
import json
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
fetch_comment_count = 1000 # 限定抓取的评论数
index = 0 # 用于记录爬取到第几条评论
page_index = 0 # 页码
flag = True # 用于控制循环是否退出
while flag:
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100005492549&score=0&sortType=6&page={}&pageSize=10&isShadowSku=100008348530&rid=0&fold=1'.format(
page_index)
page_index += 1
res = requests.get(url=url, headers=headers)
text = res.text
# 下面的代码替换返回数据的部分内容,因为返回的数据并不是标准的 JSON 格式
json_str = text.replace('fetchJSON_comment98(', '')[:-2]
json_obj = json.loads(json_str) # 将字符串转换为字典对象
comments_list = json_obj['comments']
comments_list_length = len(comments_list)
# 循环输出评论数据
for i in range(comments_list_length):
comments = comments_list[i]['content']
print(f'< {index + 1} > {comments}')
creation_time = comments_list[i]['creationTime'] # 获取评论时间
nickname = comments_list[i]['nickname'] # 获取昵称
print(creation_time)
print(nickname)
print("-" * 20)
index += 1
if index == fetch_comment_count:
flag = False
break
程序运行结果如下图所示:
3. 注意事项
- 京东商城如果频繁使用同一个
IP
发起大量请求,服务端会临时性封锁IP
,可以使用一些免费的代理。 -
API URL
返回的数据并不是标准的JSON
,里面还有一些杂质,需要在本地将其删除。 本例有一个前缀是fetchJSON_comment98
,这个前缀是通过URL
的callback
参数指定的,根据参数名应该是个回调函数,具体是什么不需要管,总之,需要按照callback
参数的值将返回数据的前缀去掉。
- 用awk写递归
- bc计算A股上市新股依次涨停股价
- ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式
- python访问http的GET/POST
- 用openssl库RSA加密解密
- Kobject浅析
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
- RSA简介(二)——模幂算法
- 为虚拟机vCPU绑定物理CPU
- RSA简介(三)——寻找质数
- RSA简介(四)——求逆算法
- 平方根的C语言实现(三) ——最终程序实现
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
- 【视频】Es6新特性-Symbol
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vue-element-admin提交表单数据到后端
- JDK15正式发布,划时代的ZGC同时宣布转正
- Redis的各种数据类型实践---List结构
- Git分支操作方法
- 最全解密微信红包随机算法(含代码实现)
- 两次死锁的分析
- 一次解决你的图像尺寸和定位问题。
- vuedraggable实现列表拖动排序
- 在 Xcode 中添加 Swift package 依赖
- 浅谈JavaScript中的apply,call和bind
- Git 的简单使用
- 移动端适配
- 《Algorithms Unlocked》读书笔记1——循环和递归
- 《Algorithms Unlocked》读书笔记2——二分查找和排序算法
- 《Algorithms Unlocked》读书笔记3——计数排序