2017-05-17 46 views
2

我試圖在使用以下代碼發佈數據到窗體上後廢棄一個網頁。POST_DATA後沒有報廢響應頁面 - 美麗的湯姆和Python

import bs4 as bs 
    import urllib.request 
    import requests 
    import webbrowser 
    import urllib.parse 

    url_for_parse = "http://demo.testfire.net/feedback.aspx" 
    #PARSE THE WEBPAGE 
    sauce = urllib.request.urlopen(url_for_parse).read() 
    soup = bs.BeautifulSoup(sauce,"html.parser") 

    #GET FORM ATTRIBUTES 
    form = soup.find('form') 
    action_value = form.get('action') 
    method_value = form.get('method') 
    id_value = form.get('id') 

    #POST DATA 
    payload = {'txtSearch':'HELLOWORLD'} 
    r = requests.post(url_for_parse, payload) 

    #PARSING ACTION VALUE WITH URL 
    url2 = urllib.parse.urljoin(url_for_parse,action_value) 

    #READ RESPONSE 
    response = urllib.request.urlopen(url2) 
    page_source = response.read() 
    with open("results.html", "w") as f: 
     f.write(str(page_source)) 

    searchfile = open("results.html", "r") 
    for line in searchfile: 
     if "HELLOWORLD" in line: 
      print ("STRING FOUND") 
     else: 
      print ("STRING NOT FOUND") 
    searchfile.close() 

代碼是正確的。該響應網頁已成功報廢並存儲在results.html中。

但是,我想在post_data執行後取消網頁。因爲每次運行代碼,我都會得到結果:未找到字符串。這意味着在執行post_data之前抓取生成的頁面。

如何修改代碼,例如表單已成功提交,然後源代碼存儲在本地文件中。

對於上述過程,建議替代框架而不是美麗腳本嗎?

回答

3

這很明顯,你在做什麼。

1) You are posting some data to a URL 
2) Scrapping the same URL. 
3) Check for some "String" 

但是你應該怎麼做。

​​

爲此,你需要寫r.content本地文件和搜索字符串

修改這樣的代碼:

payload = {'txtSearch':'HELLOWORLD'} 
url2 = urllib.parse.urljoin(url_for_parse,action_value) 
r = requests.post(url2, auth = {"USERNAME", "PASSWORD"}, payload) 

    with open("results.html", "w") as f: 
     f.write(str(r.content)) 

//Then continue searching for a String. 

注意:您需要發送的有效載荷到url2而不是最初的URL(url_for_parse)

0

在您的requests.post調用後返回的響應將是您想要通過的HTML。您可以通過執行

r.content 

然而,我的這個測試訪問它,它說,我沒有驗證,所以我想你已經驗證?

我還建議完全使用請求,而不是使用urllib進行GET和請求POST。

+0

我之前已經試過r.content上面的代碼。所述r.content片段去如下: #POST DATA 有效載荷= { 'txtSearch': 'HELLOWORLD'} R = requests.post(url_for_parse,有效載荷) 張開( 「results.html」, 「W」 )作爲f: f.write(str(r.content)) 但是,找不到相同的字符串結果是輸出。 –

+0

也許這將有助於通過您發佈的頁面進行視覺分析。當我嘗試POST到頁面時,它告訴我我沒有通過身份驗證。你有嗎? – panatale1

0

在您的請求中保留會話參數可能是一個好主意。

http://docs.python-requests.org/en/master/user/advanced/#session-objects

import requests 

proxies = { 
    "http": "", 
    "https": "", 
} 

headers = { 
     'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' 
} 

data = {'item':'content'} 
## not that you need basic auth but its simple to toss in requests 
auth = requests.auth.HTTPBasicAuth('[email protected]', 'not_a_real_password') 
s = requests.session() 
s.headers.update(headers) 
s.proxies.update(proxies) 
response = s.post(url=url, data=data, auth=auth) 

這個鍵位真的是你所調用,然後等待

<form name="cmt" method="post" action="comment.aspx"> 

這只是一個帖子http://demo.testfire.net/comment.aspx