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 + "存储成功~")

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

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

相关文章

Vue3 中使用axios

1.安装axios、js-cookie、pinia axios命令行&#xff1a; npm install axios js-cookie命令行&#xff1a; npm install js-cookie store命令行&#xff1a; npm install pinia 2.配置文件 (1)缓存文件配置 src/plugins/auth.js const sessionCache {set (key, valu…

从AI换脸到篡改图像,合合信息如何提升视觉内容安全?

本文目录 引言一、AI“真假之战”下的发展现状与考验挑战1.1 视觉内容安全现状与技术分类1.2视觉内容安全企业1.3视觉内容安全领域挑战 二、开山之石&#xff1a;引领视觉内容安全的创新之路2.1合合内容安全系统2.2发起编制相关技术规范2.3参与篡改检测挑战赛 三、视觉内容安全…

IBatis和MyBatis在细节上的不同有哪些

iBatis 和 MyBatis 都是流行的 Java 持久化框架&#xff0c;用于简化数据库交互。MyBatis 是从 iBatis 演化而来&#xff0c;MyBatis 在 iBatis 的基础上做了很多改进和优化&#xff0c;因此两者在设计和功能上存在一些差异。以下是它们在细节上的主要区别&#xff1a; 1. 框架…

解决Ubuntu下无法装载 Windows D盘的问题

电脑安装了 Windows 和 Ubuntu 24.04 后&#xff0c;在Ubuntu系统上装载 D盘&#xff0c;发现无法装载错误如下&#xff1a; Error mounting /dev/nvme0n1p4 at /media/jackeysong/Data: wrong fs type, bad option, bad superblock on /dev/nvme0n1p4, missing codepage or h…

STM32-笔记10-手写延时函数(SysTick)

1、什么是SysTick Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的倒计数定时器‌。它从设定的初值&#xff08;即重载值&#xff09;开始计数&#xff0c;每经过一个系统时钟周期&#xff0…

“AI+Security”系列第4期(一)之“洞” 见未来:AI 驱动的漏洞挖掘新范式

在数字化浪潮下&#xff0c;安全漏洞问题日益严峻&#xff0c;成为各行业发展的重大挑战。近日&#xff0c;“AISecurity” 系列第 4 期线下活动于北京成功举办&#xff0c;聚焦 “洞” 见未来&#xff1a;AI 驱动的漏洞挖掘新范式&#xff0c;汇聚了安全领域的众多专家。 本次…

LeetCode 热题 100_LRU 缓存(35_146_中等_C++)(哈希表 + 双向链表)(构造函数声明+初始化列表=进行变量初始化和赋值)

LeetCode 热题 100_LRU 缓存&#xff08;35_146&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;代码实现&#xff08;思路一&#xff08;哈希表 双向链表&#xff09;&#xff09;&#xff1a;部分代码解读 题目描述&#xf…

攻防世界 PHP2

开启场景 访问 /index.php&#xff0c;页面无变化 访问 /index.phps index.php 和 index.phps 文件之间的主要区别在于它们的文件扩展名。 index.php&#xff1a;这是一个标准的 PHP 文件&#xff0c;通常用于编写 PHP 代码。当用户访问 index.php 文件时&#xff0c;Web 服务器…

AI应用-本地模型实现AI生成PPT(简易版)

文章目录 前言技术栈效果展示 一、实现思路二、实现步骤1.本地安装marp-cli2.后端实现3.前端实现 三、代码地址及说明 前言 在许多项目中&#xff0c;生成 PPT 是常见的需求&#xff0c;尤其在教育和报告展示中。传统的生成 PPT 的方法需要手动创建&#xff0c;而使用生成模型…

项目2路由交换

背景 某学校为满足日常教学生活需求&#xff0c;推动数字校园的建设&#xff0c;学校有办公楼和学生宿舍楼和服务器集群三块区域&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通现要求外网能通过公网地址访问服务器集群&#xff0c;学生和老师能正常…

