理论上登陆只要把账号密码传送给认证api拿到对应的cookie/session,之后就可以带上cookie访问页面后的内容,但是现在网站的反爬策略太多了,至今都没有成功,所以用自己的网站做爬虫登陆学习

查找认证的api,以163邮箱为例

爬虫学习2:登陆尝试_爬虫登陆

右击审查元素-->清空网络项-->登录框随便输入内容-->查找链接的form表单,有自己输入内容则为api认证链接

 

2.用自己网站尝试登录,发现验证码的识别是个问题,查找发现pytesseract模块可以做图片识别,于是:

import pytesseract
from PIL import Image
from io import BytesIO
Session=requests.Session()
rep=Session.get(
    url="http://127.0.0.1:8000/backend/get_CheckCode",
)

postdata={
    'username':'linzb',
    'password':'123456',
    'captcha':''
}
im=BytesIO(rep.content)
img=Image.open(im)
text=pytesseract.image_to_string(image=img)
print(text)

发现这个模块的图片识别率之低令人发指!尝试用ImageEnhance补救一下依然无可救药,后来发现百度有免费api,一天免费几百次,这..

3.使用百度免费api识别验证码并登录

mport requests,re,urllib
from bs4 import BeautifulSoup
import pytesseract
from PIL import Image
from io import BytesIO
# from PIL import ImageEnhance
import base64
Session=requests.Session()
rep=Session.get(
    url="http://127.0.0.1:8000/backend/get_CheckCode",
)

postdata={
    'username':'linzb',
    'password':'123456',
    'captcha':''
}
params={
    'access_token':'24.7f6850sada9a64dsfb79916ee7bb02de7.2592000.1629616307.282335-24594910'
}

base64_data = base64.b64encode(rep.content)
# img=urllib.parse.quote(base64_data, safe='/', encoding=None, errors=None)
img_data={
    'image':base64_data
}

baidu_rep=requests.post(
    url='https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic',
    params=params,
    data=img_data,
    headers={
        'Content-Type':'application/x-www-form-urlencoded'
    }
)
postdata['captcha']=baidu_rep.text
print(baidu_rep.text)
rep2=Session.post(
    url="http://127.0.0.1:8000/backend/login",
    data=postdata,
    headers={
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'X-Requested-With': 'XMLHttpRequest',
        'Referer': 'http://127.0.0.1:8000/backend/login',
    },

)
rep3=Session.get(
    url="http://127.0.0.1:8000/backend/index"
)

最后登陆成功,这里其实有个小插曲:刚开始验证码太难,直接输入账号密码登陆,但是发现不行,测试分析请求头发现原因有四:

    <1>.我代码判断的时候是判断ajax,所以必须有ajax请求头才能识别

    <2>:提取数据则是用request.POST,在django中必须有'Content-Type'头部才会从body提取到post

    <3>:代码设置了防盗链,所以必须有refer头部

    <4>:sessionID是在请求验证码的链接里面加的,又据此判断验证码,所以如果仅仅提交给认证api是不行的。必须先访问验证码取得sessionID才行(此时的sessionID并没有认证,无法直接访问),然后再去认证api认证

    这些都无意间充当了反爬的策略,但是只要分析请求头,都能处理,难点还是在于验证码

 

debug:

1.图片识别库安装失败:tesserocr
解决:
  pip install pytesseract代替
  
2.django判别ajax请求的头部:
  'X-Requested-With': 'XMLHttpRequest',

3. django 判别request.body生成post的头部
  'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',

4.pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your PATH
解决:
  参考:https://www.jianshu.com/p/93ab58dea50f
  <1>下载https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.0.0-alpha.20210506.exe
  <2>添加变量:增加一个TESSDATA_PREFIX变量名,变量值还是我的安装路径C:\Program Files\Tesseract-OCR\tessdata这是将语言字库文件夹添加到变量中;
  <3>在pytesseract库下的pytesseract.py文件中找到tesseract_cmd = 'tesseract',修改成:
    tesseract_cmd =r'C:\Program Files\Tesseract-OCR\tesseract.exe'

5.百度云免费api使用:(参考:https://cloud.tencent.com/developer/news/81432)
  <1>.创建应用,得到应用里面的API Key和Secret Key获取。
  <2>.通过得到的参数健全
    -命令:curl -i -k 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=5s3lBFtEarW1T4zVg7utUYA1&client_secret=sMMHxag4v7dzNYGtiVEplXwZgGpRVXcR'
    得到token
  我的"access_token":"24.7f68508sdf9a6427b79916ee7bb02de7.2592000.1629616307.282335-24594910"
  
  <3>.
  
6.{"log_id":1418485351913498051,"error_msg":"param image not exist","error_code":216101}
  百度api--data里面,应该写成:
  img_data={
    'image':base64_data
}
  而不能写成img_data='image='+base64_data
  因为这里是django的post请求,跟curl命令的写法不一样