1

我目前是 HTTP 解析的新手,我正在使用 python 在 HTTP 中发送和接收请求。我只是有一个小问题,因为我在发送请求时处理的网站不仅需要 Headers 和 POST。当我单击网页上的按钮时,会执行一个 JavaScript 代码,告诉服务器响应我即将到来的请求。

因此,如果我通常打开具有相同标题和 POST 请求的页面,它只会以普通 GET 方式打开它,并且不会读取我在 POST 中提供的任何数据。

我的代码:

import cookielib
import urllib
import urllib2




# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting'),
                     ('Cookie', '')
                     ]


urllib2.install_opener(opener)

# The action/ target from the form
authentication_url = 'http://plapal.pla/Search.aspx'

# Input parameters we are going to send
payload = {
  '_EVENTTARGET': 'btnSearch',
  '_VIEWSTATE': 'plapla',
  'ctl04%24ddNavigate': 'plapla',
  'chkDate': 'on',
  '_EVENTARGUMENT': '',
  '_LASTFOCUS': '',
  'txtResvCode': '',
  'txtCustName': '',
  'txtFromDate': '27%2F01%2F2013',
  'txtToDate': '27%2F09%2F2013',
  'ddSearchType': '1',
  'ddChannel': '-1',
  'ddNetGross': 'NET'
  }

# Use urllib to encode the payload
data = urllib.urlencode(payload)

# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)

# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()

print contents

但它不起作用。当我将搜索按钮悬停在网页中时,我得到:

javascript:WebForm_DoPostBackWithOptions(new%20WebForm_PostBackOptions("btnSearch",%20"",%20true,%20"",%20"",%20false,%20true))

那么如何执行这个 JS 以便我可以实际输入我的帖子数据。

4

1 回答 1

3

在无头浏览器中使用 JavaScript

如果您需要执行 JavaScript,如果您有可用的 JavaScript 引擎会更容易。

而不是 Python,我会考虑使用无头浏览器,例如PhantomJS。然后你可以抓取页面并执行你需要的任何 JavaScript,或者运行你自己的 JS 或者来自页面本身的代码。

PhantomJS的示例页面在页面自动化部分有几个示例,可能与您需要的类似。

看起来您想在页面中运行现有功能:WebForm_DoPostBackWithOptions(). 因此,我将看一下将脚本注入页面的injectme.js示例。然后,该脚本可以依次调用您想要的页面中的任何函数。

或者取决于你在做什么,使用 PhantomJS 可能有一种更简单的方法。他们有很多很好的例子和文档可供浏览。

使用 Python 和 JavaScript 调试器

当然,您可能实际上不需要直接执行WebForm_DoPostBackWithOptions()函数。从名字上看,这听起来很可能是一个相当简单的 JavaScript 函数。您是否在 Web 浏览器中手动与页面交互时查看了它的代码并对其进行了跟踪?跟踪代码应该可以很容易地看到函数的真正作用。(如果您在 Chrome 开发人员工具中执行此操作并发现代码因为已“缩小”而无法读取,请使用该{}按钮将其打印出来。)

或者切入正题,任何浏览器调试器中的“网络”选项卡或等效项都应该让您准确查看POST该函数生成的请求。然后你可以在你的 Python 代码中做同样的事情。

如果您不熟悉当前浏览器中的开发人员工具,那么您将大有收获:这些天它们真的很棒。我喜欢 Chrome 中内置的那个,但 Firebug(用于 Firefox)和 Internet Explorer 工具也很出色。

于 2013-09-29T19:40:24.940 回答