找回密码
 会员注册
查看: 26|回复: 0

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

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-9-11 12:20:39 | 显示全部楼层 |阅读模式
摘要本文章主要讲解如何利用DrissionPage来避开淘宝的反爬机制,批量获取商品信息并保存到xlsx表格文件中,用于数据分析或深度学习模型的训练。(注:本文代码为一步一步调试出来的测试版,只是提供调试思路以及初步实现,并不能作为高效的成品程序,如有需要还请各位自行编写喵)1.淘宝强大的反爬机制(了解即可,可跳过):相信很多小伙伴们在学习网络爬虫之后会到处寻找网站练手,而淘宝网作为国内最大的电商平台之一,拥有海量的商品信息以及交易信息,自然会是很多人选择下手的目标。然而,你很快就碰壁了。首先,你先是尝试利用requests,接受到的响应是来自淘宝的嘲讽“哎呦出错了”。接着,你开始尝试改用selenium,结果却是一直触发滑块验证,而在编写程序模拟人拖动滑块之后,网页却出了问题,不管你是手动还是自动登录一律都是在滑块验证码时不通过,最后只能无功而返。关于淘宝反爬机制的具体解析,网络上已有博主作出分析,这里不再赘述,感兴趣的友友们可以参考这篇文章:https://www.cnblogs.com/zycorn/p/14609974.html2.简单介绍DrissionPage工具DrissionPage是一个基于Python的网页自动化工具,由国内大佬开发。它既能控制浏览器,也能收发数据包,还能把两者合而为一。可兼顾浏览器自动化的便利性和requests的高效率。它功能非常强大,内置很多人性化设计和便捷功能,且内部注释均为中文。它的语法简洁而优雅,代码量少,对新手非常友好。官方文档:DrissionPage官网(注:在使用DrissionPage的过程中遇到的常见问题都可以在官方文档上找到解答)3.开始实现3.1导入库本程序使用到的库包括time、DrissionPage、openpyxl(用于保存为xlsx表格文件)DrissionPage安装代码如下:pipinstallDrissionPage openpyxl安装代码如下:pipinstallopenpyxl 开始导入相关库文件:fromDrissionPageimportChromiumPageimporttimeimportopenpyxl3.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-buttonfm-submitpassword-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')#将商品基本信息和链接打印出来forproductinproducts:print(product.text,product.link)输出如下:3.6分析商品信息,进行数据清洗上面我们已经获取到这一页中所有商品的基本信息了,大致浏览一下我们发现:获取到的信息比较杂,并且顺序也很乱接下来我们要对获取到的数据进行清洗、分类,操作如下:title=['商品名','书名','出版社','价格','销量','发货省份','是否包邮','店铺名称','商品链接']forproductinproducts:lis=['无','无','无','无','无','无','否','无','无']pre_lis=product.text.split('\n')lis[0]=pre_lis[0]if'书名'inpre_lis:lis[1]=pre_lis[pre_lis.index('书名')-1]if'出版社名称'inpre_lis:lis[2]=pre_lis[pre_lis.index('出版社名称')-1]if'¥'inpre_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'包邮'inpre_lis:lis[6]='是'lis[7]=pre_lis[-2]lis[8]=product.link3.7将数据存入xlsx文件这里我们需要用到openpyxl来对清洗后的数据进行存储。上面一步中,我们循环遍历整个products,每次循环都会清洗一个数据,因此,我们可以在每一个数据清洗出来之后直接存入xlsx中。具体操作如下:wb=openpyxl.Workbook()ws=wb.activetitle=['商品名','书名','出版社','价格','销量','发货省份','是否包邮','店铺名称','商品链接']ws.append(title)forproductinproducts:lis=['无','无','无','无','无','无','否','无','无']pre_lis=product.text.split('\n')lis[0]=pre_lis[0]if'书名'inpre_lis:lis[1]=pre_lis[pre_lis.index('书名')-1]if'出版社名称'inpre_lis:lis[2]=pre_lis[pre_lis.index('出版社名称')-1]if'¥'inpre_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'包邮'inpre_lis:lis[6]='是'lis[7]=pre_lis[-2]lis[8]=product.linkws.append(lis)wb.save('小题狂做淘宝数据.xlsx')3.8多页数据批量获取具体思路很简单,就是在获取完每一页的商品信息之后,我们定位翻页按钮的元素,操纵翻页按钮进入下一页,再获取下一页的内容。该思路可以用一个for循环实现,这里不做过多解释。具体操作代码如下:wb=openpyxl.Workbook()ws=wb.activetitle=['商品名','书名','出版社','价格','销量','发货省份','是否包邮','店铺名称','商品链接']ws.append(title)foriinrange(99):time.sleep(1)time.sleep(2)products=page.eles('@class=Card--doubleCardWrapper--L2XFE73')forproductinproducts:lis=['无','无','无','无','无','无','否','无','无']pre_lis=product.text.split('\n')lis[0]=pre_lis[0]if'书名'inpre_lis:lis[1]=pre_lis[pre_lis.index('书名')-1]if'出版社名称'inpre_lis:lis[2]=pre_lis[pre_lis.index('出版社名称')-1]if'¥'inpre_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'包邮'inpre_lis:lis[6]='是'lis[7]=pre_lis[-2]lis[8]=product.linkws.append(lis)print(f'第{i+1}页已完成')time.sleep(1)page.ele('@class=next-btnnext-smallnext-btn-normalnext-pagination-itemnext-next').click()wb.save("小题狂做淘宝数据.xlsx")4.完整代码由于这是小生辛辛苦苦调试后编写出来的代码,所以这里完整代码就先不贴出来了喵,感兴趣的友友们可以自己尝试着实现看看,有问题欢迎私信我喵~我是若琼,一名来自南京邮电大学,爱好编程的大学生,欢迎各位感兴趣的友友们与作者私信交流,也希望各位业内大佬能够多多批评指正喵。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 08:17 , Processed in 0.791577 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表