好了,前面一小節咱們對驗證碼的機制有了瞭解,同時又對cookies有了更深的認識,前面也說了,咱們須要先獲取cookies獲得關於驗證碼的信息,而後帶着這個cookies去post數據,咱們再從新把流程整理一下,html
訪問登錄界面,使用RE獲取驗證碼的網址
python
獲取登錄界面的cookies,並保存到一個變量,構造openerapi
使用opener自動攜帶cookies post數據登錄cookie
打開網站的其餘網址,驗證是否登錄成功
post
咱們只須要在前面的代碼中稍做修改,把處理cookies的部分放到前面來就好了網站
#!/usr/bin/env python # -*- coding:UTF-8 -*- __author__ = "217小月月坑" ''' 驗證碼登錄try-2 ''' import urllib import urllib2 import re import cookielib # 獲取登錄界面的源碼並將驗證碼圖片的網址抽取出來 login_url = 'http://id.ifeng.com/allsite/login' headers = {'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:39.0) Gecko/20100101 Firefox/39.0',} pattern = re.compile(r'<img src="(.*?)".*?',re.S) request = urllib2.Request(login_url,headers=headers) contents = urllib2.urlopen(request).read() items = re.findall(pattern,contents) for item in items: print item # cookies處理的部分,獲取登錄界面的cookies並保存 cookieJar = cookielib.CookieJar() handler = urllib2.HTTPCookieProcessor(cookieJar) opener = urllib2.build_opener(handler) # 提示用戶輸入驗證碼 captcha = raw_input("請輸入驗證碼:") # 構造post數據 data = { 'u': 'xxxxxxxxxxx@qq.com', 'k': 'xxxxxxxxxxxxxxxx', 'auth': captcha, 'auto': 'on', 'comfrom':'', 'type': '2', } post_data = urllib.urlencode(data) # 將post 信息發送到接受信息的網址 response = opener.open("https://id.ifeng.com/api/sitelogin",post_data) print response.read() # 打開鳳凰網的博客界面 response2 = opener.open("http://blog.ifeng.com/16441366.html") print response2.read()
好了,來看看輸出ui
......又出錯了,好煩惱url
在盯着程序看了很久以後,我忽然意識到一個問題,這也就是咱們程序錯誤的緣由code
再來回顧一下程序的流程,咱們先打開登錄界面而後獲取驗證碼的網址並點擊該網址獲得驗證碼輸入,這裏存在一個很大的問題,咱們第一次讀取登錄界面的源碼時,咱們其實就已經有了一個驗證碼,咱們獲取驗證碼的地址以後又再一次點擊這個網址查看驗證碼,至關因而刷新了這個驗證碼,這就意味着,咱們先後一共獲得了兩個驗證碼,咱們的cookies是在第一個驗證碼的時候獲取的,而咱們點擊看到的是第二個驗證碼,輸入的也是第二個驗證碼,這樣,cookies和驗證碼是對應不上的htm
那麼,咱們應該怎麼辦呢?
爲了保證cookies和驗證碼信息的一致性,咱們須要跳過前面獲取驗證碼的步驟,咱們不是已經有網址了嗎?並且這個網址也是能夠不斷刷新這個驗證碼的,那咱們就直接向驗證碼的網址發送請求,獲取cookies,並同時將驗證碼下載到本地保存,這樣,cookies就能跟獲取的驗證碼保持一致了