前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 不用selenium 带你高效爬取京东商品评论

Python 不用selenium 带你高效爬取京东商品评论

作者头像
cutercorley
发布于 2020-07-23 08:35:12
发布于 2020-07-23 08:35:12
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

文章目录

  • 一、项目说明
    • 1.项目背景
    • 2.项目环境
  • 二、项目实施
    • 1.项目分析
    • 2.代码实现
      • 导入模块和定义常量
      • 爬取评论主体函数
      • 主函数
  • 三、项目分析和说明
    • 1.运行测试
    • 2.改进分析
    • 3.其他说明

一、项目说明

1.项目背景

一天,一朋友扔给我一个链接https://item.jd.com/100000499657.html,让我看看这个歌商品的所有评论怎么抓取,我打开一看,好家伙,竟然有近300万条评论,不是一个小数目啊。

但是仔细一看,原来有234万+的评论是默认好评,还是有少部分是有价值的评价的。 经过进一步观察,可以看到

显然,网页中显示的只有100页数据,每页显示10条,通常可以用selenium点击每一页然后获取,但是这样效率是不是太低了呢?还是直接用requests来得更直接,很多情况下网页显示的数据是请求得到的JSON数据在网页上渲染而显示出来的,京东的评论会不会也是这样呢?好,说干就干!!!

2.项目环境

这个小项目使用Python爬取,不需要太多的配置,只需要安装requests库就足够 ,我相信对于很多玩爬虫的小伙伴来说这个库肯定是必备的,没装requests不要告诉我你会爬虫

二、项目实施

1.项目分析

上面说到,网页中的数据很多都是通过渲染请求的JSON数据得到的,那么我们就来看看京东是不是也是这样的。 利用浏览器的审计工具,选择Network栏,可以看到

仔细查看,寻找链接中于评论(comment)有关的链接,可以找到其中的一个请求链接https://club.jd.com/comment/productCommentSummaries.action?referenceIds=100000499657&callback=jQuery1951081&_=1586669401777,如上图。这是关于该商品评论的整体情况的,可以看到具体的总评论数、默认好评数、好评数、好评率等,虽然不是我们想要的,但是也近了一步,继续寻找,又找到了一条带comment字眼的链接https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100000499657&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1,如图

后边有10条评论,应该就是该商品对应的第一页评论了,点开查看,如下:

对比网页中显示的评论可以看到,这就就是我们要找的东西。 由于得到的数据不是标准格式的JSON,所以我选择使用正则表达式来获取相关的内容。 现在还有一个问题,我们只获得了1页评论,那怎么获取所有的评论呢?会不会秘密隐藏在链接中呢? 对于链接https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100000499657&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1,显然有很多参数,不难找到,有参数productId和page,如果猜得不错,应该是商品id和评论页数(从0开始),这时,换一个商品id,那么商品id怎么获得呢?举个例子,在链接https://item.jd.com/100000499657.html中,商品id就是100000499657。另找一个商品,将其商品id替换掉评论链接中的productId,获得的正是该商品的第一页评论。现在尝试翻页,逐渐增大page参数的值,如1、2、3…,也能获取到对应页的评论数据。 现在分析工作已经做的差不多了,可以开始码代码了。

2.代码实现

导入模块和定义常量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
import time
import csv
import os
import requests
import html

# 设置请求头
headers = {
    'cookie': 'shshshfp=22dd633052035d21be92463ffa35684d; shshshfpa=ab283f84-c40f-9710-db89-84a8d3366a81-1586333030; __jda=122270672.1586333031101106032014.1586333031.1586333031.1586333031.1; __jdv=122270672|direct|-|none|-|1586333031103; __jdc=122270672; shshshfpb=bUe7tI9%2FOOaJKd7vP0EtSOg%3D%3D; __jdu=1586333031101106032014; areaId=22; ipLoc-djd=22-1977-1980-0; 3AB9D23F7A4B3C9B=7XEQD4BFTGEH44EK7LN7HLFCHJW6W2NS5VJOQOCHABZVI7LXJJIW3K2IX5MTPZ4TBERBLY6TRQR5CA3S3IYVLQ2JGI; jwotest_product=99; shshshsID=a7457cee6a4a9fa285fe2cff44c6bd17_4_1586333142454; __jdb=122270672.4.1586333031101106032014|1.1586333031; JSESSIONID=8C21549A613B83F0CB86EF1F38FD63D3.s1',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36'
}

导入需要使用到的模块,并且定义请求头用于请求,减少被反爬的概率。

