本篇文章将利用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

复制账号输入框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文件

新建完后再里面输入
1 2
| name = '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,不需要全部复制,与我这种类似即可。

通过上述代码得到的结果

与开发者工具中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()
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') 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') 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
|
文件输出如下图
