天天看點

requests子產品進行人人網模拟登陸

今天代碼是對對人人網進行模拟登入

  • 點選登入按鈕之後會發起一個POST請求
  • POST請求中會攜帶登陸之前錄入的登陸資訊(使用者名,密碼,驗證碼。。。)
  • 驗證碼特性:每次都會動态變化
  • print(response.status_code),檢視相應狀态碼,如果是200,說明模拟登陸成功
  • 如果出錯一定是url和攜帶的參數出錯

第二點問題就是當我們直接通路使用者個人中心時會發現通路後頁面是登陸頁面,而不能直接通路到個人首頁頁面資料,原因如下:

- 發起的第二次基于個人首頁頁面請求的時候,伺服器端并不知道該請求是基于登入狀态下的請求。

這時候就要用到Cookie。

  • cookie:本質作用就是用來讓伺服器端記錄用戶端的相關狀态。
    • 手動處理:通過抓包工具擷取其值,并封裝到headers中。(通用性不強)
    • 自動處理:
      • Cookie值的來源是哪裡?
        • 模拟登陸POST請求後,由伺服器端建立的。
      • session會話對象:
        • 作用:1.可以進行請求的發送。

          2.如果請求過程中産生了Cookie,則該Cookie會被自動存儲/攜帶在該session對象中。

cookie操作方法:

1.建立一個session對象:session = requests.Session()

2.使用session對象進行模拟登入POST請求的發送(cookie會被存儲在session中)

3.session對象對個人首頁對應的get請求進行發送(攜帶了cookie)

上代碼

import  requests
from lxml import etree
from hashlib import md5
#超級鷹示例代碼
class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode('utf-8')
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
        }
        self.headers = {
            'Connection': 'Keep-Alive',
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
        }

    def PostPic(self, im, codetype):
        """
        im: 圖檔位元組
        codetype: 題目類型 參考 http://www.chaojiying.com/price.html
        """
        params = {
            'codetype': codetype,
        }
        params.update(self.base_params)
        files = {'userfile': ('ccc.jpg', im)}
        r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:報錯題目的圖檔ID
        """
        params = {
            'id': im_id,
        }
        params.update(self.base_params)
        r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
        return r.json()
#建立Session對象
session = requests.Session()
#擷取資料
headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'
    }
url = 'http://www.renren.com/SysHome.do'
page_text = requests.get(url=url,headers=headers).text
#執行個體化解析資料,擷取相應的驗證碼圖檔
tree = etree.HTML(page_text)
code_img_src = tree.xpath('//*[@id="verifyPic_login"]/@src')[0]
code_img_data= requests.get(url=code_img_src,headers=headers).content
with open('./codedata.jpg','wb') as fp:
    fp.write(code_img_data)
#使用超級鷹的示例代碼對驗證碼進行識别
if __name__ == '__main__':
	chaojiying = Chaojiying_Client('a1372431588', '970110yy', '905384')	#使用者中心>>軟體ID 生成一個替換 96001
	im = open('codedata.jpg', 'rb').read()													#本地圖檔檔案路徑 來替換 a.jpg
	a =chaojiying.PostPic(im, 1902)
	print(a)
#post請求的發送(模拟登陸)
login_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=20204110256'
data = {
    'email': '18234504765',
    'icode': a,
    'origURL':'http://www.renren.com/home',
    'domain': 'renren.com',
    'key_id': '1',
    'captcha_type': 'web_login',
    'password': '97ea2d9e82a391b42e834975b7a8d552db313437c3646e6b473fe5ab845e858e',
    'rkey': '3f674e5c4940658971a514b5bdb19571',
    'f': 'http%3A%2F%2Fwww.renren.com%2F974497470',
}
#利用下述可以檢視響應狀态碼,如果是200,說明模拟登陸成功,檢視狀态碼是一種通用方式
#使用session進行post請求的發送
response =session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
#爬取目前使用者個人首頁對應的頁面資料
detail_url = 'http://www.renren.com/974497470/profile'
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('yonghu.html','w',encoding='utf-8')  as fp:
    fp.write(detail_page_text)
           

代碼中都有詳細注釋。

運作結果狀态碼為200,模拟登陸成功。