requests模擬登陸京東(2017-10-1)

requests模擬登陸京東

環境:python 3.6.1 | requests 2.18.4 | lxml 4.0.0 | pillow 4.2.1
時間:2017-10-1 可用

-

以前在一次京東秒殺活動中使用selenium模擬登陸過京東,但最後沒搶到,不知是運氣不佳還是selenium太慢,這次用requests不知能否成功,以下只是模擬登陸的具體思路和代碼。

模擬登陸三個要點:目標網址(是否需要構造)、post數據(包含驗證信息)、頭部信息

一、思路

模擬登陸大致模式分三個步驟
1、試探
打開瀏覽器調試工具(我用的是Firefox+chrome),在登陸頁面輸入賬號、密碼時故意輸錯,查看提交了那些數據,如下圖
這裏寫圖片描述
在紅色方框裏的就是我們要提交的數據,注意前面的字段,這些我們基本都可以從源文件裏提取出來。
2、準備數據(post參數)
我們可以把提取出的數據加到請求裏,這裏我們要注意提交的網址,在網址後面大部分都要加參數的,這時我們就要分析再構造了;如果有驗證碼的話還要進行驗證碼圖片的提取,這也是個坑,
這裏寫圖片描述
這裏我們可以利用調試工具查看驗證碼圖片地址,對我們分析很有幫助的。
3、嘗試登陸,如果沒成功就檢查前面的數據是否正確

二、下面上代碼

python
# _*_coding:utf-8 _*_
__author__ = 'leiyang'
__date__ = '2017-10-1 8:54'

# 模擬登陸京東
import requests
from lxml import etree
import json
import time
from PIL import Image

s = requests.Session()

headers = {
    'Host':'passport.jd.com',
    'X-Requested-With':'XMLHttpRequest',
    'Content-Type':'application/x-www-form-urlencoded; charset=utf-8',
    'Connection':'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
}
#先獲取登陸頁面,從中提取出post參數
page = s.get("https://passport.jd.com/new/login.aspx", headers=headers).text
html = etree.HTML(page)
uuid = html.xpath("//input[@id='uuid']/@value")[0]
eid = html.xpath("//input[@id='eid']/@value")[0]
fp = html.xpath("//input[@id='sessionId']/@value")[0]
_t = html.xpath("//input[@id='token']/@value")[0]
loginType = html.xpath("//input[@id='loginType']/@value")[0]
pubKey = html.xpath("//input[@id='pubKey']/@value")[0]
sa_token = html.xpath("//input[@id='sa_token']/@value")[0]

# 獲取驗證碼圖片
img_url = "https://authcode.jd.com/verify/image?a=1&acid=" + str(uuid) + "&uid=" + str(uuid) + "&yys=" + str(
    int(time.time() * 1000))
img_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100Safari/537.36',
    'Host': 'authcode.jd.com',
    'Accept': '*/*',
    'Cookie': '__jdu=1680020371',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'Referer': 'https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com'
}
re = s.get(img_url, headers=img_headers )
with open("d://jingdong_img.jpeg", "wb") as f:
    f.write(re.content)

# 如果你想讓驗證碼自動彈出來就把下面2行的註釋去掉
# im = Image.open("d://jingdong_img.jpeg")
# im.show()

verify_code = input("輸入驗證碼:")

#把上面我們準備的數據填充到字典裏
data = {
    'uuid': uuid,
    'eid': eid,
    'fp': fp,
    'loginname':'[填入你的賬號名稱]',
    '_t': _t,
    'loginType': loginType,
    'nloginpwd': '[你的密碼]',
    'pubKey': pubKey,
    'sa_token': sa_token,
    'chkRememberMe': '',
    'authcode': verify_code,
}
post_url = "https://passport.jd.com/uc/loginService?uuid=" + str(
    uuid)+"&r=0.6335209684602039&version=2015"
r = s.post(post_url, headers=headers, data=data)
print(r.text)#如果出現'success'字樣,就算成功了。

g=s.get("http://home.jd.com")
print(g.text)#進入個人中心,驗證是否成功。

至此模擬登陸京東完畢,總結一下要注意的點

  1. 驗證碼地址和登陸提交地址都需要構造
  2. 獲取驗證碼的頭部信息與登陸提交時的頭部信息不同
  3. Firebox調試工具是個好用且方便的利器,熟練使用可以更快的分析

由於需要手動輸入驗證碼,如果要秒殺的話肯定來不及,我的思路是提前5分鐘讓程序先跑起來,在程序中加定時time.sleep(time),time等於秒殺時間減去當前時間。ok!但願我有一個好運氣,搶到一些什麼,方不辜負我這一整天的心血。2017-10-1。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章