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

python实现根据搜索关键词爬取某宝商品信息

当程序打开淘宝登陆页面后,需要快速手动登录淘宝,如果服务报错,需要重新登录!

pip安装库

pip install pyquery
pip install selenium
pip install openpyxl

# 代码说明:
'''
代码功能: 基于ChromeDriver爬取taobao(淘宝)平台商品列表数据
输入参数:  KEYWORLD --> 搜索商品“关键词”;pageStart --> 爬取起始页;pageEnd --> 爬取终止页;
输出文件:爬取商品列表数据'Page'        :页码'Num'         :序号'title'       :商品标题'Price'       :商品价格'Deal'        :商品销量'Location'    :地理位置'Shop'        :商品'IsPostFree'  :是否包邮'Title_URL'   :商品详细页链接'Shop_URL'    :商铺链接'Img_URL'     :图片链接
'''
# 声明第三方库/头文件
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
import time
import openpyxl as op               #导入Excel读写库# 全局变量
count = 1                           # 写入Excel商品计数
KEYWORD = input('输入搜索的商品关键词Keyword:')# 要搜索的商品的关键词
pageStart = int(input('输入爬取的起始页PageStart:'))# 爬取起始页
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.get('https://www.taobao.com')
# 窗口最大化
driver.maximize_window()
# wait是Selenium中的一个等待类,用于在特定条件满足之前等待一定的时间(这里是15秒)。
# 如果一直到等待时间都没满足则会捕获TimeoutException异常
wait = WebDriverWait(driver,10)
# 打开页面后会强制停止10秒,请在此时手动扫码登陆# 输入“关键词”,搜索
def search_goods(KEYWORD):try:print("正在搜索: {}".format(KEYWORD))# 找到搜索“输入框”input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))# 找到“搜索”按钮submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))# 输入框写入“关键词KeyWord”input.send_keys(KEYWORD)# 点击“搜索”按键submit.click()# 搜索商品后会再强制停止2秒,如有滑块请手动操作time.sleep(2)print("搜索完成!")except Exception as exc:print("search_goods函数错误!")# 翻页至第pageStar页
def turn_pageStart():try:print("正在翻转:第{}页".format(pageStart))# 滑动到页面底端driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")# 滑动到底部后停留3stime.sleep(3)# 找到输入“页面”的表单,输入“起始页”  请输入跳转到第几页pageInput = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[3]/input')))pageInput.send_keys(pageStart)# 找到页面跳转的“确定”按钮,并且点击admit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[3]')))admit.click()print("已翻至:第{}页".format(pageStart))except Exception as exc:print("turn_pageStart函数错误!")# 获取每一页的商品信息;
def get_goods(page):try:# 声明全局变量countglobal countif input('确认界面加载完毕,输入数字“1”开始爬取-->') == 1:pass# 获取html网页html = driver.page_sourcedoc = pq(html)# 提取所有商品的共同父元素的类选择器items = doc('div.content--CUnfXXxv > div > div').items()for item in items:# 定位商品标题title = item.find('.title--qJ7Xg_90 span').text()# 定位价格price_int = item.find('.priceInt--yqqZMJ5a').text()price_float = item.find('.priceFloat--XpixvyQ1').text()if price_int and price_float:price = float(f"{price_int}{price_float}")else:price = 0.0# 定位交易量deal = item.find('.realSales--XZJiepmt').text()# 定位所在地信息location = item.find('.procity--wlcT2xH9 span').text()# 定位店名shop = item.find('.shopNameText--DmtlsDKm').text()# 定位包邮的位置postText = item.find('.subIconWrapper--Vl8zAdQn').text()postText = "包邮" if "包邮" in postText else "/"# 定位商品urlt_url = item.find('.doubleCardWrapperAdapt--mEcC7olq')t_url = t_url.attr('href')# t_url = item.attr('a.doubleCardWrapperAdapt--mEcC7olq href')# 定位店名urlshop_url = item.find('.TextAndPic--grkZAtsC a')shop_url = shop_url.attr('href')# 定位商品图片urlimg = item.find('.mainPicAdaptWrapper--V_ayd2hD img')img_url = img.attr('src')# 定位风格style_list = item('div.abstractWrapper--whLX5va5 > div').items()style = []for s in style_list:s_span = s('div.descBox--RunOO4S3 > span').text()if s_span != '':style.append(s_span)# 构建商品信息字典product = {'Page':         page,'Num':          count-1,'title':        title,'price':        price,'deal':         deal,'location':     location,'shop':         shop,'isPostFree':   postText,'url':          t_url,'shop_url':     shop_url,'img_url':      img_url}print(product)# 商品信息写入Excel表格中wb.cell(row=count, column=1, value=page)                # 页码wb.cell(row=count, column=2, value=count-1)             # 序号wb.cell(row=count, column=3, value=title)               # 标题wb.cell(row=count, column=4, value=price)               # 价格wb.cell(row=count, column=5, value=deal)                # 付款人数wb.cell(row=count, column=6, value=location)            # 地理位置wb.cell(row=count, column=7, value=shop)                # 店铺名称wb.cell(row=count, column=8, value=postText)            # 是否包邮wb.cell(row=count, column=9, value=t_url)               # 商品链接wb.cell(row=count, column=10, value=shop_url)           # 商铺链接wb.cell(row=count, column=11, value=img_url)            # 图片链接for i in range(0,len(style)):wb.cell(row=count, column=12+i, value=style[i])     # 风格1~3count += 1                                              # 下一行except Exception:print("get_goods函数错误!")# 翻页函数
def page_turning(page_number):try:print("正在翻页: 第{}页".format(page_number))# 强制等待2秒后翻页time.sleep(2)# 找到“下一页”的按钮submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/button[2]')))submit.click()# 判断页数是否相等wait.until(EC.text_to_be_present_in_element((By.XPATH, '//*[@id="search-content-leftWrap"]/div[2]/div[4]/div/div/span[1]/em'), str(page_number)))print("已翻至: 第{}页".format(page_number))except Exception as exc:print("page_turning函数错误!")# 爬虫main函数
def Crawer_main():try:# 搜索KEYWORDsearch_goods(KEYWORD)# 判断pageStart是否为第1页if pageStart != 1:turn_pageStart()# 爬取PageStart的商品信息get_goods(pageStart)# 从PageStart+1爬取到PageEndif pageStart + 1 <= pageEnd:for i in range(pageStart + 1, pageEnd):page_turning(i)get_goods(i)else:returnexcept Exception as exc:print("Crawer_main函数错误!")if __name__ == '__main__':# 建立Excel表格try:ws = op.Workbook()                                  # 创建Workbookwb = ws.create_sheet(index=0)                       # 创建worsheet# Excel第一行:表头title_list = ['Page', 'Num', 'title', 'Price', 'Deal', 'Location', 'Shop', 'IsPostFree', 'Title_URL','Shop_URL', 'Img_URL', 'Style_1', 'Style_2', 'Style_3']for i in range(0, len(title_list)):wb.cell(row=count, column=i + 1, value=title_list[i])count += 1  # 从第二行开始写爬取数据print("Excel建立!")except Exception as exc:print("Excel建立失败!")# 开始爬取数据Crawer_main()# 保存Excel表格data = time.strftime('%Y%m%d-%H%M', time.localtime(time.time()))Filename = "{}_No.{}~{}_{}_FromTB.xlsx".format(KEYWORD,pageStart,pageEnd,data)ws.save(filename = Filename)print(Filename + "存储成功~")

