[Python爬虫] 抓取京东商品数据||京东商品API接口采集

news2024/9/28 13:15:38

本文结构:
一、引言
二、代码分享
三、问题总结

引言

这两天因为一些需求,研究了一下如何爬取京东商品数据。最开始还是常规地使用selenium库进行商品页的商品抓取,后来因为想要获取优惠信息,只能进入到商品详情页进行抓取,想着用selenium库模拟浏览器行为进行页面抓取速度有点慢,就改用了requests库直接发送请求,然后问题就来了:明明在页面看到了优惠满减字段,抓取的结果却是空白的。

百度研究了一番,总算找到了原因。最后因为商品抓取量不大,所以还是乖乖的使用了selenium库进行爬虫。

代码分享

爬虫代码如下:

# -*- coding: utf-8 -*-
"""
爬取京东商品排行榜商品信息
"""

from selenium import webdriver
from bs4 import BeautifulSoup
import pandas as pd
import re
import time


##京东排行榜地址:https://top.jd.com/

writer=pd.ExcelWriter(r"D:\python学习\京东排行榜商品.xlsx")##数据写入的文件

##使用selenium模拟浏览器登陆
#需要下载安装chromedriver
driver = webdriver.Chrome(r"C:\chromedriver.exe")
driver.set_page_load_timeout(60)#设置页面最大加载等待时间

category = ["手机","平板电脑"]#需要爬取的品类
category_url = ["https://top.jd.com/sale?cateId=653","https://top.jd.com/sale?cateId=2694"]#爬取品类的网页

for ci,c in enumerate(category_url,start=0):
    driver.get(c)#发送请求
    time.sleep(3)

#################################获取排行榜信息###############################333
    info_name =[] #商品信息
    tag1 = [] #标签一:x天最低
    tag2 = [] #标签二:自营/包邮/促销/赠品
    tag3 = [] #标签三:好评率
    price = [] #商品价格
    link = [] #商品详情页

    bs = BeautifulSoup(driver.page_source,"html.parser")
    sale_list = bs.findAll("li",class_=re.compile('saleitem'))
    for s in sale_list:
        info_name.append(s.find("p",class_ = "saleitem_info_name").get_text())

        t = s.find("li",class_ = "top_mod_tag_item top_mod_tag_dj")
        if t is not None:
            tag1.append(t.get_text())
        else:
            tag1.append("")
        t = s.find("li",class_ = re.compile("top_mod_tag_item top_mod_tag_[^(dj)]"))
        if t is not None:
            tag2.append(t.get_text())
        else:
            tag2.append("")
        t = s.find("li",class_ = "top_mod_tag_item",text=re.compile("好评率.*"))
        if t is not None:
            tag3.append(t.get_text())
        else:
            tag3.append("")
        price.append(s.find('p',class_ = "saleitem_info_price").get_text())
        link.append(s.find('a',class_ = "saleitem_link").get("href"))


#################进入商品详情页,获取商品的优惠券########################  
    coupon = []
    for i,l in enumerate(link, start=1):
        driver.get(r"https:" + l)
        time.sleep(3)
        bs = BeautifulSoup(driver.page_source,"html.parser")
        try:
            coupon.append(bs.find("div",class_="summary").find("div",id = "summary-quan").find("span",class_ = "text").get_text())
        except:
            coupon.append("")
        print("抓取品类:%s,第%d个商品优惠券信息完成" %(category[ci],i))
        time.sleep(3)


    data = pd.DataFrame({"商品信息":info_name,"标签一(x天最低)":tag1,"标签二(自营/包邮/促销/赠品)":tag2,"标签三(好评率)":tag3,"价格":price,"商品详情页":link,"优惠券":coupon})
    data.to_excel(writer,sheet_name=category[ci],index=False)

driver.close()    

爬虫的步骤很简单。直接使用selenium库webdriver访问需要抓取的网址,然后进行html标签定位,使用Beautifulsoup库进行数据提取,之后使用pandas写入excel文件保存。

抓取结果如下:

图片

问题总结

最开始的问题出在哪儿呢?为什么如果直接使用requests库get请求,结果抓取不到价格数据?

简单代码尝试了一下

import requests
from bs4 import BeautifulSoup
response = requests.get("https://item.jd.com/27009615825.html")
bs = BeautifulSoup(response.content,"html.parser")
print(bs.find("div",class_="summary").find("div",id = "summary-quan").find("span",class_ = "text"))

