目录

一、环境

二、简介

三、京东网页分析

1.获取商品信息入口--商品列表链接获取

2.获取商品信息入口--商品详情链接获取

3.商品详情获取

4.商品评论获取

四、代码实现

五、运行结果

六、结语


一、环境

win10 + python 3.7 + pycharm64 + selenium

二、简介

抓取京东商品页面信息:商品名称,售价,店铺,分类,订单信息,好评率,评论等----这里以'每周一花'为例

三、京东网页分析

采集思路如下:

此次主要采集以下字段数据:

  • title:商品名称
  • price:售价
  • brand:品牌
  • shop_name:店名
  • weight:商品重量
  • user:适用人群
  • classify:商品分类
  • comment_num:系列商品总评论数
  • praise_degree:系列商品总好评度
  • tag_list:系列商品总评价标签
  • single_comment_num:当前商品评论条数
  • single_tags:当前商品评价标签
  • member:顾客会员级别
  • star:评星等级
  • comment:评语
  • pic_num:评论图片数/视频数
  • order:订单详情(包含订单形式、下单日期等)

1.获取商品信息入口--商品列表链接获取

        爬取商品信息首先得有商品信息入口,这里直接从京东的分类中进入商品列表页面,没有对搜索关键词进行处理,仅处理了商品的页码。

翻看网页,发现共有16页,想用点击下一页(click()的方式)实现翻页,获取每一个商品列表链接。

这里有个坑需要注意:class='pn-next disabled',在第16页依旧可以找到,如果以此设置click() 在第16页后依旧会执行,抓取到别的类目的链接。

踩坑后用设置url的方式获取商品列表链接。

翻看多页发现url里的页码关键字:

page:页码(奇数递增)

s:sku数(page*60+1)

构建请求url:

url='https://search.jd.com/Search?keyword=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&page='+str(i*2+1)+'&s='+str(i*60+1)+'&click=0'

网页对搜索关键词进行了加密,将 ‘ 每周一花 ’ 转化为 ' %E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1 '

可以用 request.unquote()对其解密

一共16页,用for循环获取所有商品列表链接:用urltrue_list接收数据

#获得 京东每周一花的16个商品列表链接 这里可以定义函数,传入要抓取的关键字或页数,使其更加灵活
urltrue_list=[]
for i in range(16):url='https://search.jd.com/Search?keyword=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&page='+str(i*2+1)+'&s='+str(i*60+1)+'&click=0'urltrue=request.unquote(url)urltrue_list.append(urltrue)

2.获取商品信息入口--商品详情链接获取

打开商品列表链接,每一页都有60个商品,如果直接抓取会发现只能抓到30个,原因是:后30条信息是动态加载的

我的解决办法是设置拖拽,使其将页面加载完整

#定义函数缓慢拖拽页面,使其加载完成
def buffer():for i in range(50):time.sleep(0.3)browser.execute_script('window.scrollBy(0,300)', '')

这样就可以获取到一页里的60个商品详情链接了,同样用for循环获取所有的商品详情链接:

detail_urls = []
def get():for each in urltrue_list:browser.get(each)  # 遍历每个列表链接time.sleep(5)global detail_urlsbuffer() # 缓冲,使页面加载完整info = browser.find_elements_by_class_name('gl-i-wrap')# 寻找商品链接的父阶for line in info:# 获取商品列表页所有的商品链接detail_url = line.find_element_by_class_name('p-img').find_element_by_tag_name('a').get_attribute('href')detail_urls.append(detail_url)time.sleep(3)print(len(detail_urls)) # 查看长度确认是否抓取了60个连接return detail_urls  # 返回商品列表页所有的商品链接组成的列表
get()

3.商品详情获取

有了商品详情链接就有了真正的数据采集入口。

要采集下面截图橘黄框中的信息。

  • 一开始是用request抓取信息的,但是抓取时发现一些例如价格,评论条数等动态的数据抓取不到,所以改用selenium抓取
