当前位置: 首页 > news >正文

【爬虫】Python实现爬取京东商品信息(超详细)

目录

项目介绍

代码部分

引用第三方库

全局定义

主函数

爬虫主函数代码

搜索“关键词”

翻页函数代码

获取商品列表信息代码

完整代码

项目介绍

项目基于Python的第三方库Selenium模拟浏览器运行、lxml的etree解析和操作HTML文档,获取京东平台中某类商品的详细信息(商品标题、价格、销量、商铺名称、地区、商品详情页链接、商铺链接等),并基于第三方库openpyxl建立、存储于Excel表格中。

效果预览:

代码部分

引用第三方库

# 声明第三方库/头文件
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from lxml import etree
import time
import openpyxl as op               #导入Excel读写库

【第三方库】主要运用到selenium、openpyxl、lxml等Python的第三方库;如若缺失,使用pip指令安装即可。

pip install selenium
pip install lxml
pip install openpyxl

【ChromeDriver下载与安装】若运行过程中出现如下问题,可能是ChromeDriver版本与Chrome版本不一致导致,需要对ChromeDriver进行更新。ChromeDriver下载与安装:手把手教你,ChromeDriver下载与安装

全局定义

输入初始参数:

  • 爬取商品的关键词KEYWORD
  • 爬取网页的终止页pageEnd

启动ChromeDriver服务,并请求京东网页(京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!)

# 定义全局变量
count = 1KEYWORD = input('输入搜索的商品关键词Keyword:')# 要搜索的商品的关键词
pageEnd = int(input('输入爬取的终止页PageEnd:'))# 爬取终止页# 启动ChromeDriver服务
options = webdriver.ChromeOptions()
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
options.add_experimental_option("excludeSwitches", ['enable-automation'])
# 把chrome设为selenium驱动的浏览器代理;
driver = webdriver.Chrome(options=options)
# 反爬机制
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
# 窗口最大化
driver.maximize_window()
# 请求京东(JD)网页
driver.get('https://www.jd.com/')
# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是20秒)。
# 如果一直到等待时间都没满足则会捕获TimeoutException异常
wait = WebDriverWait(driver,20)

主函数

1、建立Excel表格,并设置第一行(表头);

2、调爬虫主函数Crawer_main,启动爬虫程序;

3、输出.xlsx格式文件。

if __name__ == '__main__':# 建立Excel表格try:ws = op.Workbook()                                  # 创建Workbookwb = ws.create_sheet(index=0)                       # 创建worsheet# Excel第一行:表头title_list = ['Num', 'title', 'Price', 'Marker', 'Shop', 'Title_URL','Shop_URL', 'Img_URL']for i in range(0, len(title_list)):wb.cell(row=count, column=i + 1, value=title_list[i])count += 1  # 从第二行开始写爬取数据except Exception as exc:print("Excel建立失败!")# 爬取主函数Crawer_main()# 保存Excel表格data = time.strftime('%Y%m%d-%H%M', time.localtime(time.time()))Filename = "{}_{}_FromJD.xlsx".format(KEYWORD,data)ws.save(filename = Filename)print(Filename + "存储成功~")

(输入)效果预览:

爬虫主函数代码

1、找到“输入框”输入关键词KEYWORD,并点击“搜索”按键;

2、若弹出登录窗口,登录即可;

3、从第1页爬取到第PageEnd页;

4、调用get_goods获取起始页PageStart的商品列表信息;

5、调用page_turning翻页进行翻页,并爬取第PageStart+1页到第PageEnd页商品信息。

# 爬虫main函数
def Crawer_main():try:# 搜索KEYWORDsearch_goods()# 从1爬取到PageEndfor i in range(1, pageEnd + 1):get_goods(i)if (i+1 < pageEnd+1):page_turning()except Exception as exc:print("Crawer_main函数错误!Error:{}".format(exc))

淘宝登录界面示意图:

