python爬虫学习:验证码之OCR

在爬虫的过程中,可能都会遇到一个很头疼的问题: 验证码 。弹出验证码是 反爬虫 的一种方式,主要是由于这些原因:

  1. 抓取频率太高
  2. 爬虫未伪装
  3. 网站限制访问次数

对于第一种情况,如果爬虫的要求不是很高的话,或者网站很奇葩,一定需要时间间隔,例如:

在抓取这类网站的时候,可以在每个抓取周期里面加上一个暂停,每次抓取都暂停 3 秒:

import time
time.sleep(3)

一般就可以杜绝这种情况的发生了。什么时候才算是爬虫的要求不高?爬虫可以分为两类:

  1. 主动式爬虫
  2. 被动式爬虫

主动式爬虫指的是,输入一个关键词,然后根据这个关键词去抓取相关的信息下来。这类的爬虫一般要求的数据量少,对爬虫要求没那么高,一般的爬虫工作者完全能胜任此类要求。

被动式爬虫指的是,实时监测网站更新的内容,一旦发现更新就将其抓取下来,这类一般出现在新闻公司。还有一种是要求将网站某一种类的信息全部抓取下来,这一般出现在电商公司。例如在每天将将淘宝女装的信息抓取到数据库,方便运营人员统计分析。被动式爬虫一般要求的数据量大,难度相对会高一些,几本也算是爬虫界的分水岭。

言归正传,在爬虫的时候遇到验证码怎么办?在条件不太富裕的情况下,可以选择更换 UA 来避免爬虫被发现的概率。作者收集了几百个 头部UA ,下载链接:

头部UA.txt

抓取前筛选出一部分想要的 UA ,按行读取:

#!/usr/bin/python3.4
# -*- coding: utf-8 -*-
'''
遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料
'''
fileua = open("头部UA.txt")
uas = fileua.readlines()
for item in uas:
    ua = item.strip()
    print(ua)

每次抓取构造 header 的时候使用新的 UA :

扫描二维码关注公众号,回复: 6393369 查看本文章
header = {
        "User-Agent": ua,
    }

这样被发现为爬虫的概率降低了,弹出验证码的概率也低了。

但是一般这样还是不够,如果再加上伪装 cookie 就更完美了,可是如何获取 cookie 呢?一般在伪装头部的时候会有一个字段 host , 构造一个简单的头部访问 host ,就可以得到 cookie 了,再携带这个 cookie 访问想要抓取的网址:

#!/usr/bin/python3.4
# -*- coding: utf-8 -*-

import requests
url = "https://www.baidu.com/"

session = requests.session()
req = session.get(url)
cookie = requests.utils.dict_from_cookiejar(req.cookies)
print(cookie)

一般携带 cookie 后访问,还需要验证码的概率会降低一些。可是,还是需要验证码怎么办?本文的重点来了,使用 orc 识别简单的字母文字验证码!

在使用 tesseract-ocr 之前需要安装一些库:

  1. pip3 install pyocr
  2. pip3 install pillow 或者 easy_install Pillow
  3. 安装tesseract-ocr:http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe,安装在C:\Program Files\下
  4. 要求python默认安装在C盘
  5. 找到 pytesseract.py 更改 tesseract_cmd = ‘C:/Program Files/Tesseract-OCR/tesseract.exe’

如果出现错误:

'str' does not support the buffer interface 

将 pytesseract.py 中的下面语句更换:

lines = error_string.splitlines()
#error_lines = tuple(line for line in lines if line.find('Error') >= 0)
error_lines = tuple(line.decode('utf-8') for line in lines if line.find(b'Error') >= 0)
if len(error_lines) > 0:
	return '\n'.join(error_lines)
else:
	return error_string.strip()

识别数字验证码:

# !/usr/bin/python3.4
# -*- coding: utf-8 -*-

import pytesseract
from PIL import Image

image = Image.open('../jpg/code.png')
code = pytesseract.image_to_string(image)
print(code)

完美识别:

猜你喜欢

转载自blog.csdn.net/qq_40925239/article/details/90698028