POST請求登入網頁
一、登入知乎
這裡用的是手機端登入的,知乎登入的連結
post請求的引數:
_xsrf:據說是防跨站請求的;
password:密碼
email:登入郵箱
captcha:驗證碼
在登入頁定位到這些引數,用post在登入時傳入這些引數,就可以登入了;
下面是完整程式碼:
import requests, time
from http import cookiejar
from PIL import Image
import re
session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='cookies.txt')
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'
}
try:
# 從本地檔案載入cookies
# ignore_discard的意思是即使cookies將被丟棄也將它儲存下來,ignore_expires的意思是如果在該檔案中cookies已經存在,則覆蓋原檔案寫入
session.cookies.load(ignore_discard=True)
except Exception as e:
print('exception:', e)
print('沒有cookie資訊')
def get_xsrf():
index_url = 'https://www.zhihu.com/signin?next=/'
# _xsrf 是一個動態變化的必要引數
index_page = session.get(index_url, headers=headers)
html = index_page.text
pattern = r'name="_xsrf" value="(.*?)"'
# 這裡的_xsrf 返回的是一個list
_xsrf = re.findall(pattern, html)
return _xsrf[0]
def get_captcha():
t = str(int(time.time() * 1000))
captcha_url = 'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
response = session.get(captcha_url, headers=headers)
captcha_name = 'captcha.gif'
with open(captcha_name, 'wb') as f:
f.write(response.content)
im = Image.open(captcha_name)
im.show()
return input('請輸入驗證碼: ')
def get_email():
return input('請輸入郵箱: ')
def get_password():
return input('請輸入密碼: ')
def login(email, password, _xsrf, captcha):
data = {
'_xsrf': _xsrf,
'password': password,
'email': email,
'captcha': captcha
}
login_url = 'https://www.zhihu.com/login/email'
response = session.post(login_url, data=data, headers=headers)
print('response.json() =', response.json())
# 儲存cookies到本地
session.cookies.save()
def isLogin():
# 檢視使用者個人資訊來判斷是否已經登入
url = "https://www.zhihu.com/settings/profile"
# 這裡重定向一定要設定為false, 否則就算沒有登入會被重定向到登入的地址去, 然後code就返回200了
response = session.get(url, headers=headers, allow_redirects=False)
code = response.status_code
if code == 200:
return True
else:
return False
if __name__ == '__main__':
if isLogin():
print('您已經登入')
else:
email = get_email()
password = get_password()
_xsrf = get_xsrf()
print('_xsrf =', _xsrf)
captcha = get_captcha()
login(email, password, _xsrf, captcha)
執行結果:
這裡是用郵箱登入的,驗證碼需要手動輸入;
二、自動識別驗證碼
python識別驗證碼,需要安裝的模組
Ubuntu版本:
1、tesseract-ocr安裝
sudo apt-get install tesseract-ocr
2、pytesseract安裝
sudo pip install pytesseract
3、Pillow 安裝
sudo pip install pillow
其他linux版本(如centos):
1、tesseract-ocr安裝 沒找到直接命令安裝,所以需要手動下載安裝包。 https://github.com/tesseract-ocr/tesseract 在上述地址中下載最新的tesseract-ocr的安裝包,並解壓。 通過以下命令安裝:
(1)cd tesseract-3.04.01
(2)./autogen.sh
(3)./configure 注意,如果出現error: leptonica not found,需要下載安裝leptonica http://www.leptonica.org/download.html
(4)make
(5)make install
(6)ldconfig
2、pytesseract安裝 sudo pip install pytesseract
3、Pillow 安裝 sudo pip install pillow
windows版本:
1、tesseract-ocr安裝 下載,並安裝。
注意:如果是64位的使用者,在安裝的時需要改變安裝目錄,如下圖所示
2、pytesseract安裝 pip install pytesseract
3、Pillow 安裝 pip install pillow
下面驗證一下識別驗證碼:
#coding:utf-8
import pytesseract
from PIL import Image
image = Image.open('code.png')
code = pytesseract.image_to_string(image)
print(code)
可能會遇到的問題:
問題1、FileNotFoundError: [WinError 2] 系統找不到指定的檔案。
解決辦法:
1、[推薦]: 將tesseract.exe新增到環境變數PATH中,
例如: 預設路徑為C:\Program Files (x86)\Tesseract-OCR
注意: 為了使環境變數生效,需要關閉cmd視窗或是關閉pycharm等ide重新啟動
2、 修改pytesseract.py檔案,指定tesseract.exe安裝路徑
開啟檔案 pytesseract.py,找到如下程式碼,將tesseract_cmd的值修改為全路徑,在此使用就不會報錯了。
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
# tesseract_cmd = 'tesseract'
tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
3、 在實際執行程式碼中指定
pytesseract.pytesseract.tesseract_cmd = 'D:\\Tesseract-OCR\\tesseract.exe'
問題2:
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file \Tesseract-OCR\tessdata/eng.traineddata')
解決方法:
1、[推薦]:將tessdata目錄的上級目錄所在路徑(預設為tesseract-ocr安裝目錄)新增至TESSDATA_PREFIX環境變數中
例如: C:\Program Files (x86)\Tesseract-OCR
2、 在.py檔案配置中指定tessdata-dir
tessdata_dir_config = '--tessdata-dir "D:\\Tesseract-OCR\\tessdata"'
# tessdata_dir_config = '--tessdata-dir "'C:\\Program Files (x86)\\Tesseract-OCR\\tessdata"'
pytesseract.image_to_string(image, config=tessdata_dir_config)
小試牛刀:
#coding:utf-8
import pytesseract
from PIL import Image
image = Image.open('code.png')
code = pytesseract.image_to_string(image)
print(code)
執行結果:
相關文章
- .net 模擬登陸 post https 請求跳轉頁面HTTP
- Android okHttp網路請求之Get/Post請求AndroidHTTP
- 使用postman模擬登陸post請求方法Postman
- java post 請求Java
- iOS 同步請求 非同步請求 GET請求 POST請求iOS非同步
- 網頁請求(Ajax)網頁
- jQueryAjax:$.post請求示例jQuery
- requests 模組 - post 請求
- post 請求工具類
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 部落格園登入請求分析
- Postman傳送Post請求Postman
- Java傳送Post請求Java
- Java 監聽POST請求Java
- 搜狗站長工具【post請求模擬登入】程式碼分享總結【批量提交搜狗收錄網址】
- 【轉】怎麼用PHP傳送HTTP請求(POST請求、GET請求)?PHPHTTP
- Android Http請求框架一:Get 和 Post 請求AndroidHTTP框架
- 【網頁登入】QQ 登入、微信登入、微博登入、GitHub 登入網頁Github
- get請求和post請求的區別
- vue 發起get請求和post請求Vue
- PbootCMS登入請求發生錯誤boot
- 灌水帖 asp.net非法請求時跳轉到登入頁面ASP.NET
- POST與GET請求區別
- POST發起下載請求
- post請求帶來的option
- HTTP Get,Post請求詳解HTTP
- C# 傳送POST請求C#
- Get和Post請求詳解
- ajax中POST請求與引數(請求體)設定
- java傳送post請求 ,請求資料放到body裡Java
- 安卓okhttp3進行網路請求,一個簡單的登入頁面的實現安卓HTTP
- scrapy抓取ajax請求的網頁網頁
- get請求和post請求區別詳解
- uni-app的POST請求和GET請求APP
- java傳送GET和post請求Java
- axios的post請求爬坑iOS
- get與post的請求區別
- go對get、post請求封裝Go封裝