1

我对使用 Python 自动执行某些任务很感兴趣。具体来说,我想使用 Python 与网站交互以执行诸如从页面获取特定信息、发出请求(POST 数据并读取响应)以及下载和上传文件等任务。到目前为止,我只能使用 Python 从使用 urllib2 的页面获取 HTML。我尝试的下一件事是向页面发送请求;我做了几次尝试,但都失败了。

    >>> import urllib2
    >>> import urllib
    >>> url = "http://www.stackoverflow.com/"
    >>> values = {}
    >>> values["input"] = "foo"
    >>> data = urllib.urlencode(values)
    >>> request = urllib2.Request(url + "search/", data)
    >>> response = urllib2.urlopen(request)
    >>> html = response.read()
    >>> print html

到目前为止,我理解的方式是我需要创建一个包含字段名称和输入的字典,并使用 urllib.urllencode(values) 对其进行编码。然后我需要使用 urllib2.Request(theUrlReceivingTheRequest, data, headers) 发出请求,如果只给定一个 url,则只会 GET,但是,如果给定数据,将 POST,并且可以给定可以将程序伪装成Firefox 或 IE 等常用浏览器。然后我得到一个带有 urllib2.urlopen(request) 的响应,它返回一个类似对象的文件,因此我可以 read()。据我了解,我还可以使用 urllib2.build_opener() 来接收处理程序(可以处理 cookie、重定向、身份验证等)并使用 .addheaders("User-Agent", "") 添加标头。我希望最终能够做到(并理解)所有这些事情,但是,首先,我只是想提交一个表格。在我与 Python 交互会话的上述代码中,我是否遵循了正确的程序?(我试图在stackoverflow首页的搜索字段中输入搜索“foo”。)

4

2 回答 2

7

如果你使用requests而不是 urllib2,你的生活会更轻松。这是您使用请求 API 的示例:

import requests
r=requests.post("http://www.stackoverflow.com/search/",data={'input':'foo'})
print r.text
于 2012-04-27T19:58:08.180 回答
0

如果您只想使用 GET 方法获取搜索结果,您可以查看 FORM 的 html 代码: <form id="search" action="/search" method="get" autocomplete="off"> <div> <input autocomplete="off" name="q" class="textbox" placeholder="search" tabindex="1" type="text" maxlength="140" size="28" value="foo" style="width: 200px; max-width: 200px; "> </div> </form>

操作是“/search”,输入名称是“q”,所以请求 url 将是https://stackoverflow.com/search?q=foo

所以只要使用 urllib2 打开上面的 url 就可以了。

您无需担心像“用户代理”这样的请求标头,因为 urllib2 会为您添加它,但是,您可以显式设置它

要让它工作,你需要将“input”改为“q”并且不要在请求中使用“data”参数,否则会使用GET以外的POST,程序将是:

import urllib2
import urllib
url = "http://www.stackoverflow.com/"
values = {}
values["q"] = "foo"
data = urllib.urlencode(values)
request = urllib2.Request(url + "search" +"?"+ data)
response = urllib2.urlopen(request)
html = response.read()
print html

enter code here
于 2012-04-26T23:38:00.037 回答