【问题标题】:Sending form data to aspx page将表单数据发送到 aspx 页面
【发布时间】:2012-12-04 13:12:08
【问题描述】:

需要在网站上进行搜索

    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']

并且header可以这样设置:

    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

问题是它似乎并没有真正给我结果...不知道我是否需要为表单中的每个文本框提供每个值或什么...也许我只是做得不正确.无论如何,只是希望有人可以让我直截了当。我以为我有,但我希望看到医生名单和联系信息。

非常感谢任何见解,我以前使用过 beautifulsoup,但我认为我的问题只是发送请求并在数据部分中包含适量的信息。

谢谢!

【问题讨论】:

  • 嗨@nasir,输出只是像以前一样解析初始URL变量的beautifulsoup......所以除了在执行urllib2.request(url,数据,标题)片...谢谢,
  • 我做了一些没有成功的关系。对我来说很奇怪。我尝试通过添加所有请求标头和表单输入来模拟整个请求。仍然没有锁定,响应有 Connection: close 但它应该有一个 302 代码。我会试试看能不能解决。
  • 使用 mechanize 可能会有更好的运气。
  • 感谢您调查它@Nasir
  • @That1Guy 不,我没有收到错误,我只是没有通过输入值并单击搜索按钮获得预期的结果。

标签: python screen-scraping urllib2


【解决方案1】:

听取了@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()

我距离完成还有很长的路要走,但这让我更进一步。

【讨论】:

  • 谢谢兰德尔。我复制了您的代码,更改了 url,并且表单变量添加了一个“打印表单”,并且我在不到 2 分钟的时间内启动并运行了一个 ASPX 抓取项目。节省了我几个小时的闲逛时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2014-01-18
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多