2016-08-03 96 views
1

我知道有很多關於如何做到這一點的線程和視頻,我已經通過了他們,需要一點先進的指導。使用請求張貼登錄到本網站無法使用

我想登錄到這個網頁,我有一個帳戶,所以我可以發送請求下載報告。
首先我發送get請求到登錄頁面,然後發送post請求,但當我print(resp.content)時,我得到代碼返回登錄頁面。我確實得到了一個代碼[200],但我無法進入索引頁面。無論我嘗試get什麼頁面後門柱它讓我重定向回到登錄頁面

這裏有幾件事情我不知道,如果我做了正確的:

  • 對於頭我只是把我檢查頁面時列出的所有東西放在一起
  • 不知道我是否需要對cookie做些什麼?

下面是我的代碼:

import requests 
import urllib.parse 

url = 'https://myurl.com/login.php' 
next_url = 'https://myurl.com/index.php' 
username = 'myuser' 
password = 'mypw' 
headers =  { 
    'Host': 'url.myurl.com', 
    'Connection': 'keep-alive', 
    'Content-Length': '127', 
    'Cache-Control': 'max-age=0', 
    'Origin': 'https://url.myurl.com', 
    'Upgrade-Insecure-Requests': '1', 
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
    'Referer': 'https://url.myurl.com/login.php?redirect=1', 
    'Accept-Encoding': 'gzip, deflate, br', 
    'Accept-Language': 'en-US,en;q=0.8', 
    'Cookie': 'PHPSESSID=3rgtou3h0tpjfts77kuho4nnm3' 
        } 
login_payload = { 
    'XXX_login_name': username, 
    'XXX_login_password': password, 
        } 
login_payload = urllib.parse.urlencode(login_payload) 

     r = requests.Session() 
     r.get(url, headers = headers) 
     r.post(url, headers = headers, data = login_payload) 
resp = r.get(next_url, headers = headers) 
print(resp.content) 
+1

你能分享實際的網址是什麼?我會從你的標題中刪除cookie,並讓請求在初始請求中設置cookie,如果需要的話 –

+0

這裏是實際的鏈接'https:// eym.sicomasp.com/login.php'謝謝! –

回答

2

你並不需要發送授權文件下載單獨的請求。您需要通過指定憑證發送單個POST。在大多數情況下,您也不需要發送標題。在常見的代碼應該看起來像如下:

from requests.auth import HTTPBasicAuth 

url_to_download = "http://some_site/download?id=100500" 
response = requests.post(url_to_download, auth=HTTPBasicAuth('your_login', 'your_password')) 
with open('C:\\path\\to\\save\\file', 'w') as my_file: 
    my_file.write(response.content) 
+0

你能幫忙解釋一下嗎?當我通過瀏覽器執行此操作時,首先我需要登錄到該網站,然後我需要轉到另一個頁面,在該頁面中輸入日期範圍和格式等數據以導出報告。如果我需要爲每個帖子單獨填寫表格數據,那麼如何在一個「帖子」中完成? –

+1

我希望創建一個會話,讓我登錄,記住我已登錄,並允許我發送請求到導出報告的頁面。如果我現在發送請求,我所得到的僅僅是登錄頁面的html代碼,就像它將它重定向到那裏一樣。 –

+0

我想應該把日期,報告格式和其他相關數據作爲'data'添加到你的POST中。類似於'data = {'date':'17 -Jul-16','format':'txt',...}'。您應該嘗試手動下載文件,並通過開發人員工具(F12) - >網絡檢查您的POST詳細信息。也可以將這些數據指定爲下載'URL'中的參數,例如'http:// some_site/download?id = 100500&date = 17-Jul-16&format = txt ...' – Andersson

1

有表單數據的幾個領域發佈:

import requests 
data = {"redirect": "1", 
     "XXX_login_name": "your_username", 
     "XXX_login_password": "your_password", 
     "XXX_actionSUBMITLOGIN": "Login", 
     "XXX_login_php": "1"} 

with requests.Session() as s: 
    s.headers.update({"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36"}) 
    r1 = s.get("https://eym.sicomasp.com/login.php") 
    s.headers["cookie"] = r1.headers["Set-Cookie"] 
    pst = s.post("https://eym.sicomasp.com/login.php", data=data) 
    print(pst.history) 

您可能會重定向到崗位後自動的index.php,你可以檢查r1.historyr1.content以查看到底發生了什麼。

+0

感謝您的回答,我會盡量和查看歷史記錄,看看我所得到的。我曾嘗試發佈額外的表單數據,但它沒有奏效。我想我正在搞不同的選擇,忘記包括那些,但我已經嘗試過。 –

+0

我不知道,如果它的問題,但我使用招進行調試,並能夠發送'POST'請求​​,併成功登錄後返回的索引頁,但我不能在Python重建。我想我應該重定向到index.php,但我不認爲我登錄成功,因此它將我重定向回登錄名。 (我已經確定我的用戶名和PW是正確的) –

+0

@SenorPenguin,運行編輯的代碼,並添加什麼.history中返回 –

1

所以我想出了我的問題是什麼,以防萬一未來有同樣的問題。我確信不同的網站有不同的要求,但在這種情況下,我在請求標頭中發送的Cookie:阻止了它。我所做的就是在登錄後在頭文件中抓取我的cookie。我更新了頭文件,然後發送了請求。這是結束了工作:

(還需要表單數據以HTML格式編碼)

import requests 
import urllib.parse 

headers = { 
    'Host' : 'eym.sicomasp.com', 
    'Content-Length' : '62', 
    'Origin' : 'https://eym.sicomasp.com', 
    'Upgrade-Insecure-Requests' : '1', 
    'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36', 
    'Referer' : 'https://eym.sicomasp.com/login.php?redirect=1', 
    'Cookie' : 'PHPSESSID=vdn4er761ash4sb765ud7jakl0; SICOMUSER=31+147234553' 
      } #Additional cookie information after logging in ^^^^ 
data = { 
    'XXX_login_name': 'myuser', 
    'XXX_login_password': 'mypw', 
      } 
data = urllib.parse.urlencode(data) 

with requests.Session() as s: 
    s.headers.update(headers) 
    resp = s.post('https://eym.sicomasp.com/index.php', data=data2) 
    print(resp.content)