python模擬登陸網站
阿新 • • 發佈:2019-02-16
上次寫了一個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()