Python小工具系列是一个使用Python实现各种各样有意思的小玩意儿的系列,包括制作个性化的二维化、词云、简单爬虫等,持续更新中,如果你感兴趣就关注一波吧!
接上一篇使用OpenCV识别网站的数字+字母验证码,忽然想起来自己还没有介绍怎么拿到网站的验证码。
下面是我要获取的验证码截图:
因此这篇博客就来介绍一下我所遇到的一种情况:即需要携带Cookie去请求图片,并保存在本地指定路径。
# 拿到教务系统验证码图片并保持到code.jpg文件中
def get_code_img():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36'
}
# 教务系统的url
url = 'https://jwxt0.xxx.edu.cn/default2.aspx'
rep = requests.get(url=url, headers=headers)
page_text = rep.text
# 数据解析
tree = etree.HTML(page_text)
code_img_url = 'https://jwxt0.xxx.edu.cn' + tree.xpath('//div[@class="jympic"]/img/@src')[0]
print(code_img_url)
# 进一步解析
img_headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
"Cookie": rep.headers['Set-Cookie'], # 获取headers中的Cookie并携带(否则就拿不到二维码图片)
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36'
}
# 发送请求图片
res = requests.get(url=code_img_url, headers=img_headers)
# 设置一个变量,该变量为指定保存的路径,windows系统下的 D盘,test目录
dir_name = 'D:\\Study\\python\\pythonProject\\pythonProject\\CrawlerStudy\\images'
# 判断 指定目录,如果不存在该目录,则创建该目录
if not os.path.exists(dir_name):
os.mkdir(dir_name)
# 指定路径(拼接上图片名及后缀
path = dir_name + '\\verification.jpg'
# 把获取的二进制写入图片文件 (注意:这里直接写入在Pycharm中可能只显示创建的目录而不显示文件,在文件夹中打开就可)
with open(path, mode='wb') as f:
f.write(res.content)
# 将图片文件的保存路径返回
return path
⭕️:注意!
这里首先要获取到目标网站的内容,然后定位到图片(此处我使用的是xpath),获取图片的src。作为新的请求地址
拿到地址后存储在本地文件夹中,方便后续使用OpenCv进行识别或者模型训练。具体代码如下:
# 判断 指定目录,如果不存在该目录,则创建该目录
if not os.path.exists(dir_name):
os.mkdir(dir_name)
# 指定路径(拼接上图片名及后缀
path = dir_name + '\\verification.jpg'
# 把获取的二进制写入图片文件 (注意:这里直接写入在Pycharm中可能只显示创建的目录而不显示文件,在文件夹中打开就可)
with open(path, mode='wb') as f:
f.write(res.content)
有的网站可能直接就放图片的链接,那么就可以直接请求链接,保存到本地,然后进行识别。
但是此处图片是从服务器请求的,每点击一次就会请求一次,所以要求必须携带跳转前分配的Cookie,已保证返回的是不同的验证码。所以很重要的一步就是在headers中携带Cookie(这个Cookie是之前就分配给rep的headers中的Set-Cookie中的,因此可以直接拿到)。