1. 程式人生 > >python模擬登陸網站

python模擬登陸網站

  上次寫了一個C++的小爬蟲,能夠爬一些網站上的圖片,但是有些網站需要登陸後才能訪問內容,用C++的話需要openSSL,配置起來好像挺麻煩的,所以選擇了python,以及使用reques網路庫。

  模擬登陸,也就是我們要知道登陸的過程,以及我們在網頁中發出的請求是什麼,比如,賬號、密碼、驗證碼,等等,當我們得到以上的資料,然後POST出去後,我們要記錄下cookie(用於辨識使用者身份以及儲存一些資料),然後通過載入這個cookie去訪問網站內的其他網址。
  本來想爬取知乎來著,但是知乎現在改版,加入了挺多要提交的資料,我是不知道怎麼弄了,而豆瓣的話,我在檢視網頁程式碼的時候,發現驗證碼的地址是每次都在變化,而知乎的驗證碼就是一個地址,只是返回的結果不同,而豆瓣的每次都不一樣,所以無從下手,下面的程式碼是從載入cookie訪問的。

  執行douban()函式後會載入captcha,然後用opencv的開啟圖片功能開啟,然後輸出圖片的內容,然後把資料POST到伺服器,測試是否成功,則通過去請求一個網站內只有使用者的訪問的網址,若成功則返回內容,否則返回登陸的內(目前驗證碼無從下手,只試了一下載入cookie)

程式碼:

from http import cookiejar
import requests
import cv2
import re

def downLoadCaptcha(url):
    captcha=requests.get(url)
    image=open('captcha.jpg'
,'wb') image.write(captcha.content) image.close() def printCaptcha(): img=cv2.imread('captcha.jpg') cv2.imshow('yzm',img) cv2.waitKey() str=input('輸入驗證碼:') print('輸入的驗證碼為:%s'%str) return str def getCaptchaUrlAndId(url): login=requests.get(url) tmp=str(login.content.decode('utf_8'
)) ruler=re.compile(r'name="captcha-id"(.*)value="(.*)"') match=ruler.search(tmp) if match: #豆瓣captcha格式 temp='https://www.douban.com/misc/captcha?id='+match.group(2)+'&size=s' mlist=[match.group(2),temp] return mlist def readCookie(cookieName): f=open(cookieName,'r') temp=f.read() f.close() cookie={} for i in temp.split('\n'): key,value=i.split(':',1) cookie[key]=value print(cookie) return cookie #豆瓣爬取 def douban(): username='******@qq.com' password='*****' data={ 'form_email':username, 'form_password':password, 'redir':'http://www.douban.com', 'captcha-solution':'', 'captcha-id':'', 'source':'index_nav', } url='https://accounts.douban.com/login' #afturl為測試資料,登陸後可見 afturl='https://www.douban.com/people/172618226' #首先獲取登陸介面的驗證碼 captcha=getCaptchaUrlAndId(url) captcha_id=captcha[0] print('captcha url :%s'%captcha[1]) #驗證碼顯示及輸入 downLoadCaptcha(captcha[1]) yzm=printCaptcha() data['captcha-solution']=str(yzm) data['captcha-id']=str(captcha_id) print(data) print('驗證碼:%s'%yzm) #post請求 login=requests.post(url,data=data) loginafter=requests.get(afturl,cookies=login.cookies) #記錄內容 f=open('text.txt','wb') f.write(loginafter.content) f.close() #main為載入cookie訪問 def main(): url='https://accounts.douban.com/login' cookie=readCookie('cookies.txt') loginafter=requests.get('https://www.douban.com/people/172618226',cookies=cookie) f=open('text1.txt','wb') f.write(loginafter.content) f.close() main()