图片验证码处理

  基于requests\lxml\pytesseract\PIL模拟登录古诗文网;

第一步,打开控制台,输入账号密码进行抓包,获取请求方式(post)和登录需要的参数(Form Data).
第二步,分析参数并实现参数的动态获取.
第三步,利用requests发请求.
其中关键的一步在于Form Data中参数code,也就是图片验证码中的字母;在这里首先获取验证码图片的url然后发送请求,利用PIL模块中的img包对图片进行一个灰度处理,最后利用pytesseract模块解析出图片中的字母–也就是Form Data中的参数code.

源码如下:

import requests
from lxml import etree
import pytesseract
from PIL import Image
from io import BytesIO

s = requests.session()
headers = {
‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36’
}

login_url = ‘https://so.gushiwen.org/user/login.aspx?from=’
r = s.post(login_url,headers=headers)
res = etree.HTML(r.text)

__VIEWSTATE = res.xpath(’//input[@id="__VIEWSTATE"]/@value’)[0]
__VIEWSTATEGENERATOR = res.xpath(’//input[@id="__VIEWSTATEGENERATOR"]/@value’)[0]

codeimage = s.get(‘https://so.gushiwen.org/RandCode.ashx’)

def get_code(data):
img = Image.open(BytesIO(data))
img = img.convert(‘L’)
captcha = pytesseract.image_to_string(img)
print(captcha)
img.close()
return captcha

formdata = {
‘__VIEWSTATE’: __VIEWSTATE,
‘__VIEWSTATEGENERATOR’: __VIEWSTATEGENERATOR,
‘from’: ‘’,
‘email’: ‘18203678715’,
‘pwd’: ‘111222aaaBBB’,
‘code’: get_code(codeimage.content),
‘denglu’: ‘登录’
}

res = s.post(login_url,headers=headers,data=formdata)

你可能感兴趣的:(爬虫)