2012-12-04 73 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

相关问题