相关文章:

python实现根据搜索关键词爬取某宝商品信息

当程序打开淘宝登陆页面后&#xff0c;需要快速手动登录淘宝&#xff0c;如果服务报错&#xff0c;需要重新登录&#xff01; pip安装库 pip install pyquery pip install selenium pip install openpyxl # 代码说明&#xff1a;代码功能&#xff1a; 基于ChromeDriver爬取tao…...

Posison Distribution

泊松分布 (Poisson Distribution) 泊松分布是概率论中的一个重要离散分布&#xff0c;描述单位时间或单位空间内随机事件发生的次数&#xff0c;假设事件是独立的且平均发生率是已知的。 定义 泊松分布的概率质量函数 (PMF) 为&#xff1a; P ( X k ) λ k e − λ k ! , …...

2024年最新多目标优化算法:多目标麋鹿群优化算法(MOEHO)求解ZDT1-ZDT4,ZDT6及工程应用---盘式制动器设计,提供完整MATLAB代码

一、麋鹿群优化算法 麋鹿群优化算法&#xff08;Elephant Herding Optimization&#xff0c;EHO&#xff09;是2024年提出的一种启发式优化算法&#xff0c;它的灵感来自麋鹿群的繁殖过程。麋鹿有两个主要的繁殖季节&#xff1a;发情和产犊。在发情季节&#xff0c;麋鹿群分裂…...

使用Webpack构建微前端应用

英文社区对 Webpack Module Federation 的响应非常热烈&#xff0c;甚至被誉为“A game-changer in JavaScript architecture”&#xff0c;相对而言国内对此热度并不高&#xff0c;这一方面是因为 MF 强依赖于 Webpack5&#xff0c;升级成本有点高&#xff1b;另一方面是国内已…...

Apache RocketMQ 5.1.3安装部署文档

官方文档不好使&#xff0c;可以说是一坨… 关键词&#xff1a;Apache RocketMQ 5.0 JDK 17 废话少说&#xff0c;开整。 1.版本 官网地址&#xff0c;版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…...

CMS(Concurrent Mark Sweep)垃圾回收器的具体流程

引言 CMS&#xff08;Concurrent Mark Sweep&#xff09;收集器是Java虚拟机中的一款并发收集器&#xff0c;其设计目标是最小化停顿时间&#xff0c;非常适合于对响应时间敏感的应用。与传统的串行或并行收集器不同&#xff0c;CMS能够尽可能地让垃圾收集线程与用户线程同时运…...

