拽神 DrissionPage 官方文档 DrissionPage官网
拽神 基本介绍
拽神是目前国内唯一开源基于浏览器CDP协议的 自动化工具。(以前也有类似工具,但是都是默默挣钱,没有开源的。)
DrissionPage 初始是基于 selenium 开发的,但随着新版的开发,基于WebDriver协议的设计逐渐被替换,改为基于浏览器CDP协议进行自动化浏览器操作。和Puppeteer和
Playwright 一样。
同样基于CDP协议的自动化工具Puppeteer和
Playwright ,他们分别是 Google 的 Chrome DevTools 团队开发和微软的开发团队开发的。而拽神的作者g1879相比,看起来只是个人开发者,就非常拽了。
适配
适配Windows、Linux 和 Mac,需要 python 版本:3.6 及以上
作为爬虫的优缺点
优点:开发效率高(逆向难度大的网站,开发效率高就相当于人工成本低。)
缺点:爬取效率低,代理费用高,机器成本高。(主要是爬取效率低)
一般在数据量较少(比如:十万数据),一次性任务、逆向难度大的時候考虑。
基本模式
有浏览器模式和页面对象模式。
页面对象模式比较特殊,是一个使用使用Session
(requests 库)对象的页面,效率比浏览器模式高很多。相比浏览器模式,缺点是直接无法获取ajax数据,因为无法直接进行浏览器交互。一般只能获取有url能直接访问的这种数据。相比requests库,可以跳过请求响应逆向阶段,直接获取页面结果。
功能介绍
支持挂代理、多线程、接管浏览器功能(比如先登录 后自动化接手)、传统元素交互、无头浏览器、监听网络包。详情可看官方文档。
监听网络包
这个功能是浏览器模式获取Ajax数据使用的。
如果使用浏览器自动化发起Ajax请求,可能存在数据不全、加载响应不及时、难以判断加载完成等问题。 而如果我们可以拿到浏览器收发的数据包,根据数据包状态判断下一步操作,甚至直接获取数据,岂不是爽爆了? DrissionPage 每个页面对象(包括 Tab 和 Frame 对象)内置了一个监听器,专门用于抓取浏览器数据包。 可以提供等待和捕获指定数据包,实时返回指定数据包功能。
注意:该功能确实很特别,但是即使监听到了请求包返回,也不能完美说明数据返回,比如翻页获取Ajax数据,监听到了数据返回,但是接口可能会返回空数据,或者请求频率太快等信息,造成数据丢失。 需要开发者自行处理异常捕获,比如说,Ajax数据异常,让他休息十五秒后翻页回到上一页,再重新向下一页翻页。 还有点击异常也需要开发者自行捕获,并进行重试。
更多的异常处理算是自动化爬取数据的小缺陷了,拽神也无法避免。
tab.listen.start('https://www.ajax/') # 开始监听,指定获取包含该文本的数据包
while True:
for _ in range(5):
try:
tab.ele('x://i[@class="el-icon-arrow-right pointer"]').click() # 点击下一页
res = tab.listen.wait(timeout=10, raise_err=True) # 等待并获取一个数据包
if '您的访问频率过快,请稍后再试' in tab.html:
logger.info('访问评率过快丢失数据,休息15秒后返回上一页。')
time.sleep(15)
tab.ele('x://i[@class="el-icon-arrow-left pointer"]').click()
time.sleep(5)
break # 如果执行成功,跳出循环,不再重试
except:
logger.info(f"翻页出现异常,正在进行第{_ + 1}次重试...")
else:
raise Exception('五次翻页失败')
拽神代理
只支持 120.42.248.178:16042 这种格式的普通短效、长效代理,传入这个参数即可挂http https。 不支持隧道代理。
浏览器模式挂代理
挂代理这部分稍微复杂一点,提供代码供参考,以下是挂代理多线程请求的代码示例。
# coding=utf-8
import vthread
from DrissionPage import ChromiumOptions
from DrissionPage import Chromium
def super_proxy(proxy_type="random"):
"""
"""
try:
return proxy
except Exception as err:
print(f'获取代理失败:{format_exc()}')
@vthread.pool(5)
def te(url):
page = get_proxy_page()
tab = page.new_tab()
tab.get(url) # 访问网
print(tab.html)
tab.close()
def get_proxy_page():
"""
获取代理页面(浏览器驱动方式)
后续需要 tab = page.new_tab() 等方式打开小页面
:return:
"""
co = ChromiumOptions()
x = super_proxy()
co.set_proxy(x)
page = Chromium(co)
return page
if __name__ == '__main__':
url2 = 'http://httpbin/ip'
for i in range(10000):
te(url2)
页面对象模式挂代理
挂代理这部分稍微复杂一点,提供代码供参考,以下是挂代理多线程请求的代码示例。
# coding=utf-8
import vthread
from DrissionPage import SessionPage
def parse_detail(url,html):
tree = etree.HTML(html)
def get_proxy_page():
"""
获取代理页面(页面访问模式)
:return:
"""
page = SessionPage()
d1 = super_proxy()
page.set.proxies(http=d1['http'], https=d1['https'])
return page
@vthread.pool(15)
def detail_crawl(url):
for i in range(6):
try:
page = get_proxy_page()
page.get(url)
parse_detail(url,page.html)
break
except Exception as e:
print('出错啦')
else:
pass
if __name__ == '__main__':
# a.crawl()
url_test = 'https://www.test/'
for i in range(40000):
detail_crawl(url_test)
发布者:admin,转转请注明出处:http://www.yc00.com/web/1741053799a4298421.html
评论列表(0条)