爬取评论主体函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def comment_crawl(page, writer):
    '''爬取评论'''
    print('当前正在下载第%d页评论' % (page + 1))
    url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100000499657&score=0&sortType=5&page=%d&pageSize=10&isShadowSku=0&fold=1' % page
    # 请求链接获取数据
    text = requests.get(url, headers=headers).text
    # 正则表达式匹配数据
    comment_list = re.findall(
        r'guid":".*?"content":"(.*?)".*?"creationTime":"(.*?)",".*?"replyCount":(\d+),"score":(\d+).*?usefulVoteCount":(\d+).*?imageCount":(\d+).*?images":',
        text)
    for result in comment_list:
        # 根据正则表达式结果匹配数据
        content = html.unescape(result[0]).replace('\n', ' ')
        comment_time = result[1]
        reply_count = result[2]
        score = result[3]
        vote_count = result[4]
        image_count = result[5]
        # 写入数据
        writer.writerow((comment_time, score, reply_count, vote_count, image_count, content))

这是爬取评论的主体部分,在请求获取到数据后,通过正则表达式匹配到所需内容。 这里有一个注意点,html.unescape(result[0])是为了将评论内容的HTML转义字符如…等转化成普通字符串,这样数据更完整清晰。

主函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if __name__ == '__main__':
    '''主函数'''
    start = time.time()
    if os.path.exists('DATA.csv'):
        os.remove('DATA.csv')
    with open('DATA.csv', 'a+', newline='', encoding='gb18030') as f:
        writer = csv.writer(f)
        writer.writerow(('留言时间', '评分', '回复数', '点赞数', '图片数', '评论内容'))
        for page in range(100):
            comment_crawl(page, writer)
    run_time = time.time() - start
    print('运行时间为%d分钟%d秒。' % (run_time // 60, run_time % 60))

主函数创建文件用于保存数据,并对程序计时,以观察执行效率。

三、项目分析和说明

1.运行测试

整个小项目很简单,重点在分析过程和思路,只要分析好了,代码实现就很容易。 一次测试的示意如下:

效率还是很不错的,23秒内获取了近千条评论。 数据部分截图如下:

如果需要获取其他商品评论在代码中直接更改函数中url的productId即可。 完整代码可点击https://download.csdn.net/download/CUFEECR/12323279下载。

2.改进分析

  • 采用的是单线程,在数据较少时尚可,一旦需要爬取的评论较多时,可能会有效率上的瓶颈,因此可以用多线程或多进程,主函数中改进如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pool = ThreadPoolExecutor(3)
...
for page in range(100):
	pool.submit(comment_crawl, page, data_list)

代码可点击https://download.csdn.net/download/CUFEECR/12323373下载学习。 演示如下:

运行时间缩短了三分之一左右,显然大大提高了效率。

  • 因为京东的反爬措施较少,因此对反爬的防范措施也较少,爬取较少尚可,如果需求较高时,肯定会触发反爬机制,从而导致爬取失败。
  • 扩展性还有待提高,目前只是爬取了京东商品评论,但是对于别的电商平台如淘宝就很难搞了,这对代码提出了进一步要求。

3.其他说明

  • 本项目仅限学习和计数交流之用,不得用于恶意爬虫、非法牟利等用途,违者责任自负。
  • 如侵犯他人利益,请联系删改。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ubuntu 20.04 安装中文输入法_如何在ubuntu中安装中文输入法
在Ubuntu系统中,无论是写文档还是在程序中写注释,都经常需要用到中文输入法。本文简单介绍了三种输入法框架,然后详细介绍了在Ubuntu 20.04系统中,IBus框架和Fcitx框架支持的中文输入法的配置和安装。
全栈程序员站长
2022/11/09
27K0
ubuntu 20.04 安装中文输入法_如何在ubuntu中安装中文输入法
Ubuntu 22.04 配置 Google拼音 输入法
谷歌拼音输入法(Google Pinyin Input Method)是由谷歌公司开发的一款输入法软件,旨在为用户提供一种快速、准确的中文输入方式。该输入法基于拼音字母进行输入,用户只需输入对应的拼音字母,即可自动匹配正确的汉字。
为为为什么
2024/05/16
5.7K0
Ubuntu 22.04 配置 Google拼音 输入法
Linux中文输入法-搜狗输入法安装方法
我们从/etc/os-release文件中获取openSUSE系统的版本号,直接执行下面命令添加M17N源:
字母哥博客
2020/09/23
8.7K0
Kali Linux安装搜狗输入法(只需5步)
请注意,本文编写于 1255 天前,最后修改于 783 天前,其中某些信息可能已经过时。
Xcnte
2021/12/14
11.2K0
Kali Linux安装搜狗输入法(只需5步)
ubuntu安装中文输入法搜狗_中文输入法怎么调出来
首先,要安装中文输入法,必须要保证系统上有 fcitx。fcitx是一个以 GPL 方式发布的输入法框架,安装 fcitx 后可以为操作系统的桌面环境提供一个灵活的输入方案,解决在 GNU/Linux 环境下安装中文输入法的问题。
全栈程序员站长
2022/11/10
3K0
ubuntu安装中文输入法搜狗_中文输入法怎么调出来
ubuntu下安装中文输入法_ubuntu下载中文输入法
Ubuntu中安装中文输入法相比Windows上要复杂不少(其实也不算复杂,就是步骤上要稍微多一些)。这篇文章将基于 Ubuntu Desktop 20.04 进行中文输入法安装说明。
全栈程序员站长
2022/11/09
2.8K0
ubuntu下安装中文输入法_ubuntu下载中文输入法
Ubuntu20.04安装输入法_ubuntu20中文输入法
本文安装谷歌输入法。 其实之前一直用的是搜狗输入法,因为20.04取消qt4了没装成,就去尝试别的输入法了。发现谷歌输入法用起来极舒服,比sougou for linux好用多了。记得谷歌的中文输入法主要是北京分部在做,对google cn的好感度飙升!!!
全栈程序员站长
2022/11/09
2K0
Ubuntu20.04安装输入法_ubuntu20中文输入法
Deepin15.11下Qt5.14无法使用中文输入法
对于使用 fcitx 框架的中文输入法,需要手动编译 fcitx-qt5 生成中文输入法的库文件。
hotarugali
2022/03/01
9350
Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 离线安装的基础可以看看这篇文章的 前期准备工作 http://www.cnbl
逸鹏
2018/04/11
1.8K0
Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)
在Ubuntu Kylin14.04上安装搜狗输入法
安装好Ubuntu Kylin14.04 64位后好像没有中文输入法,怎么切换(Ctrl+Shift或者空格),但是就是输入的都是英文。
克虏伯
2019/04/15
1.1K0
在Ubuntu Kylin14.04上安装搜狗输入法
Ubuntu16.04安装中文输入法_Ubuntu触摸板驱动
然后打开设置,选择 language,点击添加
全栈程序员站长
2022/11/10
1.1K0
Ubuntu16.04安装中文输入法_Ubuntu触摸板驱动
Kali Linux(2021.2)系统 安装中文输入法
进入输入法配置界面,将Google拼音上移放到首位,表示作为默认拼音输入法,通过点击下方的上下箭头可以调整其顺序
用户9006224
2022/12/21
6.1K0
Kali Linux(2021.2)系统 安装中文输入法
32位Fedora 20安装搜狗拼音输入法图文教程
注意:笔者使用的是32位(i686)Fedora 20, x86-x64会有不同之处。文章是操作成功后写的,不保证每条命令都正确,但思路是没错的。
用户8704835
2021/06/07
1.7K0
Linux CentOS下,浏览器乱码,支持中文解决;以及中文输入法的安装
注意:请把文档看完整,再操作,安装软件需要root权限 一:浏览器显示中文 yum install fonts-chinese yum install fonts-ISO8859-2-75dpi 修改 /etc/sysconfig/i18n ,内容如下 LANG=”en_US.UTF-8″ SYSFONT=”lat0-sun16″ 二:中文输入法安装 yum -y install scim* yum -y install Deployment_Guide-zh-* lv-* stardict* 三
用户1272546
2018/06/04
2.7K0
Kali Linux中文输入
安装中文输入的场景,大多数是Linux桌面操作系统:Ubuntu、Kali、 Win Kex Kali这些,本文介绍的内容在WSL + Kali Win Kex同样测试并适用。
糖果
2023/03/05
20.2K0
Kali Linux中文输入
扫码与中文输入法
扫码输入就是用扫码枪或者其他设备扫描图形码(条形码或其他码)后将其内容识别为文本输入的操作。 扫码能减少降低成本,降低输入出错率,提高输入效率。 比较常见场景有的快递取货、入库、出库等。
epoos
2024/01/03
1.3K0
扫码与中文输入法
Debian下安装搜狗拼音输入法
2013年12月,搜狗与Ubuntu Kylin团队开始合作开发“搜狗输入法Linux版”。经过五个月的合作,于2014年4月17日,正式发布了1.0版本。2015年10月16日更新至2.0版本。
Debian中国
2018/12/20
3.2K0
浅析Linux系统的输入法平台
近一段时间,更多的接触了linux系统,之前的印象中,linux系统更偏向于命令行模式,更多的是作为服务器来使用,现在却作为跟windows一样的界面操作系统来使用,不得不说还是带来一定的冲击的。
用户5521279
2020/08/12
9.8K0
浅析Linux系统的输入法平台
Ubuntu16.04安装搜狗拼音输入法(中文输入法)「建议收藏」
打开官网http://pinyin.sogou.com/linux,点击自己对应的系统位数安装包,然后下载。
全栈程序员站长
2022/09/20
1.6K0
Ubuntu16.04安装搜狗拼音输入法(中文输入法)「建议收藏」
Windows 8学习总结
可以单独关闭蓝牙和wi-fi,或者使用飞行模式,全局的全部关闭。 需要注意的时,关闭他们后,还是需要从这里启用,否则提示已由用户禁用,无法启用:
williamwong
2018/07/24
6240
Windows 8学习总结
推荐阅读
相关推荐
ubuntu 20.04 安装中文输入法_如何在ubuntu中安装中文输入法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验