Python爬虫实战:抓取京东苹果手机评价

目录
很多人学习,不知道从何学起 。
很多人学习,掌握了基本语法过后,不知道在哪里寻找案例上手 。
很多已经做案例的人,却不知道如何去学习更加高深的知识 。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:
1. 网站分析
本文实现的爬虫是抓取京东商城指定苹果手机的评论信息 。使用抓取手机评论API信息,然后通过json模块的相应API将返回的JSON格式的字符串转换为JSON对象,并提取其中感兴趣的信息 。读者可以点击此处打开京东商城,如下图所示:

Python爬虫实战:抓取京东苹果手机评价

文章插图
URL是苹果手机商品 。商品页面如下图所示:
在页面的下方是导航条,读者可以单击导航条上的数字按钮,切换到不同的页面,会发现浏览器地址栏的URL并没改变,这种情况一般都是通过另外的通道获取的数据,然后将数据动态显示在页面上 。那么如何来寻找这个通道的URL呢?
在浏览器的开发者工具的选项中单击XHR按钮,再切换到其他页,并没有发现要找的API URL,可能京东商城获取数据的方式有些特殊,不是通过发送的请求 。
所以重新选中All按钮,显示所有的URL 。现在用另外一种方式寻找这个URL,就是 。通过左上角的输入框,可以通过关键字搜索URL,由于本文是抓取评论数据,所以可以尝试输入,在左下角的列表中会出现如下图所示的内容 。
在搜索结果中会看到 1个名为.的URL,单机这个URL,在右侧切换到选项卡,会看到如上图所示的内容,很明显,这是JSON格式的数据,展开,会看到有10项 ,这是返回的10条评论 。在展开某一条评论,如下图所示:
从属性的内容可以看出,属性是评论内容,是评论时间,days是购买多长时间后才来评论的 。通过选项卡可以得到如下完整的URL 。
【Python爬虫实战:抓取京东苹果手机评价】https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100005492549&score=0&sortType=5&page=0&pageSize=10&isShadowSku=100008348530&fold=1
从这个URL可以看出,page参数表示页数,从0开始,参数表示每页获取的评论数,默认是10,这个参数可以保留默认值,只改变page参数即可 。
2. 示例代码
根据前面的描述实现抓取苹果手机评论信息的爬虫,通过变量可以控制抓取的评论条数 。最后将抓取的结果显示在控制台中 。示例代码如下:
# -*- coding: UTF-8 -*-"""@author:AmoXiang@file:4.抓取京东苹果手机评论.py@time:2020/09/15"""import requestsimport jsonheaders = {'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 += 1res = 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'