文章目录

  • 前言
  • 一、数据保存格式设置及数据库准备(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解析部分数据相关推荐

  1. Python动态爬虫爬取京东商品评论

    Python 动态爬虫爬取京东商品评论 1. 概述 京东商城是Python爬虫初学者试手的经典平台,反爬虫程度较低,但评论采取了动态加载的方式,爬取京东商品评论是学习动态爬虫的一个极佳方法. 动态爬虫 ...

  2. python制作爬虫爬取京东商品评论教程

    python制作爬虫爬取京东商品评论教程 作者:蓝鲸 类型:转载 本文是继前2篇Python爬虫系列文章的后续篇,给大家介绍的是如何使用Python爬取京东商品评论信息的方法,并根据数据绘制成各种统计 ...

  3. python爬虫爬取京东商品评价_网络爬虫-爬取京东商品评价数据

    前段时间做商品评价的语义分析,需要大量的电商数据,于是乎就自己动手爬取京东的数据.第一次接触爬虫是使用selenium爬取CNKI的摘要,基于惯性思维的我仍然想用selenium+Firefox的方法 ...

  4. 网络爬虫-爬取京东商品评价数据

    前段时间做商品评价的语义分析,需要大量的电商数据,于是乎就自己动手爬取京东的数据.第一次接触爬虫是使用selenium爬取CNKI的摘要,基于惯性思维的我仍然想用selenium+Firefox的方法 ...

  5. python爬虫爬取京东商品评价_python爬取京东商品信息及评论

    ''' 爬取京东商品信息: 功能: 通过chromeDrive进行模拟访问需要爬取的京东商品详情页(https://item.jd.com/100003196609.html)并且程序支持多个页面爬取 ...

  6. python爬取页面内容由京东提_python制作爬虫爬取京东商品评论教程

    本篇文章是python爬虫系列的第三篇,介绍如何抓取京东商城商品评论信息,并对这些评论信息进行分析和可视化.下面是要抓取的商品信息,一款女士文胸.这个商品共有红色,黑色和肤色三种颜色, 70B到90D ...

  7. Java实现网络爬虫:爬取京东商品案例

    Java实现网络爬虫 爬取京东商品案例 需求分析 代码实现 爬取京东商品案例 需求分析 一.需求 抓取京东商城的数据,把商品数据保存到数据库. 二.功能分析 使用HttpClient发送一个get请求 ...

  8. Python 爬取京东商品评论 + 词云展示

    利用python爬虫爬取京东商品评论数据,并绘制词云展示. 原文链接:https://yetingyun.blog.csdn.net/article/details/107943979 创作不易,未经 ...

  9. python翻页爬取京东商品评价

    python翻页爬取京东商品评价 以小米手机评论为案例 1.找到目标的url 2.检查响应结果 3.解析json数据,发现相应数据无法成功解析 注意:json数据一般都是以大括号或中括号开头或者结尾的 ...

最新文章

  1. 演练5-3:Contoso大学校园管理系统3
  2. 进入保护模式(四)设置一些公用的方法
  3. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)
  4. 计算机知识和技能,计算机基本知识和技能PPT课件.ppt
  5. 月球-I型,月份日历生成器----基于PHP7.3
  6. r语言怎么保存代码_R代码忘记保存,系统崩溃了怎么办?
  7. WPF框架MVVM简单例子
  8. 【转载】正则表达式30分钟入门教程
  9. 笨方法使用Kubernetes实现持续交付
  10. R语言中最强的神经网络包RSNNS
  11. UG软件制图的几个重要技巧,你知道吗?
  12. UWA学堂|开发流程模块
  13. 实例88:构建InfoGAN生成MNIST模拟数据
  14. oracle和timesten整合,Timesten与Oracle SQL执行时间对比
  15. IPV6:移动光猫吉比特GM228-S 桥接+IPV6教程
  16. 如何修改域名DNS服务器?修改DNS服务器常见问题汇总
  17. python 移动平均线_使用python计算简单移动平均线
  18. Embedded Coder 快速入门
  19. 美国诚实签经验——医生的预约单和赴美生子的费用明细表
  20. 使用Gitlab的CI/CD实现简单的自动发布

热门文章

  1. 我叫mt4服务器维护时间,我叫mt4日常几点更新?日常任务刷新时间介绍[图]
  2. python如何提取数据中的年月_Python提取特定时间段内数据的方法实例
  3. python中if语句可以嵌套吗_Python if语句嵌套(入门必读)
  4. 加盟故事里的炸鸡的经历
  5. 爱奇艺智能前端异常监控平台的设计与实践
  6. wubi安装linux工具,Wubi下载_Wubi(Ubuntu辅助安装工具)正式版13.10 - 系统之家
  7. h3c服务器管理虚拟机,02-虚拟机配置
  8. Navicat for MySQL连接mysql建数据库
  9. 微信公众平台—— 获取微信服务器IP地址
  10. python pycrypto_windows 下的python 安装pycrypto