利用Python进行爬虫及识别验证码

背景:带大家用selenium模拟人访问网页,并注册登陆账号、输入验证码,最终获取数据。

验证码处理方法:1、利用ocr识别;2、人工识别;3、cnn卷积神经网络,用训练集做一套模型。(观察案例网站的验证码是属于字体较为正规,用ocr识别就够用了。当我们遇到验证码扭曲程度较大时,可做模型识别。)

思路:下载selenium库、浏览器插件 --->下载验证码识别库PIL、图像识别 --->大致了解网页结构 --->动手,获取数据 --->整理数据

学习基础:selenium库、图像识别基础知识

爬虫规则:

1、浏览器:谷歌 64.0.3282.119 (64)

2、浏览器驱动:Chromedriver(64位)

3、设置驱动路径需要将谷歌驱动的路径添加到环境变量Path下。(规则1-3可参考此网址教程:)

4、软件:Python3.5

5、运用到的库:selenium、pytesseract、PILpytesser3tesseract

6、图像识别包:tesseract-OCR(需下载)

7、修改pytesseract.py 代码中路径设置,改为OCR.exe位置(必须修改,否则会显示无法找到文件)

案例:登陆前程无忧,搜索相关工作。

--------------------------------------------------------规则设定好后,我们开始吧--------------------------------------------------

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import os
import sys,time
import pytesseract
import  pytesser3
from PIL import Image,ImageEnhance
import numpy as np
import pandas as pd

打开目标网页

browser=webdriver.Chrome()#打开浏览器,也可选择火狐等浏览器
url=r'https://login.51job.com/login.php?lang=c'
browser.get(url)

前面步骤可用代码操作,最后人工输入短信验证码.


找到账号和密码填写元素,并输入。

phone=browser.find_element_by_id('phone')
phone.send_keys('137****0000')#输入手机号码
userpwd=browser.find_element_by_id('userpwd')
userpwd.send_keys('123456abc')#输入密码
cfmpwd=browser.find_element_by_id('cfmpwd')
cfmpwd.send_keys('123456abc')#输入确认密码

输入验证码,并判断验证码是否正确



我们可以发现,当输入错误验证码或没有输入验证码时,value=0,当验证码输入正确,value=1.并且发现一个有趣的事,必须输入4位数网页才能识别验证码是否正确,就是说,如果ocr识别验证码返回4位数以下时,我们需要填充数字直到它是4位数。

 value=0
 while value==0:
    #全屏截图,再从全屏的图片中截取验证码位置
    path=r'picture.png'#全屏图片保存路径
    browser.get_screenshot_as_file(path)
    im=Image.open(path)
    
    #截验证码
    box=(518,340,590,375)
    web_p=im.crop(box)
    path_code=r'code.png'#验证码保存路径
    web_p.save(path_code)
    
    #二值化
    im=Image.open(path_code)
    imgry=im.convert('L')
    sharpness=ImageEnhance.Contrast(imgry)
    sharp_img=sharpness.enhance(3.5)
    #sharp_img.point(lambda x:0 if x<1 else 255,'1')
    sharp_img.save(path_code)
  #识别验证码,并整理
    word_p=pytesseract.image_to_string(sharp_img)
    word=''
    for i in word_p:
        if i !=' ':
            word=word+i
        else:
            continue
    if len(word)<4:
          word=word+’a’*(4-len(word))
    #输入验证码
    code_word=browser.find_element_by_name('verifycode')
    #input.clear()#如果错误自动清除
    input.send_keys(word)
    
    #判断验证码是否正确
    value_c=browser.find_element_by_css_selector('#verifycodechked')
    #计算输入验证码次数
    num=num+1
    time.sleep(1)

输入手机验证码

pass_send=browser.find_element_by_css_selector('#btn7')
pass_send.click()
code_num=input('请输入手机验证码:')
phone_code=browser.find_element_by_css_selector('#phonecode')
phone_code.send_keys(code_num)

#点击注册
submit=browser.find_element_by_css_selector('#submitbtn')
submit.click()

(以上介绍完如何自动化注册,自动识别验证码。爬取信息尚未更完,待续……)

猜你喜欢

转载自blog.csdn.net/weixin_41712808/article/details/79639232