2016-12-02 114 views
0

我正在使用python抓取我學校的網頁,但爲了做到這一點,我需要首先模擬用戶登錄。這裏是我的代碼:需要用戶登錄的python抓取學校網頁

import requests, lxml.html 
s = requests.session() 

url = "https://my.emich.edu" 

login = s.get(url) 

login_html = lxml.html.fromstring(login.text) 
hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]') 
form = {x.attrib["name"]:x.attrib["value"] for x in hidden_inputs} 
form["username"] = "myusernamge" 
form["password"] = "mypassword" 
form["submit"] = "LOGIN" 

response = s.post("https://netid.emich.edu/cas/loginservice=https%3A%2F%2Fmy.emich.edu%2Fc%2Fportal%2Flogin",form) 
response = s.get("http://my.emich.edu") 

f = open("result.html","w") 
f.write(response.text) 

print response.text 

我期待那response.text會給我我自己的學生賬戶頁面,而不是它給了我一個登錄頁面的要求。任何人都可以幫助我解決這個問題嗎? 順便說一句,這不是作業

+0

您可以將您所做的請求與您的瀏覽器執行的實際請求進行比較嗎?你錯過了任何表單域? –

+0

@paradox如果您在成功發佈後再次請求主頁,會發生什麼情況?你怎麼知道你的帖子是成功的? – David542

+0

@paradox - 另外,是不是後網址https://my.emich.edu/c/portal/login? – David542

回答

1

這裏有幾個選項,我認爲你的請求方法可以通過手動登錄和複製標題變得更容易。

  1. 使用python腳本包如http://wwwsearch.sourceforge.net/mechanize/來刮取網站。
  2. 使用瀏覽器模擬器,如http://casperjs.org/。使用這個,你基本上可以做任何你能夠在瀏覽器中做的事情。
  3. 我的建議是前往網站,登錄,然後打開開發者控制檯,並將這些標頭/ cookie複製到您的請求標頭/ cookie中。這樣你就可以硬編碼'已經認證的請求',它會正常工作。請注意,此方法對於進行健壯的日常抓取來說是最不可靠的,但是如果您正在尋找最快實施的內容並且在驗證用完之前一直運行,請使用此方法。

另外,成功完成該職位後,您還需要登錄的主頁(再次)。

+0

我試過機械化,但它仍然沒有給我預期的結果 – paradox