爬虫爬取京东商品详细数据 (品牌、售价、各类评论量(精确数量)、热评词及数量等)json解析部分数据
文章目录
- 前言
- 一、数据保存格式设置及数据库准备(CentOS云mysql数据库)
- 1、分析数据需求(单一商品为例)
- 2、数据库保存格式
- 3、用到的数据库操作及指令
- 二、网页分析
- 1、分析网页源码,确定提取方式
- 三、代码设计及信息爬取
- 完整代码:
- 四、优化与改进
- **改进需求:**
- 改进版(已完成)链接(时间由21000s优化至3000s左右)
前言
1.本编文章为毕设所著,所作内容不用于任何商业用途,爬虫所获取内容均用于个人设计
2.本文基于上一篇文章为前提,详情转:爬取京东笔记本电脑销量榜每件商品详情页url,并存入云服务器中的mysql库
3.目前多线程改进版已完成,请移步至:
(多线程优化版)爬虫爬取京东商品详细数据(品牌、售价、各类评论量(精确数量)、热评词及数量等) json解析部分数据
一、数据保存格式设置及数据库准备(CentOS云mysql数据库)
1、分析数据需求(单一商品为例)
此为所获取到的上商品url中的第一件商品的详情页
通过观察网页,初步确定数据需求为:
商品名称(product_name)
、品牌(product_brand)
、价格(product_price)
、总评论数(total_comment_num)
、好评数(good_comment_num)
、好评率(good_percent_com)
、差评数(bad_comment_num)
、差评率(bad_percent_com)
、评论标签及数量(dict_icon)
,共计9项。(后续网页分析后添加项:价格分为三项(最高价格(product_m_price)
、当前价格(product_price)
、指导价格(product_o_price)
)),合计11项。
2、数据库保存格式
继爬取到的数据继续存入上一文章保存url库中,增加字段,更新行数据。
结果示例:
3、用到的数据库操作及指令
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
二、网页分析
1、分析网页源码,确定提取方式
1>.商品名称(product_name)
、品牌(product_brand)
解析方式:xpth:
[product_name] = detail.xpath('//*[@id="detail"]/div[2]/div[1]/div[1]/ul[2]/li[1]/@title') # 商品名称
print("商品:" + str(product_name))[product_brand] = detail.xpath('//*[@id="detail"]/div[2]/div[1]/div[1]/ul[1]/li[1]/a/text()') # 商品品牌
print("品牌:" + str(product_brand))
2>.其他数据
这些数据保存存在反爬措施,其数据保存在json中,提取方法:(请求json)
京东反爬措施导致无法爬取商品价格和评论等信息解决方法
最高价格(product_m_price)
、当前价格(product_price)
、指导价格(product_o_price)
:
p = requests.get('https:' + '//p.3.cn/prices/mgets?skuIds=J_' + product_id, headers=header, proxies=random.choice(proxy_list)) # 请求商品价格jso
[product_dict] = json.loads(p.text) # 获取商品价格
product_m_price = product_dict['m']
product_price = product_dict['p']
product_o_price = product_dict['op']
总评论数(total_comment_num)
、好评数(good_comment_num)
、好评率(good_percent_com)
、差评数(bad_comment_num)
、差评率(bad_percent_com)
:
c = requests.get('https://club.jd.com/comment/productCommentSummaries.action?referenceIds=' + product_id, headers=header, proxies=random.choice(proxy_list)) # 请求评论json
comment_dict = json.loads(c.text.split('[')[-1].split(']')[0]) # json内容截取total_comment_num = comment_dict['CommentCount']
good_comment_num = comment_dict['ShowCount']
good_percent_com = comment_dict['GoodRate']
bad_comment_num = comment_dict['PoorCount']
bad_percent_com = comment_dict['PoorRate']print("总评论数为:{}" .format(total_comment_num))
print("好评数: {}" .format(good_comment_num))
print("好评率: {}" .format(good_percent_com))
print("差评数: {}".format(bad_comment_num))
print("差评率: {}".format(bad_percent_com))
评论标签及数量(dict_icon)
:
icon = requests.get('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=' + product_id + '&score=0&sortType=5&page=0&pageSize=10', headers=header, proxies=random.choice(proxy_list))comment_ic = json.loads(icon.text.split('hotCommentTagStatistics":')[-1].split(',"jwotestProduct')[0])icon = []
for ic in comment_ic:comment_ic_name = ic['name']comment_ic_num = ic['count']comment_icon = comment_ic_name + '(' + str(comment_ic_num) + ')'icon.append(comment_icon)comment_icon_all = ','.join(icon)print(comment_icon_all)
三、代码设计及信息爬取
完整代码:
备注:
1.需要预先获取url支持,详情参见本文前言。
2.数据库地址和密码以***
代替,直接复制代码无法运行
import requests
from lxml import etree
import json
import random
import pymysql
import time# 请求头池
user_agent = ["Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0","Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1","Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
]# Ip池
proxy_list = [{"http" or "https": "112.115.57.20:3128"},{"http" or "https": '121.41.171.223:3128'},
]def get_url(): # 从数据库获取商品urltry:db = pymysql.connect(host="***", user="root", password="***", database="JD_DATA", charset="utf8")d = db.cursor()sql = 'SELECT url FROM product_data'd.execute(sql)rows = d.fetchall()urls = []for row in rows:for con in row:urls.append(con)return urlsd.close()db.close()except BaseException as e:print("获取数据库数据失败!:{}".format(e))def insert(value, table, p_url): # 写入数据到数据库函数# 连接数据库db = pymysql.connect(host="***", user="root", password="***", database="JD_DATA",charset="utf8")cursor = db.cursor()# 更新数据,判断写入位置sql = "UPDATE product_data SET {table} = '{val}' WHERE url = '{purl}'".format(table=table, val=value, purl=p_url)try:cursor.execute(sql)db.commit()except Exception as e:db.rollback()print("插入数据失败! error:{}".format(e))db.close()def get_data(url): # 获取商品详细数据header = {'User-Agent': random.choice(user_agent)}r = requests.get(url, headers=header, proxies=random.choice(proxy_list))detail = etree.HTML(r.text) # str转HTML[product_name] = detail.xpath('//*[@id="detail"]/div[2]/div[1]/div[1]/ul[2]/li[1]/@title') # 商品名称# print("商品:" + str(product_name))[product_brand] = detail.xpath('//*[@id="detail"]/div[2]/div[1]/div[1]/ul[1]/li[1]/a/text()') # 商品品牌# print("品牌:" + str(product_brand))# 请求价格信息jsonp = requests.get('https:' + '//p.3.cn/prices/mgets?skuIds=J_' + product_id, headers=header, proxies=random.choice(proxy_list)) # 请求商品价格json[product_dict] = json.loads(p.text) # 获取商品价格product_m_price = product_dict['m']product_price = product_dict['p']product_o_price = product_dict['op']# 请求评论信息jsonc = requests.get('https://club.jd.com/comment/productCommentSummaries.action?referenceIds=' + product_id, headers=header, proxies=random.choice(proxy_list)) # 请求评论jsoncomment_dict = json.loads(c.text.split('[')[-1].split(']')[0]) # json内容截取total_comment_num = comment_dict['CommentCount']good_comment_num = comment_dict['ShowCount']good_percent_com = comment_dict['GoodRate']bad_comment_num = comment_dict['PoorCount']bad_percent_com = comment_dict['PoorRate']# 调用函数,写入数据insert(value=product_name, table='product_name', p_url=p_url)insert(value=product_brand, table='product_brand', p_url=p_url)insert(value=product_m_price, table='product_m_price', p_url=p_url)insert(value=product_price, table='product_price', p_url=p_url)insert(value=product_o_price, table='product_o_price', p_url=p_url)insert(value=total_comment_num, table='total_comment_num', p_url=p_url)insert(value=good_comment_num, table='good_comment_num', p_url=p_url)insert(value=good_percent_com, table='good_percent_com', p_url=p_url)insert(value=bad_comment_num, table='bad_comment_num', p_url=p_url)insert(value=bad_percent_com, table='bad_percent_com', p_url=p_url)# 请求评论信息jsonicon = requests.get('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=' + product_id + '&score=0&sortType=5&page=0&pageSize=10', headers=header, proxies=random.choice(proxy_list))comment_ic = json.loads(icon.text.split('hotCommentTagStatistics":')[-1].split(',"jwotestProduct')[0])icon = []for ic in comment_ic:comment_ic_name = ic['name']comment_ic_num = ic['count']comment_icon = comment_ic_name + '(' + str(comment_ic_num) + ')'icon.append(comment_icon)comment_icon_all = ','.join(icon)# print(comment_icon_all)insert(value=comment_icon_all, table='dict_icon', p_url=p_url)''' print("当前价格:" + product_price)print("指导价格:" + product_o_price)print("最高价格:" + product_m_price)print("总评论数为:{}" .format(total_comment_num))print("好评数: {}" .format(good_comment_num))print("好评率: {}" .format(good_percent_com))print("差评数: {}".format(bad_comment_num))print("差评率: {}".format(bad_percent_com))'''if __name__ == "__main__":urls = []i = 0j = 0start = time.perf_counter()urls = get_url()for p_url in urls:try:product_id = p_url.split('/')[-1].split('.')[0] # 提取商品IDprint('正在获取第{}件商品数据并上传数据库......'.format(i))get_data(p_url)i = i + 1except Exception as e:print('当前url数据获取失败! \n错误码:{} \n当前错误条数{}'.format(e, j))end = time.perf_counter()print('\n程序完成!\n共爬取{}件商品数据,失败{}件,耗时{}s。'.format(i, j, end-start))
运行结果截图
四、优化与改进
改进需求:
1.爬取速度过慢(约66000项数据),正在进行方法改进中,尝试多线程优化。
2.后续设计将进行可视化分析,见[可视化分析]栏目博客(构建中)
改进版(已完成)链接(时间由21000s优化至3000s左右)
(多线程优化版)爬虫爬取京东商品详细数据(品牌、售价、各类评论量(精确数量)、热评词及数量等) json解析部分数据
爬虫爬取京东商品详细数据 (品牌、售价、各类评论量(精确数量)、热评词及数量等)json解析部分数据相关推荐
- Python动态爬虫爬取京东商品评论
Python 动态爬虫爬取京东商品评论 1. 概述 京东商城是Python爬虫初学者试手的经典平台,反爬虫程度较低,但评论采取了动态加载的方式,爬取京东商品评论是学习动态爬虫的一个极佳方法. 动态爬虫 ...
- python制作爬虫爬取京东商品评论教程
python制作爬虫爬取京东商品评论教程 作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计 ...
- python爬虫爬取京东商品评价_网络爬虫-爬取京东商品评价数据
前段时间做商品评价的语义分析,需要大量的电商数据,于是乎就自己动手爬取京东的数据.第一次接触爬虫是使用selenium爬取CNKI的摘要,基于惯性思维的我仍然想用selenium+Firefox的方法 ...
- 网络爬虫-爬取京东商品评价数据
前段时间做商品评价的语义分析,需要大量的电商数据,于是乎就自己动手爬取京东的数据.第一次接触爬虫是使用selenium爬取CNKI的摘要,基于惯性思维的我仍然想用selenium+Firefox的方法 ...
- python爬虫爬取京东商品评价_python爬取京东商品信息及评论
''' 爬取京东商品信息: 功能: 通过chromeDrive进行模拟访问需要爬取的京东商品详情页(https://item.jd.com/100003196609.html)并且程序支持多个页面爬取 ...
- python爬取页面内容由京东提_python制作爬虫爬取京东商品评论教程
本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...
- Java实现网络爬虫:爬取京东商品案例
Java实现网络爬虫 爬取京东商品案例 需求分析 代码实现 爬取京东商品案例 需求分析 一.需求 抓取京东商城的数据,把商品数据保存到数据库. 二.功能分析 使用HttpClient发送一个get请求 ...
- Python 爬取京东商品评论 + 词云展示
利用python爬虫爬取京东商品评论数据,并绘制词云展示. 原文链接:https://yetingyun.blog.csdn.net/article/details/107943979 创作不易,未经 ...
- python翻页爬取京东商品评价
python翻页爬取京东商品评价 以小米手机评论为案例 1.找到目标的url 2.检查响应结果 3.解析json数据,发现相应数据无法成功解析 注意:json数据一般都是以大括号或中括号开头或者结尾的 ...
最新文章
- 演练5-3:Contoso大学校园管理系统3
- 进入保护模式(四)设置一些公用的方法
- BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)
- 计算机知识和技能,计算机基本知识和技能PPT课件.ppt
- 月球-I型,月份日历生成器----基于PHP7.3
- r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?
- WPF框架MVVM简单例子
- 【转载】正则表达式30分钟入门教程
- 笨方法使用Kubernetes实现持续交付
- R语言中最强的神经网络包RSNNS
- UG软件制图的几个重要技巧,你知道吗?
- UWA学堂|开发流程模块
- 实例88:构建InfoGAN生成MNIST模拟数据
- oracle和timesten整合,Timesten与Oracle SQL执行时间对比
- IPV6:移动光猫吉比特GM228-S 桥接+IPV6教程
- 如何修改域名DNS服务器?修改DNS服务器常见问题汇总
- python 移动平均线_使用python计算简单移动平均线
- Embedded Coder 快速入门
- 美国诚实签经验——医生的预约单和赴美生子的费用明细表
- 使用Gitlab的CI/CD实现简单的自动发布
热门文章
- 我叫mt4服务器维护时间,我叫mt4日常几点更新?日常任务刷新时间介绍[图]
- python如何提取数据中的年月_Python提取特定时间段内数据的方法实例
- python中if语句可以嵌套吗_Python if语句嵌套(入门必读)
- 加盟故事里的炸鸡的经历
- 爱奇艺智能前端异常监控平台的设计与实践
- wubi安装linux工具,Wubi下载_Wubi(Ubuntu辅助安装工具)正式版13.10 - 系统之家
- h3c服务器管理虚拟机,02-虚拟机配置
- Navicat for MySQL连接mysql建数据库
- 微信公众平台—— 获取微信服务器IP地址
- python pycrypto_windows 下的python 安装pycrypto