明明打开浏览器的开发者工具可以看到优惠信息就存放在class属性值为 ‘text’的span标签下,但是抓取到的结果却为空。

图片

输出结果如下:

In[1]: print(bs.find("div",class_="summary").find("div",id = "summary-quan").find("span",class_ = "text"))None

百度了解到的原因是,京东网页中价格等信息并不是存放在静态网页中的,我们使用requests获取到网页源码,进行html解析,只会获取到空值。京东会采取js动态加载数据。那些商品价格、优惠券信息等等,并不是放在静态网页中的。每次加载页面,js脚本都会对数据接口进行调用请求数据,然后返回到页面上。所以,对于动态页面的抓取,一种办法就是借助工具找到js脚本请求的数据接口,使用requests库直接访问该接口获取数据。如价格信息就放在:

https://p.3.cn/prices/mgets?callback=jQuery6775278&skuids=J_(skuid)

其中链接最后括号里存放商品的sku id,比如:

https://p.3.cn/prices/mgets?callback=jQuery6775278&skuids=J_27009615825

商品的sku id可以在商品详情页的html抓取到。

关于京东的数据抓取,网上能百度到有完整的项目,有兴趣的可以了解一下:

CSDN地址:
https://blog.csdn.net/Kandy_Ye/article/details/70183110
Github代码:
https://github.com/KandyYe/JDSpider

另外,更加简单的一种办法就是使用selenium库进行数据采集了。selenium模拟浏览器行为,等到页面加载完成后,再获取完整的数据源码,所以在处理数据的时候就不需要担心我们抓取不到啦。但是有点小缺陷就是,selenium库比requests要慢。

据说还有一个两者的结合体——requestium,或许可以有更好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阶段三:项目开发---民航功能模块实现:任务24:航空实时监控

任务描述 内 容:地图展示、飞机飞行轨迹、扇区控制。航空实时监控,是飞机每秒发送坐标,经过终端转换实时发送给塔台,为了飞机位置的精准度,传输位置的密度很大,在地图位置显示不明显。本次为了案例展示效…

如何成功的设计BGA?

目前,用于容纳各种先进多功能半导体器件(如 FPGA 和微处理器)的标准封装是球栅阵列 (BGA)。BGA 封装中的组件用于各种嵌入式设计中,既可用作主机处理器,也可用作存储器等外设。多年来&#xff0…

抖音机构号授权源码全解析

抖音机构号授权源码是抖音平台为了方便机构用户进行授权管理而推出的一项服务。随着抖音平台的快速发展,越来越多的机构开始意识到抖音作为一种强大的营销渠道的价值。为了更好地利用抖音平台的资源,许多机构开始了解抖音机构号的功能和优势,…

css 文件重复类样式删除

上传文件 进行无关 className 删除 <div style"display: flex;"><input type"file" change"handleFileUpload" /><el-button click"removeStyles" :disabled"!fileContent">Remove Styles and Download&…

科普文:Linux服务器常用命令和脚本

Linux服务器常用的命令&#xff1a;find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk&#xff1b;提供的例子和参数都是最常用和最为实用的。 1.find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 正…

VS2019 因公司加密无法运行程序原因

问题原因&#xff0c;点击编译运行按钮出现以下问题 首先右击项目&#xff0c;然后点击属性&#xff0c;点击应用程序&#xff0c;将资源里面的清单修改为 创建不带清单的应用程序&#xff0c;即可

竞速赛车游戏推荐:极品飞车14:热力追踪 (Win/Mac) 安装包

《极品飞车14&#xff1a;热力追踪》&#xff08;Need for Speed: Hot Pursuit&#xff09;是《极品飞车》系列的第14部作品&#xff0c;于2010年11月发行。这款游戏是继《极品飞车&#xff1a;热力追踪2》后&#xff0c;系列再次回归该名称。 游戏采用 Criterion Games 的开放…

STM32的独立看门狗详解

目录 1.独立看门狗是什么&#xff1f; 2.独立看门狗的作用 3.独立看门狗的实现原理 4.独立看门狗用到的寄存器 4.1 IWDG_KR &#xff08;关键字计时器&#xff09; 4.2 IWDG_PR&#xff08;预分频寄存器&#xff09; 4.3 IWDG_RLR&#xff08;重装载寄存器&#xff09…

