【Python小工具】爬虫之获取图片验证码

Python小工具系列是一个使用Python实现各种各样有意思的小玩意儿的系列,包括制作个性化的二维化、词云、简单爬虫等,持续更新中,如果你感兴趣就关注一波吧!

一、基本介绍

接上一篇使用OpenCV识别网站的数字+字母验证码,忽然想起来自己还没有介绍怎么拿到网站的验证码。
下面是我要获取的验证码截图:【Python小工具】爬虫之获取图片验证码_第1张图片

因此这篇博客就来介绍一下我所遇到的一种情况:即需要携带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

⭕️:注意!

  1. 这里只展示了获取验证码图片方法,其中使用的库or模块还需要自己提前导入的。
    (此爬虫仅用于学习交流,不涉及任何商业利益 ^_^)
  2. 此处的url原本是我所在学校教务系统的地址,已做修改,大家复制后是无法直接运行的(可以替换为自己想爬的登陆地址)

三、注意事项

1.步骤

这里首先要获取到目标网站的内容,然后定位到图片(此处我使用的是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)

2.原理

有的网站可能直接就放图片的链接,那么就可以直接请求链接,保存到本地,然后进行识别。
但是此处图片是从服务器请求的,每点击一次就会请求一次,所以要求必须携带跳转前分配的Cookie,已保证返回的是不同的验证码。所以很重要的一步就是在headers中携带Cookie(这个Cookie是之前就分配给rep的headers中的Set-Cookie中的,因此可以直接拿到)。
【Python小工具】爬虫之获取图片验证码_第2张图片

你可能感兴趣的:(小项目,python,爬虫,开发语言)