首页 > 其他分享 >基于DrissionPage实现淘宝商品信息的批量获取

基于DrissionPage实现淘宝商品信息的批量获取

时间:2024-07-18 13:26:03浏览次数:19  
标签:pre index product 商品信息 DrissionPage 批量 元素 ele lis

摘要

本文章主要讲解如何利用DrissionPage来避开淘宝的反爬机制,批量获取商品信息并保存到xlsx表格文件中,用于数据分析或深度学习模型的训练。

(注:本文代码为一步一步调试出来的测试版,只是提供调试思路以及初步实现,并不能作为高效的成品程序,如有需要还请各位自行编写喵)


1. 淘宝强大的反爬机制(了解即可,可跳过):

相信很多小伙伴们在学习网络爬虫之后会到处寻找网站练手,而淘宝网作为国内最大的电商平台之一,拥有海量的商品信息以及交易信息,自然会是很多人选择下手的目标。

然而,你很快就碰壁了。

首先,你先是尝试利用requests,接受到的响应是来自淘宝的嘲讽“哎呦出错了”。

接着,你开始尝试改用selenium,结果却是一直触发滑块验证,而在编写程序模拟人拖动滑块之后,网页却出了问题,不管你是手动还是自动登录一律都是在滑块验证码时不通过,最后只能无功而返。

关于淘宝反爬机制的具体解析,网络上已有博主作出分析,这里不再赘述,感兴趣的友友们可以参考这篇文章:https://www.cnblogs.com/zycorn/p/14609974.html


2. 简单介绍DrissionPage工具

DrissionPage 是一个基于 Python 的网页自动化工具,由国内大佬开发。

它既能控制浏览器,也能收发数据包,还能把两者合而为一。

可兼顾浏览器自动化的便利性和 requests 的高效率。

它功能非常强大,内置很多人性化设计和便捷功能,且内部注释均为中文。

它的语法简洁而优雅,代码量少,对新手非常友好。

官方文档:DrissionPage官网

(注:在使用DrissionPage的过程中遇到的常见问题都可以在官方文档上找到解答)


3. 开始实现

3.1 导入库

本程序使用到的库包括time、DrissionPage、openpyxl(用于保存为xlsx表格文件)

DrissionPage安装代码如下:

pip install DrissionPage

 openpyxl安装代码如下:

pip install openpyxl

 开始导入相关库文件:

from DrissionPage import ChromiumPage
import time
import openpyxl

3.2 初始化

在开始调试之前,我们首先创建一个ChromiumPage对象,然后向淘宝的登录界面发送请求,进入淘宝的登录界面:

# 尝试启动浏览器
page = ChromiumPage()    #创建一个ChromiumPage对象
page.get('https://login.taobao.com')

3.3 定位元素,登录进入首页

登录界面

进入到登录界面之后,我们需要定位以下三个元素:账号输入框登录密码以及登录按钮。

定位元素的思路与具体步骤:按F12进入开发者模式后,点击"Elements"(“元素”),在其中找到上述三个元素的JavaScript代码,相关操作如下图所示:

定位元素

找到相应元素之后,基于其中的class属性,我们就可以在代码中实现定位并模拟操作相关元素了。

