2012-12-04 98 views
6

有必要做一個搜索網站發送表單數據aspx頁面

url = r'http://www.cpso.on.ca/docsearch/' 

這是一個aspx頁面(我開始這個跋涉截至昨日,對不起,小白問題)

使用BeautifulSoup,我能得到這樣的__VIEWSTATE和__EVENTVALIDATION:

viewstate = soup.find('input', {'id' : '__VIEWSTATE'})['value'] 
    eventval = soup.find('input', {'id' : '__EVENTVALIDATION'})['value'] 

和頭可以這樣設置:

headers = {'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13', 
'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8', 
'Content-Type': 'application/x-www-form-urlencoded'} 

如果你去的網頁,唯一的價值我真的想傳遞的第一個名字和姓氏...

LN = "smith" 
    FN = "a" 
    data = {"__VIEWSTATE":viewstate,"__EVENTVALIDATION":ev, 
    "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName":LN, 
    "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtFirstName":FN} 

所以把他們放在一起的是這樣的:

import urllib 
    import urllib2 
    import urlparse 
    import BeautifulSoup 

    url = r'http://www.cpso.on.ca/docsearch/' 
    html = urllib2.urlopen(url).read() 
    soup = BeautifulSoup.BeautifulSoup(html) 

    viewstate = soup.find('input', {'id' : '__VIEWSTATE'})['value'] 
    ev = soup.find('input', {'id' : '__EVENTVALIDATION'})['value'] 
    headers = {'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13', 
     'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8', 
     'Content-Type': 'application/x-www-form-urlencoded'} 

    LN = "smith" 
    FN = "a" 
    data = {"__VIEWSTATE":viewstate,"__EVENTVALIDATION":ev, 
      "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName":LN, 
      "ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtFirstName":FN} 

    data = urllib.urlencode(data) 
    request = urllib2.Request(url,data,headers) 
    response = urllib2.urlopen(request) 
    newsoup = BeautifulSoup.BeautifulSoup(response) 
    for i in newsoup: 
     print i 

問題是,它似乎並沒有給我結果......不知道是否需要爲表單中的每個文本框提供每個值或什麼......也許我只是沒有正確地做到這一點。無論如何,只是希望有人能夠讓我平靜下來。我以爲我有,但我希望看到一個醫生名單和聯繫方式。

任何洞察力非常感謝,我以前使用過美麗,但我認爲我的問題是發送請求,並在數據部分有適量的信息。

謝謝!

+0

你會得到什麼回報? – Nasir

+0

hi @nasir,輸出只是像以前一樣解析初始URL變量...所以它並沒有給我任何有用的東西,除了在執行urllib2.request(url,data,headers)時沒有錯誤的出現。謝謝, –

+0

我做了一些沒有成功的關係。對我來說很奇怪。我嘗試通過添加所有請求頭和表單輸入來模擬整個請求。仍然沒有鎖,並且響應具有'Connection:close',但它應該有一個302代碼。我會試着看看我能否解決它。 – Nasir

回答

5

從@pguardiario了意見,去了機械化路線......簡單得多

import mechanize 

    url = r'http://www.cpso.on.ca/docsearch/' 
    request = mechanize.Request(url) 
    response = mechanize.urlopen(request) 
    forms = mechanize.ParseResponse(response, backwards_compat=False) 
    response.close() 

    form = forms[0] 

    form['ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtLastName']='Smith' 
    form['ctl00$ContentPlaceHolder1$MainContentControl1$ctl00$txtPostalCode']='K1H' 

    print mechanize.urlopen(form.click()).read() 

我是從整理很長的路要走,但是這還讓我很多東西。

+1

感謝蘭德爾。我複製了你的代碼,改變了url和form vars添加了一個「打印表單」,我在不到2分鐘的時間裏就開始運行在一個ASPX抓取項目上。爲我節省了數小時的時間。 – croc

相關問題