for each detail_urls: # 获取商品详情链接browser.maximize_window()# 最大化窗口browser.get(each)time.sleep(3)buffer()#获取商品名称title = browser.find_element_by_class_name('sku-name').text#获取价格(当前商品价格)price = browser.find_element_by_class_name('p-price').find_elements_by_xpath('span')[1].text#获取系列商品总评论条数(有不同规格)comment_num = browser.find_element_by_id('comment-count').find_element_by_tag_name('a').text#获取品牌brand = browser.find_element_by_id('parameter-brand').find_element_by_tag_name('a').text#获取店名shop_name = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[3].get_attribute('title')#获取商品重量weight = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[4].get_attribute('title')#获取适用人群user = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[5].get_attribute('title')#获取分类classify = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[6].get_attribute('title')buffer()#获取系列商品总好评度(有不同规格)praise_degree=browser.find_element_by_class_name('percent-con').text#获取系列商品总评价标签(有不同规格)tag_list = []tags = browser.find_elements_by_class_name(' tag-1')for tag in tags:tag_list.append(tag.text)browser.find_element_by_id('comm-curr-sku').send_keys(Keys.SPACE)  # 只看当前商品评价# 当前商品评论条数(单个)single_comment_num = browser.find_element_by_class_name('filter-list').find_elements_by_tag_name('em')[0].text# 当前商品评价标签single_tags = browser.find_element_by_class_name('filter-list').find_elements_by_tag_name('li')[1:7]single_tag_list = []for each in single_tags:det = each.find_element_by_tag_name('a').textsingle_tag_list.append(det)

4.商品评论获取

这个部分主要用来抓取评论详情,查看了多个商品详情,发现不管评论有多少条,最多只显示50页的数据。

#抓取一页的评论详情
comment_details = []
def com_info():divs = browser.find_element_by_id('comment-0').find_elements_by_class_name('comment-item')for each in divs:if each.find_element_by_class_name('user-level').find_elements_by_tag_name('a'):member='PLUS会员'else:member='普通会员'#评星star=each.find_element_by_class_name('comment-column').\find_element_by_tag_name('div').get_attribute('class')# 评语comment=each.find_element_by_class_name('comment-column').find_element_by_tag_name('p').text# 图片数或视频数pic_num=len(each.find_element_by_class_name('comment-column').find_elements_by_tag_name('div')[1].\find_elements_by_tag_name('a'))+len(each.find_element_by_class_name('comment-column').find_elements_by_tag_name('div')[1].\find_elements_by_tag_name('video'))#订单详情spans = each.find_element_by_class_name('order-info').find_elements_by_tag_name('span')order=[]for index, everyone in enumerate(spans):order.append(spans[index].text)single=[member,star,comment,pic_num,order]comment_details.append(single)

多页的数据依旧用for循环获取

for i in range(50): #这里的50设置的有问题,有些商品评价没有这么多,需要写if判断来决定循环多少次com_info()browser.find_elements_by_class_name('ui-pager-next')[0].send_keys(Keys.ENTER) # 点击下一页time.sleep(3)

四、代码实现

运行时有时候会报错:

Message: stale element reference: element is not attached to the page document

Message: no such element: Unable to locate element: {"method":"id","selector":"comm-curr-sku"}

(也可能是其他method和selector)

原因:都是因为数据没有加载完成导致,可以用增加sleep时间或者切换更流畅的网络解决

