引入
- 相關的門戶網站在進行登錄的時候,如果用戶連續登錄的次數超過3次或者5次的時候,就會在登錄頁中動態生成驗證碼。通過驗證碼達到分流和反爬的效果。
目錄:
- 使用超級鷹打碼平台識別驗證碼
知識點回顧
- session的創建方式
- session的作用
- proxies參數的作用
- 高匿,透明代理的區別
超級鷹打碼平台處理驗證碼的實現流程:
代碼展示:
import requests from hashlib import md5 #調用了打碼平台的相關的接口對指定的驗證碼圖片進行識別,返回圖片上的數據值 class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 圖片字節 codetype: 題目類型 參考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:報錯題目的圖片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() import requests from lxml import etree import json import time import re #1.對攜帶驗證碼的頁面數據進行抓取 url = 'https://www.douban.com/accounts/login?source=movie' headers = { 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Mobile Safari/537.36' } page_text = requests.get(url=url,headers=headers).text #2.可以將頁面數據中驗證碼進行解析,驗證碼圖片下載到本地 tree = etree.HTML(page_text) codeImg_url = tree.xpath('//*[@id="captcha_image"]/@src')[0] #獲取了驗證碼圖片對應的二進制數據值 code_img = requests.get(url=codeImg_url,headers=headers).content #獲取capture_id '<img id="captcha_image" src="https://www.douban.com/misc/captcha?id=AdC4WXGyiRuVJrP9q15mqIrt:en&size=s" alt="captcha" class="captcha_image">' c_id = re.findall('<img id="captcha_image".*?id=(.*?)&.*?>',page_text,re.S)[0] with open('./code.png','wb') as fp: fp.write(code_img) #獲得了驗證碼圖片上面的數據值 chaojiying = Chaojiying_Client('超級鷹用戶名', '超級鷹用戶名的密碼', '911742') #用戶中心>>軟件ID 生成一個替換 911742 im = open('code.png', 'rb').read() #本地圖片文件路徑 來替換 code.png 有時WIN系統須要// codeText = chaojiying.PostPic(im, 9101)['pic_str'] #9101 驗證碼類型 官方網站>>價格體系 #進行登錄操作 post = 'https://accounts.douban.com/login' data = { "source": "movie", "redir": "https://movie.douban.com/", "form_email": "15027900535", "form_password": "bobo@15027900535", "captcha-solution":codeText, "captcha-id":c_id, "login": "登錄", } print(c_id) login_text = requests.post(url=post,data=data,headers=headers).text with open('./login.html','w',encoding='utf-8') as fp: fp.write(login_text)
