今天,學習了模擬登錄新浪微博。模擬登錄主要有兩種方式,一、利用Cookie;二、模仿瀏覽器的請求,發送表單。
法一:
Cookie:指某些網站為了辨別用戶身份而儲存在用戶本地終端上的數據(通常經過加密)。當登錄一個網站時,網站往往會要求用戶輸入用戶名和密碼,並且用戶可以勾選“下次自動登錄”。如果勾選了,那么下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登錄了。這正是因為前一次登錄時,服務器發送了包含登錄憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登錄時,(如果該Cookie尚未到期)瀏覽器會發送該Cookie,服務器驗證憑據,於是不必輸入用戶名和密碼就讓用戶登錄了。
代碼格式如下:
cookie = {'Cookie' : ''}
html = requests.get(url,cookies=cookie)
法二:
通過模擬瀏覽器請求的方式來模擬登錄微博。
1、先手動登錄微博,推薦移動端(PC端用戶名和密碼都進行了極其復雜的加密,不推薦)

發現表單中‘password_xxxx,vk,capId’是不知道的,那就要通過分析原始登陸界面來獲取了。


現將它們提交表單即可,代碼如下:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = 'ziv·chan' 4 5 from lxml import etree 6 from PIL import Image 7 import requests 8 import re 9 10 11 user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36' 12 referer = 'http://login.weibo.cn/login/?ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=' 13 14 headers = { 15 'User-Agent' : user_agent, 16 'Host' : 'login.weibo.cn', 17 'Origin' : 'http://login.weibo.cn', 18 'Referer' : referer 19 } 20 21 session = requests.session() 22 23 # 注意URL的選擇 24 url = 'https://login.weibo.cn/login/' 25 html = session.get(url,headers=headers) 26 pageCode = html.text 27 pattern = re.compile('password" name="(.*?)".*?name="vk" value="(.*?)".*?"capId" value="(.*?)"',re.S) 28 items = re.findall(pattern,pageCode)[0] 29 password,vk,capId = items 30 # 上面就依次獲得了password_xxxx,vk,capId 31 32 cap_url = 'http://weibo.cn/interface/f/ttt/captcha/show.php?cpt=' + items[2] 33 captcha = session.get(cap_url,headers=headers) 34 with open('cap.png','wb') as f: 35 f.write(captcha.content) 36 f.close() 37 im = Image.open('cap.png') 38 im.show() 39 im.close 40 cap_code = raw_input('請輸入驗證碼:') 41 42 43 form_data = { 44 'mobile' : '18362972928', 45 password : 'ChelseaFC.1', 46 'code' : cap_code, 47 'remember' : 'on', 48 'backURL' : 'http%3A%2F%2Fweibo.cn%2F', 49 'backTitle' : '微博', 50 'tryCount' : '', 51 'vk' : vk, 52 'capId' : capId, 53 'submit' : '登錄' 54 } 55 56 57 58 session.post(url,data=form_data,headers=headers) 59 60 url_logined = 'http://weibo.cn/' 61 html_2 = session.get(url_logined) 62 html_2.encoding = 'utf-8' 63 pageCode_2 = html_2.content 64 Selector = etree.HTML(pageCode_2) 65 content = Selector.xpath('//span[@class="ctt"]') 66 for each in content: 67 text = each.xpath('string(.)') 68 print text
以上。
