1. 程式人生 > >Python爬蟲培訓或學習過程中,需掌握的爬取驗證碼方法

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