这是pyppeteer介绍系列的第二篇--元素级别的截图
在经典的反反爬中,一些网站对爬虫不是很敏感,只是开启一些比较低级的反爬机制,比如数字字母混淆验证码。针对这类验证码,一般的操作是获取验证码的图片,然后上传到打码模块让模块去识别验证码,这里就先说明如何获取验证码图片。
以专利检索网http://www.pss-system.gov.cn/的登录系统为例子:
每次访问验证码图片的网址会刷新验证码图片,因此不能通过获取url连接这种方式获得验证码图片,因为这样做你访问登陆的时候是验证码1,访问url连接的时候就会变成验证码2了。
这里很自然地想到截图这种方式把图片截下来。很多教程只是copy教程,所以基本只有整个浏览器界面的截屏,但是其实pyppeteer可以实现元素级的截图功能。
import asyncio
from pyppeteer import launch
async def main():
browser = await launch({'headless':False})
page = await browser.newPage()
await page.goto('http://www.pss-system.gov.cn/sipopublicsearch/portal/uilogin-forwardLogin.shtml')
await page.waitFor(10 * 1000) # 等待10秒看看验证码长什么样
yazhengma = await page.waitForSelector('#codePic') # 通过css selector定位验证码元素
await yazhengma.screenshot({'path': 'yazhengma.png'}) # 注意这里用的是ele.screenshot方法与教程1 page.screenshot是不同的
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
对于上面这种情况,这个功能的优势不是很明显,下面是图片验证码进化的一种例子。
嗯,某验的验证码就像这样,原图是打乱的,浏览器展示的图片是计算js后还原的图,如果想用连接方式取原图基本不可能,所以上述场景应用在这种网站就是十分适用了。