python爬虫模拟登录知乎时遇到的验证码错误问题

import urllib,urllib2,cookielib
import os,re,time

_url_zhihu='http://www.zhihu.com'
_url_email_login=_url_zhihu+'/login/email'
_captcha_site=_url_zhihu+'/captcha.gif'
_header={'Host':'www.zhihu.com',
'Origin':'http://www.zhihu.com',
'Pragma':'no-cache',
'Referer':'http://www.zhihu.com/',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36',
'X-Requested-With':'XMLHttpRequest','Accept':'*/*',
'Accept-Language':'zh-CN,zh;q=0.8,en;q=0.6',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Content-Length':'111'}


def getXSRF(data):
    '''
    从返回的文件中使用正则表达式解析出_xsrf
    可以考虑使用BeautifulSoup
    '''
    cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags = 0)
    strlist = cer.findall(data)
    return strlist[0]

def get_xsrf_opener(head):
    '''
    接受header字典,并返回构造好的opener和解析出的_xsrf
    '''
    cookie=cookielib.CookieJar()
    handler=urllib2.HTTPCookieProcessor(cookie)
    opener=urllib2.build_opener(handler)
    response=opener.open(_url_zhihu)
    xsrf=getXSRF(response.read())
    with open('xsrf','w') as f:
        f.write(xsrf)
    header=[]
    for key,value in head.items():
        elme=(key,value)
        header.append(elme)
    opener.addheaders=header
    return xsrf,opener

def get_captcha_url():
    return _captcha_site+str(int(time.time())*1000)

def get_captcha(url):
    request=urllib2.Request(url)
    response=urllib2.urlopen(url)
    with open('captcha.gif','wb') as f:
        f.write(response.read())

def login(opener,xsrf='',email='',password='',captcha='',rememberme='true'):
    '''
    用来登录知乎的程序,包括返回的xsrf,email,password
    '''
    values={'email':email,'password':password,'captcha':captcha,'rememberme':rememberme,'_xsrf':xsrf}
    data=urllib.urlencode(values)
    request=urllib2.Request(_url_email_login,data)
    response=opener.open(request)
    return response.read()

def _init():
    '''
    主程序
    '''
    email=raw_input('email: ')
    password=raw_input('password: ')
    xsrf,opener=get_xsrf_opener(_header)
    get_captcha(_captcha_site)
    captcha=raw_input('captcha:')
    f=login(opener,xsrf,email,password,captcha)
    print f


if __name__ == '__main__':
    _init()

————————————————————————————————————————
运行后返回的信息{
    "r": 1,
    "errcode": 1991829,
    
    "data": {"captcha":"\u9a8c\u8bc1\u7801\u9519\u8bef"},
    
    
    "msg": "\u9a8c\u8bc1\u7801\u9519\u8bef"
    
}

信息提示是验证码错误,但是已经传入了验证码,为何还是不能通过(⊙_⊙)?,求Python大神给予指点O(∩_∩)O谢谢

阅读 9.5k
4 个回答

OCR图片识别库:Tesseract OCR
Python封装的接口:pytesseract

来个示例:

#! /usr/bin/env python
# -*- coding: utf-8 -*-

try:
    import Image
except ImportError:
    from PIL import Image

import pytesseract
print(pytesseract.image_to_string(Image.open('demo.jpeg')))

我试了一下,知乎的验证码挺难识别出来,不过可以训练Tesseract OCR,让它达到更高的识别率。


下面是一些参考的文章:

Tesseract OCR初探
验证码识别工具-tesseract

你这样是不行的,每次请求的验证码都是随机的,你自己模拟的和自己在页面上的请求不是同一个请求,验证码肯定是不一样的。

  1. 试一下orc工具获取验证码

  2. 登陆时设置cookie

我之前是使用已登陆账户cookie。用fiddler看下就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题