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()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章