(这里小生已经帮大家找好了,不确定淘宝后续是否会修改,建议大家先自行操作一遍

定位元素首先需要我们创建一个 ele 对象,利用 page.ele() ,括号中输入的是定位元素的方式。其中 “#” 代表的是按 id 定位元素;“@” 代表的是按任意属性查找元素。

文本框元素可以使用 ele.input() 输入你想要输入的内容(比如账号和密码);

按钮元素可以使用ele.click()来实现按钮的点击。

具体代码如下:

# 定位到账号文本框,获取文本框元素
ele = page.ele('#fm-login-id')
# 输入对文本框输入账号
ele.input('你的账号')
time.sleep(2)
# 定位到密码文本框并输入密码
page.ele('#fm-login-password').input('你的密码')
time.sleep(2)
# 点击登录按钮
page.ele('@class=fm-button fm-submit password-login').click()
time.sleep(5)

这里小生用到了time.sleep(),其实是为了方便调试代码喵。

点击登录按钮后,由于可能会出现滑块识别或是弹窗提示等事件,所以这里预留了5秒的时间,以便调试的时候手动操作,应对突发事件。

之后就顺利进入到淘宝的首页了。

3.4 定位元素,进入商品列表

正常情况下我们想要获取到大量的商品信息,首先需要进入到商品列表界面,比如这里搜索“小题狂做”之后进入到的商品列表界面。

具体思路:

(1)和步骤3.3方法一样,首先利用开发者界面在“Elements”栏中找到相关JavaScript代码

(2)根据属性,在调试代码中定位搜索框元素和“搜索”按钮元素

(3)操纵元素,在搜索框中输入想要查找的商品(比如这里的“小题狂做”),接着点击“搜索”按钮

代码实现:

page.ele('@aria-label=请输入搜索文字').input('小题狂做')
time.sleep(2)
page.ele('@class=btn-search').click()

3.5 在商品列表定位商品信息

进入商品列表后,我们接着要做的是想办法获取各个商品的详细信息。

还是老方法,这里我们进入开发者界面,在 Elements 中查找商品信息相关的内容后定位获取信息。

这里找寻商品相关信息

经过小生分析发现,所有商品的class属性值均为同一串字符:Card--doubleCardWrapper--L2XFE73(这里还是建议各位先自行尝试查找,防止后续属性值发生改变喵)

根据这一发现,我们就可以通过属性值获取这一页中所有商品的基本信息

具体实现代码如下:

# 获取所有商品信息
products = page.eles('@class=Card--doubleCardWrapper--L2XFE73')

# 将商品基本信息和链接打印出来
for product in products:
    print(product.text, product.link)

输出如下:

3.6 分析商品信息,进行数据清洗

上面我们已经获取到这一页中所有商品的基本信息了,大致浏览一下我们发现:获取到的信息比较杂,并且顺序也很乱

接下来我们要对获取到的数据进行清洗、分类,操作如下:

title = ['商品名', '书名', '出版社', '价格', '销量', '发货省份', '是否包邮', '店铺名称', '商品链接']

for product in products:
    lis = ['无', '无', '无', '无', '无', '无', '否', '无', '无']
    pre_lis = product.text.split('\n')

    lis[0] = pre_lis[0]
    if '书名' in pre_lis:
        lis[1] = pre_lis[pre_lis.index('书名') - 1]
    if '出版社名称' in pre_lis:
        lis[2] = pre_lis[pre_lis.index('出版社名称') - 1]
    if '¥' in pre_lis:
        lis[3] = pre_lis[pre_lis.index('¥') + 1]
        lis[4] = pre_lis[pre_lis.index('¥') + 2]
        lis[5] = pre_lis[pre_lis.index('¥') + 3]
    if '包邮' in pre_lis:
        lis[6] = '是'
    lis[7] = pre_lis[-2]
    lis[8] = product.link

3.7 将数据存入xlsx文件

这里我们需要用到openpyxl来对清洗后的数据进行存储。

上面一步中,我们循环遍历整个products,每次循环都会清洗一个数据,因此,我们可以在每一个数据清洗出来之后直接存入xlsx中。

具体操作如下:

wb = openpyxl.Workbook()
ws = wb.active
title = ['商品名', '书名', '出版社', '价格', '销量', '发货省份', '是否包邮', '店铺名称', '商品链接']
ws.append(title)

for product in products:
    lis = ['无', '无', '无', '无', '无', '无', '否', '无', '无']
    pre_lis = product.text.split('\n')

    lis[0] = pre_lis[0]
    if '书名' in pre_lis:
        lis[1] = pre_lis[pre_lis.index('书名') - 1]
    if '出版社名称' in pre_lis:
        lis[2] = pre_lis[pre_lis.index('出版社名称') - 1]
    if '¥' in pre_lis:
        lis[3] = pre_lis[pre_lis.index('¥') + 1]
        lis[4] = pre_lis[pre_lis.index('¥') + 2]
        lis[5] = pre_lis[pre_lis.index('¥') + 3]
    if '包邮' in pre_lis:
        lis[6] = '是'
    lis[7] = pre_lis[-2]
    lis[8] = product.link
    ws.append(lis)

wb.save('小题狂做淘宝数据.xlsx')

3.8 多页数据批量获取

具体思路很简单,就是在获取完每一页的商品信息之后,我们定位翻页按钮的元素,操纵翻页按钮进入下一页,再获取下一页的内容。该思路可以用一个 for 循环实现,这里不做过多解释。

具体操作代码如下:

wb = openpyxl.Workbook()
ws = wb.active
title = ['商品名', '书名', '出版社', '价格', '销量', '发货省份', '是否包邮', '店铺名称', '商品链接']
ws.append(title)

for i in range(99):

    time.sleep(1)

    time.sleep(2)
    products = page.eles('@class=Card--doubleCardWrapper--L2XFE73')
    for product in products:
        lis = ['无', '无', '无', '无', '无', '无', '否', '无', '无']
        pre_lis = product.text.split('\n')

        lis[0] = pre_lis[0]
        if '书名' in pre_lis:
            lis[1] = pre_lis[pre_lis.index('书名') - 1]
        if '出版社名称' in pre_lis:
            lis[2] = pre_lis[pre_lis.index('出版社名称') - 1]
        if '¥' in pre_lis:
            lis[3] = pre_lis[pre_lis.index('¥') + 1]
            lis[4] = pre_lis[pre_lis.index('¥') + 2]
            lis[5] = pre_lis[pre_lis.index('¥') + 3]
        if '包邮' in pre_lis:
            lis[6] = '是'
        lis[7] = pre_lis[-2]
        lis[8] = product.link
        ws.append(lis)

    print(f'第{i+1}页已完成')

    time.sleep(1)
    page.ele('@class=next-btn next-small next-btn-normal next-pagination-item next-next').click()

wb.save("小题狂做淘宝数据.xlsx")

4. 完整代码

由于这是小生辛辛苦苦调试后编写出来的代码,所以这里完整代码就先不贴出来了喵,感兴趣的友友们可以自己尝试着实现看看,有问题欢迎私信我喵~


我是若琼,一名来自南京邮电大学,爱好编程的大学生,欢迎各位感兴趣的友友们与作者私信交流,也希望各位业内大佬能够多多批评指正喵。

标签:pre,index,product,商品信息,DrissionPage,批量,元素,ele,lis
From: https://blog.csdn.net/2301_79886169/article/details/140515871

相关文章

  • Python与OpenCV的魔法:批量将照片变身为精美素描图
    1.前言在数字图像处理领域,图像转换和滤波是非常常见的操作。特别是将彩色照片转换为素描图,这种技术可以用于艺术创作、图像分析以及一些特殊的图像处理需求。本文将详细介绍如何使用Python和OpenCV库批量将任意图片转换为素描图。2.简介OpenCV(OpenSourceComputerVisionL......
  • AI办公自动化007:用kimi批量加密PDF文件
    文章目录一、介绍二、输入内容三、输出内容一、介绍使用kimichat实现对PDF文件进行加密二、输入内容在kimichat中输入提示词:你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下:联网检索PyPDF2库的最新使用方法;打开文件夹:D:\2024-05读......
  • 批量修改CS02 BOM状态
    DATA:lt_bomTYPETABLEOFtyp_out.DATA:lv_datumTYPEsy-datum,lv_messageTYPEchar128,lv_dateTYPEcsap_mbom-datuv.DATA:ls_stkoTYPEstko_api01,ls_warningTYPEcapiflag-flwarning,ls_stko2TYPEstk......
  • 2024年最新版微信小程序批量检测封禁接口实现代码分享
    ​       ​      <?php//要检测的appid列表$appids=array('appid1','appid2','appid3');//使用实际的appid//循环调用接口检测小程序状态foreach($appidsas$appid){    $url='https://down.ychengsnsm.com/xcx/checkxcx.php?appid='......
  • Python办公自动化:效率飞跃,自动化批量汇总Excel到Word
    Python办公自动化:效率飞跃,自动化批量汇总Excel到Word原创 丹心向阳 数海丹心 2024年06月23日07:30 山东摘要:每个月底,是许多数据分析师的梦魇,尤其是当他们需要从成百上千的Excel报表中汇总数据到Word时。本文将讲述小李如何使用Python自动化技术,几秒钟完成原本需要通宵达旦......
  • WPS批量将图片嵌入单元格
    选中单张图片Ctrl+A全选右键选择图片嵌入单元格注意:它是将图片嵌入在图片左上角所在的单元格内,需要确保每个被嵌入的单元格只有一个图片的左上角在其内部,否则会出现“一个单元格内不能插入多个图片的”的报错......
  • 怎么批量删除文件名里的括号?大家都在找的7个方法在这里
    在某些情况下,如果文件名中包含括号,可能会导致在网络传输过程中出现问题,因为一些网络协议或服务可能不支持特殊字符的传输。可读性问题: 如果文件名中包含括号,可能会降低文件名的可读性,特别是对于人类用户来说。所以今天小编将通过这篇文章为大家介绍结果批量删除文件名里括号......
  • 帝国CMS网站后台对已增加的信息进行批量删除
    (一)、登录后台,单击“栏目”菜单,选择“批量删除信息”子菜单,进入批量删除信息界面: (二)、进入批量删除信息界面:选择数据表选择要删除信息的表。选择栏目选择要删除信息的栏目。按时间删除设置删除某一时间段的信息。按ID删除设置删除某一ID......
  • 帝国CMS网站对前台会员的帐号进行批量删除
    一、登录后台,单击“用户”菜单,选择“批量清理会员”子菜单,进入批量清理会员界面: 二、进入批量清理会员界面:用户名包含字符删除用户名包含此字符的会员,空为不限。邮箱地址包含字符删除邮箱地址包含此字符的会员,空为不限。用户ID介于删除用户ID......
  • Python小工具—批量移除照片背景
    先上代码。fromrembgimportremoveimportcv2importosdeflist_image_files(directory):#支持的图片文件扩展名列表image_extensions=['.jpg','.jpeg','.png','.gif','.bmp','.tiff']#存储找到的图片文件......