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实现根据搜索关键词爬取某宝商品信息
当程序打开淘宝登陆页面后,需要快速手动登录淘宝,如果服务报错,需要重新登录! pip安装库 pip install pyquery pip install selenium pip install openpyxl # 代码说明:代码功能: 基于ChromeDriver爬取tao…...
Posison Distribution
泊松分布 (Poisson Distribution) 泊松分布是概率论中的一个重要离散分布,描述单位时间或单位空间内随机事件发生的次数,假设事件是独立的且平均发生率是已知的。 定义 泊松分布的概率质量函数 (PMF) 为: P ( X k ) λ k e − λ k ! , …...

2024年最新多目标优化算法:多目标麋鹿群优化算法(MOEHO)求解ZDT1-ZDT4,ZDT6及工程应用---盘式制动器设计,提供完整MATLAB代码
一、麋鹿群优化算法 麋鹿群优化算法(Elephant Herding Optimization,EHO)是2024年提出的一种启发式优化算法,它的灵感来自麋鹿群的繁殖过程。麋鹿有两个主要的繁殖季节:发情和产犊。在发情季节,麋鹿群分裂…...

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

Apache RocketMQ 5.1.3安装部署文档
官方文档不好使,可以说是一坨… 关键词:Apache RocketMQ 5.0 JDK 17 废话少说,开整。 1.版本 官网地址,版本如下。 https://rocketmq.apache.org/download2.配置文件 2.1namesrv端口 在ROCKETMQ_HOME/conf下 新增namesrv.pro…...
CMS(Concurrent Mark Sweep)垃圾回收器的具体流程
引言 CMS(Concurrent Mark Sweep)收集器是Java虚拟机中的一款并发收集器,其设计目标是最小化停顿时间,非常适合于对响应时间敏感的应用。与传统的串行或并行收集器不同,CMS能够尽可能地让垃圾收集线程与用户线程同时运…...

【Linux】Socket编程-UDP构建自己的C++服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 UDP 网络编程 🦋 接口讲解🦋 V1 版本 - echo server🦋 V2 版本 - DictServer🦋 V3 版本 - 简单聊天室 二&a…...

磁盘结构、访问时间、调度算法
目录 一、什么是磁盘? 二、磁盘分类 1、从磁头分 2、通过盘面分 三、一次磁盘读/写的时间 四、磁盘调度算法 1、先来先到服务算法FCFS 2、最短寻找时间优先SSTF 3、扫描算法(SCAN) 4、LOOk算法 5、循环扫描算法(C-SCAN…...
详解归并排序
归并排序 归并排序的基本概念归并排序的详细步骤1. 分解阶段2. 合并阶段3. 归并排序的递归流程 时间复杂度分析空间复杂度分析算法步骤2-路归并排序代码分析代码讲解1. 合并两个子数组的函数 merge()2. 归并排序函数 mergeSort()3. 打印数组的函数 printArray()4. 主函数 main(…...

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

《大话Java+playWright》系列教程初级篇-初识
后续代码会整理开源-大家期待吧!!! 首先讲下为啥不用python,因为不想下载各种安装插件,太麻烦了,好多不兼容。 所以选择了java。 先来讲下什么是playwright,playwright是微软开源自动化测试工…...

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)
05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2) 简介1. TLS握手过程概述2. TLS握手过程细化3. 主密钥(对称密钥)生成过程4. 密码规范变更 简介 主要讲述了混合加密流程完成后,客户端和服务器如何共同获得相同的对称密钥…...
提示词工程
一、六何分析法快速写出准确的提示词 英文单词中文解释提问时的思考示例Why何故问题的背景,包括为什么做及目标(做成什么样)最近我们要与某品牌合作推广冲牙器,对方需要我们策划一场营销活动What何事具体是什么事写一个营销策划方…...
基于python网络爬虫的搜索引擎设计
一、毕业设计(论文)题目:基于网络爬虫的搜索引擎设计 - 基于网络爬虫的搜索引擎设计1 二、毕业设计(论文)工作自 2022-09-01 起至 2022-10-28 止 三、毕业设计(论文)内容要求: 主…...

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

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

oneflow深度学习框架使用问题总结(Windows/Linux)
目录 1.简述 2.在Windows下使用Oneflow深度学习框架(错误记录,谨慎,官方不支持,需要WSL) 2.1安装Anaconda 2.1创建虚拟环境 2.2安装Pytorch 2.3安装Pycharm 2.4 安装Oneflow 3.在Linux下使用Oneflow深度学习框…...

论文研读:AnimateDiff—通过微调SD,用图片生成动画
1.概述 AnimateDiff 设计了3个模块来微调通用的文生图Stable Diffusion预训练模型, 以较低的消耗实现图片到动画生成。 论文名:AnimateDiff: Animate Your Personalized Text-to-Image Diffusion Models without Specific Tuning 三大模块: 视频域适应…...
SQLAlchemy示例(连接数据库插入表数据)
背景需求 连接数据库,插入表中一些数据。 其用户是新建用户,所以只能插入,不能更新。 再次输入数据则使用更新数据语法,这个没调试。 #! /usr/bin/env python # -*- coding: utf-8 -*-from sqlalchemy import create_engine, …...

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

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...