在爬取网页数据时,经常出现需要登录账户且要输入验证码的情况。
以http://www.santostang.com/wp-login.php?action=register该网页为例,需要先使用浏览器的检查功能找到form表单中的input,具体如下所示:
由上图可知找到了五个input,分别需要输入的是:用户名、电子邮件、验证码、隐藏值、是否提交。
使用人工方法处理验证码就是在程序运行时弹出验证码的输入框,手动输入验证码,准确性高,但需要守着程序的运行。具体实现步骤如下:
定义get_captcha()函数,从原网页中通过检查功能定位到验证码的信息,获取验证码图片的url,将验证码图片保存至源代码所在的地址(方便后续打开图片);打开图片手动输入图片中的验证码。
def get_captcha():
#获取验证码图片所在的url
r = session.get('http://www.santostang.com/wp-login.php?action=register',headers=headers)
soup = BeautifulSoup(r.text,"lxml")
captcha_url = soup.find("img",id="captcha_code_img")["src"]
#获取验证码图片
r = session.get(captcha_url,headers=headers)
with open('captcha.jpg','wb') as f:
f.write(r.content)
f.close
try:
im = Image.open('captcha.jpg')
im.show()
im.close()
except:
print(u'请到 %s 目录找到chptcha.jpg手动输入' % os.path.abspath('captcha.jpg'))
captcha = input("please input the captcha\n>")
return captcha
使用register()函数将表单中的数据准备好,加上验证码一起,提交POST请求并进行注册。如果输出结果为200,则表示注册成功。
def register(account,email):
post_url = 'http://www.santostang.com/wp-login.php?action=register'
postdata = {
'user_login':account,
'user_email':email,
'redirect_to':'',
}
#调用get_captcha函数,获取验证码数字
postdata["ux_txt_captcha_challenge_field"] = get_captcha()
#提交post请求,进行住粗
register_page = session.post(post_url,data=postdata,headers=headers)
#若输出打印结果为200,则表示注册成功
print(register_page.status_code)
import requests
from bs4 import BeautifulSoup
import re
import os
from PIL import Image
if __name__ == '__main__':
agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.46'
headers = {
'host':'www.santostang.com',
'Origin':'http://www.santostang.com',
'Referer':'http://www.santostang.com/wp-login.php?action=register',
'User-Agent': agent
}
session = requests.session()
#调用注册函数进行注册
account = '18341432113'
email = '[email protected]'
register(account,email)
OCR(Optical Character Recognition光学字符识别)即使用图像识别技术输入验证码。需要安装Tesseract库,将验证码图像转化为灰度图像并进行二值化处理;然后使用Tesseract进行图像识别。由于OCR是自动识别验证码因此会出现识别错误的情况。