【Linux】Socket编程-UDP构建自己的C++服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; UDP 网络编程 &#x1f98b; 接口讲解&#x1f98b; V1 版本 - echo server&#x1f98b; V2 版本 - DictServer&#x1f98b; V3 版本 - 简单聊天室 二&a…...

磁盘结构、访问时间、调度算法

目录 一、什么是磁盘&#xff1f; 二、磁盘分类 1、从磁头分 2、通过盘面分 三、一次磁盘读/写的时间 四、磁盘调度算法 1、先来先到服务算法FCFS 2、最短寻找时间优先SSTF 3、扫描算法&#xff08;SCAN&#xff09; 4、LOOk算法 5、循环扫描算法&#xff08;C-SCAN…...

详解归并排序

归并排序 归并排序的基本概念归并排序的详细步骤1. 分解阶段2. 合并阶段3. 归并排序的递归流程 时间复杂度分析空间复杂度分析算法步骤2-路归并排序代码分析代码讲解1. 合并两个子数组的函数 merge()2. 归并排序函数 mergeSort()3. 打印数组的函数 printArray()4. 主函数 main(…...

45.在 Vue 3 中使用 OpenLayers 鼠标点击播放视频

引言 在 Web 开发中&#xff0c;地图可视化和互动功能是越来越重要的应用场景。OpenLayers 是一个强大的开源 JavaScript 库&#xff0c;用于显示和处理地图数据&#xff0c;支持多种地图服务和交互功能。在这个教程中&#xff0c;我们将介绍如何在 Vue 3 中集成 OpenLayers&a…...

《大话Java+playWright》系列教程初级篇-初识

后续代码会整理开源-大家期待吧&#xff01;&#xff01;&#xff01; 首先讲下为啥不用python&#xff0c;因为不想下载各种安装插件&#xff0c;太麻烦了&#xff0c;好多不兼容。 所以选择了java。 先来讲下什么是playwright&#xff0c;playwright是微软开源自动化测试工…...

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的实现原理-HTTPS的握手流程&#xff08;TLS1.2&#xff09; 简介1. TLS握手过程概述2. TLS握手过程细化3. 主密钥&#xff08;对称密钥&#xff09;生成过程4. 密码规范变更 简介 主要讲述了混合加密流程完成后&#xff0c;客户端和服务器如何共同获得相同的对称密钥…...

提示词工程

一、六何分析法快速写出准确的提示词 英文单词中文解释提问时的思考示例Why何故问题的背景&#xff0c;包括为什么做及目标&#xff08;做成什么样&#xff09;最近我们要与某品牌合作推广冲牙器&#xff0c;对方需要我们策划一场营销活动What何事具体是什么事写一个营销策划方…...

基于python网络爬虫的搜索引擎设计

一、毕业设计&#xff08;论文&#xff09;题目&#xff1a;基于网络爬虫的搜索引擎设计 - 基于网络爬虫的搜索引擎设计1 二、毕业设计&#xff08;论文&#xff09;工作自 2022-09-01 起至 2022-10-28 止 三、毕业设计&#xff08;论文&#xff09;内容要求&#xff1a; 主…...

ip-协议

文章目录 1. 网络层2. ip协议2.1 ip协议格式2.2 网段划分基本概念网段划分的两种方式为什么要网段划分&#xff1f;特殊的IP地址IP地址数量不足 2.3 私有IP与公网IP2.4 路由 3. IP的分片与组装为什么要分片与组装&#xff1f;如何分片&#xff1f;如何组装&#xff1f; 1. 网络…...

Git(11)之log显示支持中文

Git(11)之log显示支持中文 Author&#xff1a;Once Day Date&#xff1a;2024年12月21日 漫漫长路有人对你微笑过嘛… 参考文档&#xff1a;GIT使用log命令显示中文乱码_gitlab的log在matlab里显示中文乱码-CSDN博客 全系列文章可查看专栏: Git使用记录_Once_day的博客-CSD…...

oneflow深度学习框架使用问题总结(Windows/Linux)

目录 1.简述 2.在Windows下使用Oneflow深度学习框架&#xff08;错误记录&#xff0c;谨慎&#xff0c;官方不支持&#xff0c;需要WSL&#xff09; 2.1安装Anaconda 2.1创建虚拟环境 2.2安装Pytorch 2.3安装Pycharm 2.4 安装Oneflow 3.在Linux下使用Oneflow深度学习框…...

论文研读:AnimateDiff—通过微调SD,用图片生成动画

1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名&#xff1a;AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块&#xff1a; 视频域适应…...

SQLAlchemy示例(连接数据库插入表数据)

背景需求 连接数据库&#xff0c;插入表中一些数据。 其用户是新建用户&#xff0c;所以只能插入&#xff0c;不能更新。 再次输入数据则使用更新数据语法&#xff0c;这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...

Springboot3国际化

国际化实现步骤 Spring Boot 3 提供了强大的国际化支持&#xff0c;使得应用程序可以根据用户的语言和区域偏好适配不同的语言和地区需求。 添加国际化资源文件&#xff1a; 国际化资源文件通常放在 src/main/resources 目录下&#xff0c;并按照不同的语言和地区命名&#xf…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...