摘要
本文章主要讲解如何利用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