搜索“关键词”

ChromeDriver服务请求京东服务,模拟浏览器运行,找到“输入框”输入关键词KEYWORD,并点击“搜索”按键。

# 输入“关键词”,搜索
def search_goods():try:print("正在搜索: {}".format(KEYWORD))# 找到“搜索框”search = driver.find_element(By.XPATH,'//*[@id="key"]')# 输入框写入“关键词KeyWord”search.send_keys(KEYWORD)# 强制等待1秒钟,待系统响应结束time.sleep(1)# 点击“回车”按键,搜索“关键词KEYWORD”search.send_keys(Keys.ENTER)print("搜索完成!")except Exception as exc:print("search_goods函数错误!Error:{}".format(exc))

翻页函数代码

翻页函数page_turning,搜索并点击“下一页”按键;

# 翻页函数
def page_turning():try:# 获取“下一页”按钮,并点击time.sleep(1)driver.find_element(By.XPATH,'//*[@id="J_bottomPage"]/span[1]/a[9]').click()time.sleep(1)driver.refresh()except Exception as exc:print("page_turning函数错误!Error:{}".format(exc))

获取商品列表信息代码

1、滑动页面至页码选择界面(如图所示),待页面所有信息加载完成后,按下“Enter”开始爬取当前页内容;

2、etree请求HTML页面信息,并进行解析;

3、商品详细信息(商品标题、价格、销量、商铺名称、地区、详情页链接、商铺链接等)

4、将获取的信息写入字典和Excel表格中;

# 获取每一页的商品信息
def get_goods(page):try:# 声明全局变量countglobal count# 刷新/滑动界面,使所有信息都加载完成后,手动输入数字"1",开始爬取if input('确认界面加载完毕,输入数字“1”开始爬取-->') == 1:pass# 获取html网页html = driver.page_sourcehtml = etree.HTML(html)# 提取所有商品的共同父元素的类选择器li_list = html.xpath('//*[@id="J_goodsList"]/ul/li')for li in li_list:t = li.xpath('./div/div[4]/a/em//text()')             # 获取名称title = ''.join(t)title = title.replace(" ","")price = li.xpath('./div/div[3]/strong/i/text()')[0]   # 获取价格mark = li.xpath('./div/div[5]/strong/a/text()')[0]    # 评价人数marker = mark.split(" ")[1]marker = marker.split("+")[0]shop = li.xpath('./div/div[7]/span/a/text()')[0]      # 获取商店Title_URL = li.xpath('./div/div[1]/a/@href')[0]       # 获取商品链接Shop_URL = li.xpath('./div/div[7]/span/a/@href')[0]   # 获取商铺链接Img_URL = li.xpath('./div/div[1]/a/img/@src')[0]      # 获取商品图片链接Num = "JD{}_{}".format(time.strftime('%Y%m', time.localtime(time.time())), count-1)# 存储商品详细信息product = {'Page':page,'Num':Num,'Title':title,'Price':price,'Marker':marker,'Shop':shop,'Title_URL':Title_URL,'Shop_URL':Shop_URL,'Img_URL':Img_URL}print(product)# 商品信息写入Excel表格中wb.cell(row=count, column=1, value=Num)       # 序号wb.cell(row=count, column=2, value=title)     # 标题wb.cell(row=count, column=3, value=price)     # 价格wb.cell(row=count, column=4, value=marker)    # 评价人数wb.cell(row=count, column=5, value=shop)      # 店铺名称wb.cell(row=count, column=6, value=Title_URL) # 商品链接wb.cell(row=count, column=7, value=Shop_URL)  # 商铺链接wb.cell(row=count, column=8, value=Img_URL)   # 图片链接count += 1except Exception as exc:print("get_goods函数错误!Error:{}".format(exc))

京东界面页码选择界面示意图:

获取商品列表信息示意图:

完整代码

