Python爬蟲培訓或學習過程中,需掌握的爬取驗證碼方法
Python爬蟲實戰爬取驗證碼
1.破解驗證碼常見的三種方法:
(1)把驗證碼下載到本地,手動輸入進行破解
(2)Tesseract光學識別模組:能夠自動識別驗證碼,準確率不高,只能識別一些簡單驗證碼
程式碼測試
pip install pytesseract
pip install pillow
# 轉化為灰度圖片
img = img.convert('L')
img.show()
# 二值化處理
threshold = 140
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
out = img.point(table, '1')
out.show()
img = img.convert('RGB')
enhancer = ImageEnhance.Color(img)
enhancer = enhancer.enhance(0)
enhancer = ImageEnhance.Brightness(enhancer)
enhancer = enhancer.enhance(2)
enhancer = ImageEnhance.Contrast(enhancer)
enhancer = enhancer.enhance(8)
enhancer = ImageEnhance.Sharpness(enhancer)
img = enhancer.enhance(20)
(3)雲打碼平臺:
雲打碼
2.下面是我們用第一種方法來破解驗證碼:把驗證碼下載到本地,手動輸入進行破解
前期準備工作:
爬取網站:古詩文網站 https://www.gushiwen.org/
開發環境:pycharm,python3.6
抓包工具:fiddler抓包,抓取登入介面
使用第三方模組:請求模組 requests,解析模組不bs4,
流程思路:
(1)首先明確我們要爬取的內容,準備好需要的開發工具和環境
(2)第一步:我們要進行模擬登入古詩文網站遇到的驗證碼,使用requests模組進行模擬登入,同時我們要先找到驗證碼的連結,下載好驗證碼
(3)第二步:登入傳送的請求時候,我們手動輸入下載好的驗證碼
實戰程式碼:
首先在pycharm下匯入我們需要的第三方模組:requests,bs4
模擬登入頁面的驗證碼圖片,找到頁面標籤。然後解析定位,下載到本地
模擬登入之前,首先先輸入驗證碼。然後再發送登入請求。用的是requests模組,直接封裝好表單資料
執行函式:
上面是截圖,下面是原始碼:
#匯入我們需要的第三方庫
import requests
from bs4 import BeautifulSoup
import urllib.request
#封裝好請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
}
#下載登入頁面的圖片
def download_code(s):
url = 'https://so.gushiwen.org/user/login.aspx?from=http://so.gushiwen.org/user/collect.aspx'
r = s.get(url=url, headers=headers)
soup = BeautifulSoup(r.text, 'lxml')
# 得到圖片連結,
image_src = 'https://so.gushiwen.org' + soup.find('img', id="imgCode")['src']
# print(image_src)
r_image = s.get(image_src, headers=headers)
with open('code.png', 'wb') as fp:
fp.write(r_image.content)
# 查詢表單所需要的兩個引數
__VIEWSTATE = soup.find('input', id="__VIEWSTATE")['value']
__VIEWSTATEGENERATOR = soup.find('input', id="__VIEWSTATEGENERATOR")['value']
return __VIEWSTATE, __VIEWSTATEGENERATOR
#模擬登入
def login(view, viewg, s):
post_url = 'https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
# 提示使用者輸入驗證碼
code = input('哥們.麻煩你輸入驗證碼:')
formdata = {
'__VIEWSTATE': view,
'__VIEWSTATEGENERATOR': viewg,
'from': 'http://so.gushiwen.org/user/collect.aspx',
'email': '[email protected]',
'pwd': '123456',
'code': code,
'denglu': '登入',
}
r = s.post(url=post_url, headers=headers, data=formdata)
with open('gushi.html', 'w', encoding='utf8') as fp:
fp.write(r.text)
def main():
# 建立會話
s = requests.Session()
# 下載驗證碼到本地
view, viewg = download_code(s)
# 向post地址傳送請求
login(view, viewg, s)
if __name__ == '__main__':
main()