from selenium import webdriver
import time
from urllib import request
from selenium.webdriver.common.keys import Keys#定义函数缓慢拖拽页面,使其加载完成
def buffer():for i in range(50):time.sleep(0.3)browser.execute_script('window.scrollBy(0,300)', '')#定义函数,抓取商品一页的评论详情
comment_details = []
def com_info():#获取评论详情的父阶divs = browser.find_element_by_id('comment-0').find_elements_by_class_name('comment-item')#获取评论人群的会员分类for each in divs:if each.find_element_by_class_name('user-level').find_elements_by_tag_name('a'):member='PLUS会员'else:member='普通会员'# 评星star=each.find_element_by_class_name('comment-column').\find_element_by_tag_name('div').get_attribute('class')# 评语comment=each.find_element_by_class_name('comment-column').find_element_by_tag_name('p').text# 图片数或视频数pic_num=len(each.find_element_by_class_name('comment-column').find_elements_by_tag_name('div')[1].\find_elements_by_tag_name('a'))+len(each.find_element_by_class_name('comment-column').find_elements_by_tag_name('div')[1].\find_elements_by_tag_name('video'))#订单详情spans = each.find_element_by_class_name('order-info').find_elements_by_tag_name('span')order=[]for index, everyone in enumerate(spans):order.append(spans[index].text)single=[member,star,comment,pic_num,order]comment_details.append(single)#获得 京东每周一花的16个商品列表链接 这里可以定义函数,传入要抓取的关键字或页数,使其更加灵活
urltrue_list=[]
for i in range(16):url='https://search.jd.com/Search?keyword=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%AF%8F%E5%91%A8%E4%B8%80%E8%8A%B1&page='+str(i*2+1)+'&s='+str(i*60+1)+'&click=0'urltrue=request.unquote(url)urltrue_list.append(urltrue)# 定义函数,获取商品列表页所有的商品详情链接
browser = webdriver.Chrome()
detail_urls = []
def get():for each in urltrue_list:browser.get(each)  # 遍历每个链接time.sleep(5)global detail_urlsbuffer() # 缓冲,使页面加载完整info = browser.find_elements_by_class_name('gl-i-wrap')# 寻找商品链接的父阶for line in info:# 获取商品列表页所有的商品链接detail_url = line.find_element_by_class_name('p-img').find_element_by_tag_name('a').get_attribute('href')detail_urls.append(detail_url)time.sleep(3)print(len(detail_urls)) # 查看长度确认是否抓取了60个连接return detail_urls  # 返回商品列表页所有的商品链接组成的列表
get()import os
os.mkdir('txt')
os.chdir('txt')#遍历商品详情页,抓取目标数据,  这里可以对获取的每一个数据分开定义函数
result=[]
for index,each in enumerate(detail_urls): # 获取商品详情链接#browser.maximize_window()# 最大化窗口browser.get(each)time.sleep(3)file = open(str(index)+'.txt', 'w', encoding='utf-8')buffer()#获取商品名称title = browser.find_element_by_class_name('sku-name').text#获取价格(当前商品价格)price = browser.find_element_by_class_name('p-price').find_elements_by_xpath('span')[1].text#获取系列商品总评论条数(有不同规格)comment_num = browser.find_element_by_id('comment-count').find_element_by_tag_name('a').text#获取品牌brand = browser.find_element_by_id('parameter-brand').find_element_by_tag_name('a').text#获取店名shop_name = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[3].get_attribute('title')#获取商品重量weight = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[4].get_attribute('title')#获取适用人群user = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[5].get_attribute('title')#获取分类classify = browser.find_element_by_class_name('p-parameter').find_elements_by_tag_name('li')[6].get_attribute('title')buffer()#获取系列商品总好评度(有不同规格)praise_degree=browser.find_element_by_class_name('percent-con').text#获取系列商品总评价标签(有不同规格)tag_list = []tags = browser.find_elements_by_class_name(' tag-1')for tag in tags:tag_list.append(tag.text)browser.find_element_by_id('comm-curr-sku').send_keys(Keys.SPACE)  # 只看当前商品评价# 当前商品评论条数(单个)single_comment_num = browser.find_element_by_class_name('filter-list').find_elements_by_tag_name('em')[0].text# 当前商品评价标签single_tags = browser.find_element_by_class_name('filter-list').find_elements_by_tag_name('li')[1:7]single_tag_list = []for each in single_tags:det = each.find_element_by_tag_name('a').textsingle_tag_list.append(det)detail=[title,price,brand,shop_name,weight,user,classify,comment_num,praise_degree,tag_list,single_comment_num,single_tag_list]result+=detail # 将以上信息放到result列表中# 评论详情 包含用户会员等级、评星、评语、图片/视频数及订单详情for i in range(50): #这里的50设置的有问题,有些商品评价没有这么多,需要写if判断来决定循环多少次com_info()browser.find_elements_by_class_name('ui-pager-next')[0].send_keys(Keys.ENTER) #点击评论的下一页time.sleep(3)print(comment_details)con_text=comment_details# 存储   这里应该将存储单独定义函数# 将所有的商品信息存入到一个excel中,便于做行业分析# 将每个产品的评语分别存入txt文件便于做商品分析和用户分析file.write(str(comment_details)) #将每个商品的评语详情写入单独的txt文件from openpyxl import Workbookworkbook=Workbook()
sheet=workbook.active
sheet.title='每周一花商品数据'
sheet.append('商品名称,价格,品牌,店名,商品重量,适用人群,商品分类,系列商品总评论数,系列商品总好评度,系列商品总评价标签''当前商品评论条数,当前商品评价标签'.split(','))
#花材与产地因为信息不完整,没有抓取     如有分析需求再行补抓
for each in result:sheet.append(each)workbook.save('每周一花商品数据.xlsx')