土壤水分及其频谱分析

祁连山综合观测网&#xff1a;黑河流域地表过程综合观测网&#xff08;混合林站自动气象站-2018&#xff09; import pandas as pd dfpd.read_excel(rC:\Users\mengx\Desktop\土壤水分的频谱分析\祁连山综合观测网&#xff1a;黑河流域地表过程综合观测网&#xff08;混合林站…

RocketMQ之消费者,重平衡机制与流程详解附带源码解析

1. 背景 本文是 RocketMQ 消费者系列的第三篇&#xff0c;介绍消费者重平衡。 我把 RocketMQ 消费分成如下几个步骤 重平衡 消费者拉取消息 Broker 接收拉取请求后从存储中查询消息并返回 消费者消费消息 其中重平衡是消费者开始消费的起点。 1.1 重平衡的含义 RocketMQ 的 To…

【单片机毕业设计选题24052】-基于STM32的智能书桌设计

系统功能: 基于stm32单片机的智能书桌设计 1.手动&#xff1a;升降桌&#xff0c;调整桌面高度&#xff0c;实现升降功能&#xff0c; 2.自动&#xff1a;光敏控制灯的亮度 手动&#xff1a;开关灯 3.自动&#xff1a;检测学习姿势报警&#xff0c;超声波检测人是否坐的太…

【单片机毕业设计选题24051】-基于STM32的温室大棚控制系统

系统功能: 1、检测环境温湿度&#xff0c;土壤湿度&#xff0c;光照强度和二氧化碳浓度并在OLED和APP上显示。 2、当空气温度过高时则打开风扇通风。 3、当空气湿度过低时打开加湿器加湿。 4、土壤湿度过低&#xff0c;打开水泵。 5、光照不足则打开LED,反之则关闭…

麒麟系统设置中添加打印机按钮无响应的解决办法

原文链接&#xff1a;麒麟系统设置中添加打印机按钮无响应的解决办法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在麒麟桌面操作系统上点击设置中的添加打印机按钮无响应的解决办法的文章。打印机是我们日常办公的重要工具&#xff0c;如果添加打印机按钮无…

昇思25天学习打卡营第15天|应用实践之ShuffleNet图像分类

基本介绍 今天的应用实践的领域是计算机视觉领域&#xff0c;更确切的说是图像分类任务&#xff0c;不过&#xff0c;与昨日不同的是&#xff0c;今天所使用的模型是ShuffleNet模型。ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一…

柳永,市井生活的吟游者

柳永&#xff0c;原名柳三变&#xff0c;字景庄&#xff0c;后改名为柳永&#xff0c;字耆卿&#xff0c;约生于宋太宗雍熙元年&#xff08;公元984年&#xff09;&#xff0c;卒于宋仁宗皇祐五年&#xff08;公元1053年&#xff09;&#xff0c;享年69岁。他是北宋著名词人&am…

最近换工作的一些启示,清华学姐篇

最近更新频率慢下来了&#xff0c;一部分原因是沉迷运动不能自拔&#xff0c;还有一部分原因是业余分出来很大的精力来拓展个人的边界&#xff0c;希望在工作之外取得一些成绩&#xff0c;写作上耽误了不少&#xff0c;很难做到日更。 所以整体上今年更新频率较低&#xff0c;但…

重载、覆盖(重写)、重定义(同名隐藏)的区别 (超详解)

&#x1f4da; 重载&#xff08;Overloading&#xff09;、覆盖&#xff08;Overriding&#xff09;、重定义&#xff08;Hiding&#xff09;是面向对象编程中常见的概念&#xff0c;它们分别用于描述不同情况下函数或方法的行为。 目录 重载&#xff08;Overloading&#xff…

Zynq系列FPGA实现SDI视频编解码+图像缩放+多路视频拼接,基于GTX高速接口,提供8套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB自研…

一个简单的 Vue 组件例子

https://andi.cn/page/621509.html

17.分频器设计拓展练习-任意分频通用模块

(1)Verilog代码&#xff1a; module divider_n(clk,reset_n,clk_out);input clk;input reset_n;output clk_out;wire clk_out1;wire clk_out2;wire [9:0]n;wire m;assign n 9;assign m n % 2;divider_even divider_even_inst(.clk(clk),.reset_n(reset_n),.n(n),.en(!m),.cl…