Python爬虫自学系列(六)

Python爬虫自学系列(六)_第1张图片

文章目录

    • 前言
    • 方法一:cookie登录
    • 方法二:光学字符识别
      • 下载验证码图片
      • 百度文字识别
      • 百度人工智能程序的创建以及AKSK的获取
        • 代码实现及测试
        • 数字图像处理
    • 方法三:
    • 换换口味

前言

这就到了第六篇啦,很快啊。懂得都懂啦,这一篇相对会比较轻松一些。
(事实真的是这样的吗?不知道哦!!!)
毕竟这一篇是要讲验证码登录的嘛。


方法一:cookie登录

这是一种比较简单粗暴的方式啊,首先如果没有验证码的需求的话,碧如我之前爬CSDN抓到自己的个人信息那次。这种方式就很好了。

Python爬虫自学系列(六)_第2张图片

因为cookie和session的特性,在cookie的有效期内是可以上的去的。

之所以这么说呢,那自然是因为成功过了嘛(爬了哪些网站就不好说了嘛,理解一下)。不过由于测试次数较少,所以也不敢百分百保证能成功。
反正就是,登录之后尽快拿到cookie,尽快拿去登录。

这里我要说一句:在进行“高端操作”之前,不妨先拿个二十分钟来试试这个方法,万一就成了呢?
我曾经还想用selenium来手动登录,这种方法经测验可以登录的上去,但是爬取数据就没那么简单了(可能是我用selenium只会点点点,不会抓数据吧)。


方法二:光学字符识别

注:这个方法看不懂就不要看了,不出意外我这辈子不会用这个方法,更不会去用pytesseract

听这名字,牛逼吧。
其实就是OCR啦。

下载验证码图片

首先要找个目标网址嘛,先找那种简单的验证码,黑白文字的。
captcha图像样本链接,这里面有六十张灰度验证码图,够用啦。

先把图扒拉下来,可以看到这张图是内嵌在页面中的。像这样的图片要怎么办呢?
不难办啊这个,图片也是文件嘛,只要是文件,就肯定存在网站的文件夹下。
内嵌的图片,不过是以一种相对路径的方式来写的罢了。

用网站的根目录,加上图片的地址在试试看:https://captcha.com/images/captcha/botdetect3-captcha-ancientmosaic.jpg
现在能下载了不?

import requests

import os

import time

from lxml import etree

def get_Page(url,headers):

    response = requests.get(url,headers=headers)

    if response.status_code == 200:

        return response.text

    return None

def parse_Page(html,headers):

    html_lxml = etree.HTML(html)

    datas = html_lxml.xpath( './/div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]')

    # 创建保存验证码文件夹

    file = 'D:/YZM'

    if os.path.exists(file):

        os.chdir(file)

    else:

        os.mkdir(file)

        os.chdir(file)

    for data in datas:

    # 验证码名称

        name = data.xpath( './/h3')

    # 验证码链接

        src = data.xpath( './/div/img/@src')

    # print(len(src))

        count = 0

        for i in range(len(name)):

    # 验证码图片文件名

            filename = name[i].text + '.jpg'

            img_url = 'https://captcha.com/'+ src[i]

            response = requests.get(img_url,headers=headers)

            if response.status_code == 200:

                image = response.content

                with open(filename, 'wb') as f:

                    f.write(image)

                count += 1

                print( '保存第{}张验证码成功'.format(count))

                time.sleep( 1)

def main():

    url = 'https://captcha.com/captcha-examples.html?cst=corg'

    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}

    html = get_Page(url,headers)

    parse_Page(html,headers)

if __name__ == '__main__':

    main()

百度文字识别

Python是有处理OCR的tesserocr库,据说准确率和上手程度没有百度这个润,所以就先讲这个了。

百度OCR-API文档

接口能力啥的我就不说了吧,人家自己有官宣的。

我着重讲讲怎么用。

首先,你要注册个账号。


百度人工智能程序的创建以及AKSK的获取


代码实现及测试