【使用说明】鉴于浏览器请求数据受到网络限制和网页可能出现需要滑动验证等不确定因素,故代码由“定时延时方式”改为“手动确认方式”以便留足时间等待数据请求;数据请求完成后,按下“Enter”开始爬取当前页商品详情(如下图所示)。

【小技巧】请求数据期间,可手动滑动京东界面,加载商品详情(注意:滑动到页面选择位置即可)为方便起见,亦可按住“Ctrl”按键滑动鼠标滚轮,使浏览器调整百分比至整个网页全部显示出来。

【爬虫】Python实现爬取京东商品信息(超详细)

# 声明第三方库/头文件
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from lxml import etree
import time
import openpyxl as op               #导入Excel读写库# 定义全局变量
count = 1KEYWORD = input('输入搜索的商品关键词Keyword:')# 要搜索的商品的关键词
pageEnd = int(input('输入爬取的终止页PageEnd:'))# 爬取终止页# 启动ChromeDriver服务
options = webdriver.ChromeOptions()
# 关闭自动测试状态显示 // 会导致浏览器报:请停用开发者模式
options.add_experimental_option("excludeSwitches", ['enable-automation'])
# 把chrome设为selenium驱动的浏览器代理;
driver = webdriver.Chrome(options=options)
# 反爬机制
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
# 窗口最大化
driver.maximize_window()
# 请求京东(JD)网页
driver.get('https://www.jd.com/')
# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是20秒)。
# 如果一直到等待时间都没满足则会捕获TimeoutException异常
wait = WebDriverWait(driver,20)# 输入“关键词”,搜索
def search_goods():try:print("正在搜索: {}".format(KEYWORD))# 找到“搜索框”search = driver.find_element(By.XPATH,'//*[@id="key"]')# 输入框写入“关键词KeyWord”search.send_keys(KEYWORD)# 强制等待1秒钟,待系统响应结束time.sleep(1)# 点击“回车”按键,搜索“关键词KEYWORD”search.send_keys(Keys.ENTER)print("搜索完成!")except Exception as exc:print("search_goods函数错误!Error:{}".format(exc))# 翻页函数
def page_turning():try:# 获取“下一页”按钮,并点击time.sleep(1)driver.find_element(By.XPATH,'//*[@id="J_bottomPage"]/span[1]/a[9]').click()time.sleep(1)driver.refresh()except Exception as exc:print("page_turning函数错误!Error:{}".format(exc))# 爬虫main函数
def Crawer_main():try:# 搜索KEYWORDsearch_goods()# 从1爬取到PageEndfor i in range(1, pageEnd + 1):get_goods(i)if (i+1 < pageEnd+1):page_turning()except Exception as exc:print("Crawer_main函数错误!Error:{}".format(exc))# 获取每一页的商品信息
def get_goods(page):try:# 声明全局变量countglobal count# 刷新/滑动界面,使所有信息都加载完成后,手动输入数字"1",开始爬取if input('确认界面加载完毕,输入数字“1”开始爬取-->') == 1:pass# 获取html网页html = driver.page_sourcehtml = etree.HTML(html)# 提取所有商品的共同父元素的类选择器li_list = html.xpath('//*[@id="J_goodsList"]/ul/li')for li in li_list:t = li.xpath('./div/div[4]/a/em//text()')             # 获取名称title = ''.join(t)title = title.replace(" ","")price = li.xpath('./div/div[3]/strong/i/text()')[0]   # 获取价格mark = li.xpath('./div/div[5]/strong/a/text()')[0]    # 评价人数marker = mark.split(" ")[1]marker = marker.split("+")[0]shop = li.xpath('./div/div[7]/span/a/text()')[0]      # 获取商店Title_URL = li.xpath('./div/div[1]/a/@href')[0]       # 获取商品链接Shop_URL = li.xpath('./div/div[7]/span/a/@href')[0]   # 获取商铺链接Img_URL = li.xpath('./div/div[1]/a/img/@src')[0]      # 获取商品图片链接Num = "JD{}_{}".format(time.strftime('%Y%m', time.localtime(time.time())), count-1)# 存储商品详细信息product = {'Page':page,'Num':Num,'Title':title,'Price':price,'Marker':marker,'Shop':shop,'Title_URL':Title_URL,'Shop_URL':Shop_URL,'Img_URL':Img_URL}print(product)# 商品信息写入Excel表格中wb.cell(row=count, column=1, value=Num)       # 序号wb.cell(row=count, column=2, value=title)     # 标题wb.cell(row=count, column=3, value=price)     # 价格wb.cell(row=count, column=4, value=marker)    # 评价人数wb.cell(row=count, column=5, value=shop)      # 店铺名称wb.cell(row=count, column=6, value=Title_URL) # 商品链接wb.cell(row=count, column=7, value=Shop_URL)  # 商铺链接wb.cell(row=count, column=8, value=Img_URL)   # 图片链接count += 1except Exception as exc:print("get_goods函数错误!Error:{}".format(exc))if __name__ == '__main__':# 建立Excel表格try:ws = op.Workbook()                                  # 创建Workbookwb = ws.create_sheet(index=0)                       # 创建worsheet# Excel第一行:表头title_list = ['Num', 'title', 'Price', 'Marker', 'Shop', 'Title_URL','Shop_URL', 'Img_URL']for i in range(0, len(title_list)):wb.cell(row=count, column=i + 1, value=title_list[i])count += 1  # 从第二行开始写爬取数据except Exception as exc:print("Excel建立失败!")# 爬取主函数Crawer_main()# 保存Excel表格data = time.strftime('%Y%m%d-%H%M', time.localtime(time.time()))Filename = "{}_{}_FromJD.xlsx".format(KEYWORD,data)ws.save(filename = Filename)print(Filename + "存储成功~")

