前言:
上次写了一个中国商标网的爬虫,最后呢,用了很笨的办法,跳过了一个反爬验证,总是有那么点感觉,这个博主好水啊,所以呢,这个问题必须得解决,至少在面上能看的过去。
废话少说,直接切入正题,没看过前文的同学,熟悉一下这个:通用性基本爬虫问题的解决思路
解决方案:
下面简单介绍一下新的框架:
Playwright
宣称是比 Puppeteer 更好用的浏览器自动化工具,Puppeteer 呢,是啥,其实我也没接触过,包括是Playwright也是刚刚接触的。
Playwright 是微软出品的浏览器自动化工具,代码质量应该是有足够保证的。而且它还官方支持同步版的 Python API,可以自动执行Chromium、Firefox、WebKit等主流浏览器自动化操作,并同时支持以无头模式。
Playwright提供的自动化技术是绿色的、功能强大、可靠且快速,支持Linux、Mac以及Windows操作系统。
与selenium不同的是,Playwright是依赖Node.js.
安装:
- 安装node.js 直接从官网下载,安装后需要重启,记得添加环境变量。
- 安装playwright的node相关包:npm i playwright
- 安装Python中的playwright包:pip install playwright
npm安装默认是国外的源,下载会比较慢,可以设置国内的,修改方法自行百度。
这里我的理解,Python版本的功能也是Node.js包装的,不然为啥还是依赖它的,这是前端开发接触多,这门语言我并不是很熟悉,不过并不影响后面的使用。
基本使用:
代码语言:javascript复制from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("http://www.baidu.com")
print(page.title())
browser.close()
示例引用于 playwright 的官网文档:
https://playwright.dev/python/docs/intro/
在官网上可以看到,playwright 支持4种语言,但是Python 还是依赖node.js。不知道其他的是否也是,应该是的,我没有验证(找资料或者亲测)
录制代码:
playwright 有一个功能,其实可以通过你的操作,录制出来对浏览器的操作,也就是说一定程度上你可以不用写一行代码就可以自动生成。
不过呢,这里我在第一次尝试的时候就失败了,因为录制代码启动命令,启动谷歌浏览器的时候就被拒绝了。
这里也不是本次内容重点,想了解的可以自行百度或者谷歌。
Playwright 版代码:
代码语言:javascript复制import time
from playwright.sync_api import sync_playwright
with sync_playwright() as playwright:
# 初始化一个浏览器,用火狐,谷歌打不开
browser = playwright.firefox.launch(headless=False)
# 打开新的tab页面
page = browser.new_page()
# 页面访问地址
page.goto("http://wsgg.sbj.cnipa.gov.cn:9080/tmann/annInfoView/annSearch.html?annNum=1739")
print(page.title())
# 等待页面加载完成,可以设置等着某个元素加载出来 ,最长等待一分钟
page.wait_for_selector(selector='tr.evenBj:nth-child(2) > td:nth-child(8) > a:nth-child(1)', timeout=60000)
# 点击查看,弹出框. 需要添加延迟
time.sleep(30)
page.click('"查 看"')
imgList = []
time.sleep(3)
for i in range(100):
# 查找元素
time.sleep(1)
search_value = page.eval_on_selector("#imgs", "el => el.src")
# 输出图片路径值
print(search_value)
imgList.append(search_value)
page.click('"下一页"')
print(imgList)
print('获取图片数量:' str(len(set(imgList))))
# 关闭浏览器
browser.close()
这个爬虫的主要的问题是怎么绕过点击【查 看】的检测。
在我测试过程中,还是有一定的概率请求失败的,所以这就造成了,我也不知道对方服务器是靠什么信息来反爬,以至于在某些时候,我以为对方是有学习成功,拒绝可疑的行为,但是它总是得如何监测可疑行为啊?
后记:
本文主要是playwright 的一个实践,说实话,其实这也是我第一次用,不过从目测感觉上效果还不错,原理跟selenium不同,很多站点对selenium已经做了限制,而playwright 比较新,除非及时更新站点,否则在一定程度上并不能检测到对方使用的是什么浏览工具。
好了,本次分享就到来这里。
我是马拉松程序员,可不止于代码。