本篇文章将利用DrissionPage完成淘宝商品数据爬取
DrissionPage官网:https://drissionpage.cn/

首先需要下载DrissionPage

1
pip install DrissionPage

下载好之后首先要做的就是设置运行的浏览器

1
2
3
4
5
from DrissionPage import ChromiumOptions  
#这是我自己的谷歌浏览器的地址
path = r"C:\Program Files\Google\Chrome\Application\chrome.exe"

ChromiumOptions().set_browser_path(path).save()

这个代码运行成功后,之后都不用运行了

1. 登录页面

像淘宝,京东等较为大型的电商服务平台,进入网站后还需要登录之后才能进行搜索,所以我们需要现在登录页面进行操作
网址:https://login.taobao.com/havanaone/login/login.htm
image.png
复制账号输入框css格式的定位,以此类推,密码输入框和登录按钮的定位也如此获得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from DrissionPage import ChromiumPage  
from cookie import name,password
import time
#模拟浏览器
dp = ChromiumPage()
#进入页面
url = 'https://login.taobao.com/havanaone/login/login.htm'
dp.get(url)

#定位账号输入端,并输入账号
dp.ele('css:#fm-login-id').input(name)
#定位密码输入端,并输入密码
dp.ele('css:#fm-login-password').input(password)
time.sleep(2)
#定位登录按钮并点击
dp.ele('css:#login-form > div.fm-btn > button').click()

在代码中,你会发现这个账号密码的获取方式可能不清楚,实际上是通过自己重新建一个py文件
image.png
新建完后再里面输入

1
2
name = 'xxx'  #xxx换成你自己的账号密码
password = 'xxx'

然后根据自己建立的py文件的名称,导入到主文件中即可

1
from 你的文件名.py import name, password

2.爬取页面

登录页面的代码在运行后也可除dp赋值外其他均可注释,因为运行过后,会在一定时间内无需登录。

在爬取页面中就要获得对应的数据。
但按照b站的上的视频走,在这一步会有些问题,因为我发现在淘宝首页进行搜索,在以前可能是页面刷新,而现在是重新打开一页,这会导致dp仍然定位在首页,所以无法得到搜索后新开的页面的数据。所以我就尝试修改,直接跳转到搜索后的新页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from DrissionPage import ChromiumPage  
from cookie import name,password
import time
import re
import json
from DataRecorder import Recorder

key_word = '手机'
#定位淘宝首页搜索框并输入

dp.get('https://s.taobao.com/search?page=1&q='+ key_word + '&tab=all')
time.sleep(2)

#监听
dp.listen.start('h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0')
response = dp.listen.wait().response
print(response.body)
mtopjsonp = response.body
#用正则将需要的数据提取出来
mtopjson = re.findall('mtopjsonp\d+\((.*)\)', mtopjsonp)[0]
print(mtopjson)

上述代码中的监听功能,即跳转到该页面时对后面这地址(也就是我们所需要的数据)进行获取。那么这个数据应该怎么找呢?很简单,你随便复制一个商品的标题,部分即可,进入开发者模式,全局搜索就能找到对应的url,不需要全部复制,与我这种类似即可。
image.png
通过上述代码得到的结果
image.png
与开发者工具中preview上的一致

3.数据解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#反序列化
mtop_data = json.loads(mtopjson)
itemarray = mtop_data.get('data').get('itemsArray')

data_array = []
#遍历获取数据
for item in itemarray:
title = item.get('title')
price = item.get('price')
realSales = item.get('realSales')
procity =item.get('procity')
nick = item.get('nick')#店铺
auctionURL = item.get('auctionURL')
pic_path = item.get('pic_path')
print(title,price,realSales,procity,nick,auctionURL,pic_path)
data_array.append([title,price,realSales,procity,nick,auctionURL,pic_path])

4.数据存储

通过DataRecorder进行存储

1
2
3
4
5
from DataRecorder import Recorder

r = Recorder('手机.xlsx')
r.add_data(data_array)
r.record()

5.整体代码(含批量存储)

批量存储通过for循环,同样通过定位到“下一页”的按钮进行翻页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from DrissionPage import ChromiumPage  
from cookie import name,password
import time
import re
import json
from DataRecorder import Recorder

r = Recorder('手机.xlsx')
data_array = []
header = ['title', 'price', 'realSales', 'procity', 'nick', 'auctionURL', 'pic_path']
data_array.append(header)

#模拟浏览器
dp = ChromiumPage()
# #进入页面
# url = 'https://login.taobao.com/havanaone/login/login.htm'
# dp.get(url)

# #定位账号输入端,并输入账号
# dp.ele('css:#fm-login-id').input(name)
# #定位密码输入端,并输入密码
# dp.ele('css:#fm-login-password').input(password)
# time.sleep(2)
# #定位登录按钮并点击
# dp.ele('css:#login-form > div.fm-btn > button').click()
key_word = '手机'
#定位淘宝首页搜索框并输入
# dp.get('https://s.taobao.com/search?page=1&q=%E6%B8%B8%E6%88%8F%E7%94%B5%E7%AB%9E%E6%89%8B%E6%9C%BA&tab=all')
dp.get('https://s.taobao.com/search?page=1&q='+ key_word + '&tab=all')

time.sleep(2)

#监听
dp.listen.start('h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0')

dp.refresh()
for p in range(1,3):

#下滑页面
dp.scroll.to_bottom()

try:
#等待加载获取响应体数据
response = dp.listen.wait().response
mtopjsonp = response.body
#用正则将需要的数据提取出来
mtopjson = re.findall('mtopjsonp\d+\((.*)\)', mtopjsonp)[0]
print(mtopjson)
#反序列化
mtop_data = json.loads(mtopjson)
itemarray = mtop_data.get('data').get('itemsArray')

#遍历获取数据
for item in itemarray:
title = item.get('title')
price = item.get('price')
realSales = item.get('realSales')
procity =item.get('procity')
nick = item.get('nick')#店铺
auctionURL = item.get('auctionURL')
pic_path = item.get('pic_path')
# print(title,price,realSales,procity,nick,auctionURL,pic_path)
#保存运行
data_array.append([title,price,realSales,procity,nick,auctionURL,pic_path])
r.add_data(data_array)
r.record()
time.sleep(3)
dp.ele('css:#search-content-leftWrap > div.leftContent--BdYLMbH8 > div.pgWrap--RTFKoWa6 > div > div > button.next-btn.next-medium.next-btn-normal.next-pagination-item.next-next').click()
except (AttributeError, ValueError, TypeError, IndexError) as e:
print(f"错误:{e}")
continue

文件输出如下图
image.png