【不足】不足之处,恳请批评指正,我们共同进步!

【参考】博主发布的Python实现爬取淘宝商品信息(超详细)

http://www.dtcms.com/a/278784.html

相关文章:

  • 期权和期货的区别主要是什么?
  • [论文阅读] 人工智能 | 用大型语言模型玩转多语言主观性检测:CheckThat! 2025赛事中的亮眼表现
  • Unity3D + VS2022连接雷电模拟器调试
  • 【PTA数据结构 | C语言版】字符串连接操作(不限长)
  • 分布式一致性协议
  • Android动画:属性动画以及实现点击图标缩放的动画效果
  • Relocations in generic ELF (EM: 40)
  • “国乙黑月光”指的是谁?
  • YOLOv11调参指南
  • Maven 依赖原则和依赖冲突
  • Docker入门指南(超详细)
  • Jetpack Compose 重组陷阱:一个“乌龙”带来的启示
  • yolo8+声纹识别(实时字幕)
  • 从“炼丹”到“流水线”——如何用Prompt Engineering把LLM微调成本打下来?
  • 前端缓存优化全景指南:从HTTP到应用层的性能加速实践
  • 学习软件测试的第十五天
  • PHP password_verify() 函数
  • 设备巡检系统的主要用途
  • Java 大视界 -- 基于 Java 的大数据可视化在城市地下管网管理与风险预警中的应用
  • 2025-07-14如何批量下载behance网站里的图片?
  • 神经网络项目--基于FPGA的AI简易项目(1-9图片数字识别)
  • 如何基于FFMPEG 实现视频推拉流
  • liunx常用命令(二)
  • SLAM 前端
  • 一文读懂循环神经网络(RNN)—语言模型+n元语法(1)
  • LightGBM(Light Gradient Boosting Machine)
  • 3分钟搭建自动签到打卡RPA程序:验证码自动识别
  • ImportError: DLL load failed while importing _base: 找不到指定的程序。
  • 深浅拷贝以及函数缓存
  • Node.js + Express的数据库AB View切换方案设计