五、运行结果

六、结语

python是万能的,我不是……

这篇博文仅记录自己编程的过程,为这段代码做个总结和review,有很多拙劣的地方,有时间再做优化。

[Python] python + selenium 抓取 京东商品数据(商品名称,售价,店铺,分类,订单信息,好评率,评论等)相关推荐

  1. selenium 抓取京东商品数据

    代码参考崔庆才老师的selenium课程,实现对京东界面的商品数据抓取,本博客用于记录. #-*- coding : utf-8 -*&- # @Time :2020/2/10 20:05 # ...

  2. Selenium实战之Python+Selenium爬取京东商品数据

    实战目标:爬取京东商品信息,包括商品的标题.链接.价格.评价数量. 代码核心在于这几个部分: 其一:使用元素定位来获取页面上指定需要抓取的关键字: 其二:将页面上定位得到的数据永久存储到本地文件中. ...

  3. 【需求】Python利用selenium抓取京东的地址数据

    文章目录 目的 爬取数据 目的 需要收集京东的地址信息省市区 # encoding:utf-8 # FileName: AreaCity # Date: 2022/07/22 11:55 # Auth ...

  4. Python爬取京东商品数据

    一.前言 由于京东反爬技术较强,使用常规方法爬取其数据行不通,且使用逆向分析技术又具有一定难度,所以本文将直接使用selenium爬取京东商品数据.若不知道怎么安装和配置selenium,请点击查阅笔 ...

  5. python抓取京东联盟优惠券_[爬虫]使用python抓取京东全站数据(商品,店铺,分类,评论)...

    网上抓取京东数据的文章,现在要么无法抓取数据,要么只能抓取部分数据,本文将介绍如何抓取京东全站数据,包括商品信息.店铺信息,评论信息,分类信息等. -------------------------- ...

  6. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

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

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

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

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

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

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

最新文章

  1. 字符集 ISO-8859-1(1)
  2. 征战蓝桥 —— 2013年第四届 —— C/C++A组第8题——买不到的数目
  3. 求圆面积的python代码_《求》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  4. h5关于选择器以及class的小加强
  5. Hadoop实战项目之网站数据点击流分析(转载分析)
  6. 微软Azure开源开发者(深圳)峰会等你来
  7. 华为波兰销售总监被捕;苹果将推三款新 iPhone;ofo 用冻结款还债 | 极客头条...
  8. docker mysql 漂移_Centos7系统Docker环境下Mysql部署
  9. 可重组合与不相邻组合
  10. java求sobel算子代码_sobel算子原理与实现
  11. May the Sunshine be with you!
  12. CSS盒模型(Box Model)
  13. ofd软件linux,数科和福昕OFD软件同银河麒麟桌面操作系统完成互相兼容认证
  14. pdf文件的预览——几种方式实现——技能提升
  15. 计算机科学也有民科!看知乎计算机民科辩论大战!
  16. Internet Explorer无法打开Internet 站点的原因
  17. 加权voronoi图 matlab,加权voronoi图matlab
  18. App中英文切换简单好用
  19. pyqt5背景色设置使用css或者是调色板
  20. 计算机毕业设计Java教育培训机构信息管理系统(源码+系统+mysql数据库+lW文档)

热门文章

  1. 费解的数字 递推+位运算
  2. 1946年第一台计算机在哪个国家面试,面试问题 计算机
  3. Python解答多元线性方程组
  4. android高德地图关键字搜索,关键字搜索-POI搜索-示例中心-JS API 示例 | 高德地图API...
  5. 【已解决】 ‘gbk‘ codec can‘t decode byte 0x93 in position 3136: illegal multibyte sequence
  6. 在光与影中用对白塑造灵魂
  7. phaser.sprite.body overlap collide seperate
  8. 帕累托分析(贡献度分析) → 帕累托法则:20/80定律
  9. java培训班 跟不上_如果去了Java培训班跟不上进度怎么办?
  10. 基于白鲸优化算法的函数寻优算法