DrissionPage终极神器
这三个软件都是用python代码打开浏览器去执行操作。Selenium:不支持异步操作,打开网站后变量可能和人操作时不一样,不防检测,易被封。Pyppepteer:绕过接口加密,直接访问获取网站信息,支持异步,有js脚本可以修改可能被检测的变量。DrissionPage:比Pyppepteer多功能,很多大网站Pyppepteer已经不行了。
·
本文为学习笔记,部分内容为老师所写,非纯原创
目录
浏览器操作软件介绍
这三个软件都是用python代码打开浏览器去执行操作。开发者工具能看见的数据是经过js处理过的,实际代码里可能接口加密了,因此普通爬取数据爬不到,这时候就可以用以下三种软件绕过接口加密:
- Selenium:不支持异步操作,打开网站后变量可能和人操作时不一样,不防检测,易被封。
- Pyppepteer:绕过接口加密,直接访问获取网站信息,支持异步,有js脚本可以修改可能被检测的变量。
- DrissionPage:比Pyppepteer多功能,很多大网站Pyppepteer已经不行了。
DrissionPage安装
网站:http://drissionpage.cn/
#安装
pip install DrissionPage
#升级
pip install DrissionPage -- upgrade
DrissionPage演示
抓取震坤行商品
from DrissionPage import ChromiumPage
import time
page = ChromiumPage()
# page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的
# 跳转到震坤行页面
page.get('https://www.zkh.com/?utm_source=baidu&utm_medium=CPT')
# page.ele('#key').input('大地瓜'),input是DrissionPage的语法,意思是往这个文本框里填大地瓜三个字
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/div[1]/input').input('口罩')
# 定位到点击,点击搜索按钮
page.ele('xpath://*[@id="app"]/div/div/div[3]/div/div[1]/button/span').click()
# 切换到最新打开的标签页,因为搜索之后会跳转到新窗口,在原窗口什么都获取不到
page.to_tab(page.latest_tab)
# 也可以用page.to_tab(page.tabs[0])切换到其他窗口,0就是第一个窗口,以此类推
while True:
page.wait.load_start()
# 等待网页加载
# 让滚动条往下拖,由于该网站最少拖两次才能加载完全,这里拖三次以防万一
# 如果还是没加载完全,可以多加几个,或者等待时间长点
page.scroll.to_location(0,10000)
time.sleep(0.5)
page.scroll.to_location(0,10000)
time.sleep(0.5)
page.scroll.to_location(0,10000)
time.sleep(0.5)
divs = page.eles('xpath://div[@class="goods-name clamp2"]')
# 获取商品对象,因为是多个,所以加了s,page.eles
# 获取的是对象列表,需要进行遍历,i就是div对象
for i in divs:
title = i.attr('title')
# 获取div对象里的title属性
print(title)
# 获取下一页按钮,有就点击
print(len(divs))
# 找超链接或者按钮中间元素有没有下一页三个字,找不到两秒报错
btn = page('下一页', timeout=2)
if btn:
btn.click()
page.wait.load_start()
# 没有则退出程序
else:
break
# page.scroll.to_bottom()
# # 滚动到指定位置
# page.run_js('window.scrollBy(0, document.body.scrollHeight)')
# # 滚动页面使自己可见
# page.scroll.down(4000)
# page.run_js(' return document.body.scrollHeight')
实现异步请求的方案
运行后可以看见同时打开了两个网站抓取数据
from threading import Thread
from DrissionPage import ChromiumPage
from DataRecorder import Recorder
def collect(tab, recorder, title):
"""用于采集的方法
:param tab: ChromiumTab 对象
:param recorder: Recorder 记录器对象
:param title: 类别标题
:return: None
"""
num = 1 # 当前采集页数
while True:
# 遍历所有标题元素
for i in tab.eles('.title project-namespace-path'):
# 获取某页所有库名称,记录到记录器
recorder.add_data((title, i.text, num))
# 如果有下一页,点击翻页
btn = tab('@rel=next', timeout=2)
if btn:
btn.click(by_js=True)
tab.wait.load_start()
num += 1
# 否则,采集完毕
else:
break
def main():
# 新建页面对象
page = ChromiumPage()
# 第一个标签页访问网址
page.get('https://gitee.com/explore/ai')
# tab = page.get_tab(1) # 获取列表中第二个标签页的对象
# 获取第一个标签页对象,这个东西我认为等于一个page,一个窗口的句柄
tab1 = page.get_tab()
print(tab1)
# 新建一个标签页并访问另一个网址
tab2 = page.new_tab('https://gitee.com/explore/machine-learning')
# 获取第二个标签页对象
tab2 = page.get_tab(tab2)
# 新建记录器对象
recorder = Recorder('data.csv')
# 多线程同时处理多个页面
Thread(target=collect, args=(tab1, recorder, 'ai')).start()
Thread(target=collect, args=(tab2, recorder, '机器学习')).start()
if __name__ == '__main__':
main()
抓取刺猬猫某本小说三章数据
# encoding:utf-8
#不知道为啥不加上边encoding就不能执行
from DrissionPage import ChromiumPage
count = 1
page = ChromiumPage()
# page = ChromiumPage()这句意思是打开一个浏览器,这个浏览器是安装DrissionPage时自动安装的
page.get('https://wap.ciweimao.com/chapter/108689198')
while True:
chapter=page.ele('.read-hd')
print(chapter.text)
contents = page.eles('.chapter')
for i in contents:
print(i.text)
# 获取商品对象,因为是多个,所以加了s,page.eles
# 获取的是对象列表,需要进行遍历,i就是div对象
# 找超链接或者按钮中间元素有没有下一页三个字,找不到两秒报错
btn = page('下一章', timeout=2)
if btn:
if count<3:
btn.click()
page.wait.load_start()
count += 1
else:
break
# 没有则退出程序
else:
break
# page.scroll.to_bottom()
# # 滚动到指定位置
# page.run_js('window.scrollBy(0, document.body.scrollHeight)')
# # 滚动页面使自己可见
# page.scroll.down(4000)
# page.run_js(' return document.body.scrollHeight')
监听美团接口的代码
这部分属于进阶功能,需要一个包 FlowViewer: Chrome 浏览器数据包检测器。 (gitee.com)
# from DrissionPage.tools import Listener
from FlowViewer import Listener
listener =Listener(9222) # 创建监听器,监听9222端口的浏览器
listener.set_targets('health/brand/operation/data/trade') # 设置需要监听的url
listener.listen(count=10) # 开始监听,接收到10条目标url的请求后停止
for i in listener.steps():
print(i.body) # 打印实时打印监听到的内容
listener.stop() #停止监听
更多推荐
所有评论(0)