from aip import AipOcr  # pip install baidu-aip
import os

i = 0

j = 0

APP_ID = '你的 APP_ID '
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

# 读取图片

file_path = 'D:/YZM'

filenames = os.listdir(file_path)

# print(filenames)

for filename in filenames:
# 将路径与文件名结合起来就是每个文件的完整路径
    info = os.path.join(file_path,filename)

    with open(info, 'rb') as fp:
        # 获取文件夹的路径
        image = fp.read()

        # 定义参数变量
        options = {
     
            'detect_direction': 'true',
            'language_type': 'CHN_ENG',
        }

        # 调用通用文字识别接口
        result = client.basicGeneral(image,options)
        print(result)

        if result[ 'words_result_num'] == 0:
            print(filename + ':'+ '----')
            i += 1
        else:
            for word in result['words_result']:
                print(filename + ' : '+word['words'])
                j += 1

        print('共识别验证码{}张'.format(i+j))
        print('未识别出文本{}张'.format(i))
        print('已识别出文本{}张'.format(j))

惨不忍睹啊,就对了两张。。。

没事啊,别慌,我们对图像进行一下数字图像处理

数字图像处理

from PIL import Image
import os


file_path = 'D:/YZM'
filenames = os.listdir(file_path)

for filename in filenames:
    info = os.path.join(file_path,filename)

    # 打开图片
    image = Image.open(info)

    # 传入'L'将图片转化为灰度图像
    gray = image.convert('L')

    bw = gray.point(lambda x: 0 if x < 1 else 255, '1')

    bw.save(filename)

处理之后,整体是好一些,但是也就那样了。
应该是我学艺不精,毕竟我的数字图像处理能过,离不开老师和同学的努力,一大部分原来就是黑白的图拿去洗完之后就洗白白了。。

不过嘛,既然是自动化了,别洗了,就多试试嘛。


方法三:

上面那个方法,又臭又长。我不喜欢,浪费我一下午。
我是个实在的人,黑猫白猫,只要能抓老鼠的就是好猫。

Python爬虫自学系列(六)_第3张图片

方法一需要cookie,会担惊受怕,随后讲的用selenium操作又不好抓数据。
方法二再怎么样,也只是识别一下,最后还是得用post方法提交数据上去。

既然selenium、cookie我都能拿出来用了,我还有什么不敢做的?直接图片爬下来,填上去。暴力吧,当时我们“爬虫百战穿山甲”小队的“从入门到懵逼”小伙伴就是这么干的,人家也成功了。

实现就行了,你管我怎么实现的嘛。


好了好了,说句实在话,如果要处理大量验证码的话,方法二是可以去深入挖一下的。


接下来我们看点别的东西吧


Python爬虫自学系列(六)_第4张图片

换换口味

滑块验证码:爬虫入门经典(十八) | 滑动验证码识别
看他的吧,早些时候我们打过交道,我们都是大数据的学生,这篇里面居然还有我的出镜机会啊。

破解极验验证码:爬虫入门经典(十九) | 难度提升,破解极验验证码


再把scrapy和正则表达式的链接放了吧,接下来几天有不得不离开一段时间的原因,要缓更了。

Scrapy:我要偷偷的学Python,然后惊呆所有人(第十三天)
这篇大家的积极性挺高的。

正则:今天我把话放这儿,明天我要会【正则表达式】
这篇我个人很喜欢,但是没有流量。


Python爬虫自学系列(六)_第5张图片

我在哔哔两句吧:这个系列本来预计是写八篇知识点,两个项目实战的,但是由于我本身技术有限,加上一些身体原因,到这第六篇就讲完我要讲的知识点了,接下来会放两个实战项目,这个不会折扣,也不会是那种大家都在做的。是“爬虫百战穿山甲”团队遇到的硬骨头,我去啃一啃吧。

这篇,虽然痞了点,但是不是很水吧Python爬虫自学系列(六)_第6张图片

你可能感兴趣的:(Python爬虫自学,python,图像识别,验证码)