快速掌握Haproxy原理架构

文章目录 一、原理架构二、无负载均衡三、四层负载均衡的工作流程四、七层负载均衡工作流程五、基础属性mode 属性retries 属性maxconn 属性clitimeout 属性servtimeout 属性states uri 属性 一、原理架构 四层tcp代理&#xff1a;Haproxy仅在客户端和服务器之间双向转发流量&…

02、并发编程的三大特性

并发编程有三大特性分别是&#xff0c;原子性&#xff0c;可见性&#xff0c;有序性。会产生这些特性的根本原因是现在的服务器都是多CPU多核心数的&#xff0c;每个CPU都有自己单独的一套缓存和pc系统&#xff0c;而且程序在运行时按照JMM的规范&#xff0c;它们是需要先把数据…

企业数字化转型和人工智能(AI)之间的关系

企业数字化转型和人工智能&#xff08;AI&#xff09;之间的关系可以被理解为 “驱动与支撑” 的关系&#xff1a;AI 是数字化转型的重要技术驱动力&#xff0c;而数字化转型为 AI 的应用提供了场景和数据支持。两者相辅相成&#xff0c;共同推动企业向智能化发展。 数字化转型…

STM32和精准的型号STM32F03C8T6 ——ADC通道数目区别

注意表达方式的区别 5&#xff0e;STM32芯片内部集成的&#xff08;12&#xff09;位ADC是一种逐次逼近型模拟数字转换器&#xff0c;具 有&#xff08;18&#xff09;个通道&#xff0c;可测量&#xff08;16&#xff09;个外部和(2)个内部信号源。 书上原话&#xff1a;STM32…

【项目构建】Gradle入门

本文适用&#xff1a; 不知道什么是项目构建&#xff0c;可以了解下Ant&#xff0c;Maven&#xff0c;Gradle的区别。知道什么是项目构建&#xff0c;了解Ant&#xff0c;Maven&#xff0c;可以看到Gradle是怎么做的。知道什么是项目构建&#xff0c;了解Ant&#xff0c;Maven&…

java栈--数据结构

前言 java实现数据结构栈&#xff1a;用顺序表存储的栈和数组存储的栈。 本文源代码网址&#xff1a;https://gitee.com/zfranklin/java/tree/master/dataStructure/src/com/njupt/stack https://gitee.com/zfranklin/java/tree/master/dataStructure/src/com/njupt/stack 栈…

2.5.2 文件结构、目录及存取

文章目录 文件结构文件目录存取 文件结构 文件结构是文件的组织形式。从用户角度观察到的结构是逻辑结构&#xff0c;从机器实现存储的角度观察&#xff0c;看到的是物理结构。 逻辑结构 有结构的记录式文件&#xff1a;文件中记录的长度都相同&#xff0c;称为定长记录。文件…

Highcharts 饼图:数据可视化利器

Highcharts 饼图&#xff1a;数据可视化利器 引言 在数据可视化的领域中&#xff0c;饼图作为一种经典且直观的图表类型&#xff0c;被广泛应用于各种行业和场景中。Highcharts&#xff0c;作为一个功能强大且易于使用的JavaScript图表库&#xff0c;为我们提供了创建交互式和…

关于科研中使用linux服务器的集锦

文章目录 常用的linux命令下载COCO2017数据集 常用的linux命令 一个文件移动到另一个目录下的命令是&#xff1a;mv -v ./old_name ./new_name 如果目标文件夹中已经有同名文件或文件夹&#xff0c;mv 会覆盖它们&#xff08;除非使用了 -i 选项来提示确认&#xff09;。 使用…

<项目代码>YOLO Visdrone航拍目标识别<目标检测>

项目代码下载链接 &#xff1c;项目代码&#xff1e;YOLO Visdrone航拍目标识别&#xff1c;目标检测&#xff1e;https://download.csdn.net/download/qq_53332949/90163918YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一…