使用Python的urllib2向网页发送请求

时间:2012-04-26 23:12:04

标签: python urllib2

我对使用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)得到一个响应,它返回一个像object这样的文件,因此我可以读取()。据我所知,我也可以使用urllib2.build_opener(),它可以接收处理程序(可以处理cookie,redirrections,身份验证等)并使用.addheaders(“User-Agent”,“”)添加标题。我希望能够最终做到(并理解)所有这些事情,但是,首先,我只想提交一份表格。 在我与Python交互式会话的上述代码中,我是否遵循了正确的程序? (我试图在stackoverflow的首页上的搜索字段中输入“foo”搜索。)

2 个答案:

答案 0 :(得分:6)

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

import requests
r=requests.post("http://www.stackoverflow.com/search/",data={'input':'foo'})
print r.text

答案 1 :(得分: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>

操作是“/搜索”输入名称为“q”,因此请求网址为https://stackoverflow.com/search?q=foo

所以只需使用urllib2打开上面的url即可。

您无需担心像“用户代理”这样的请求标头,因为urllib2会为您添加,但是,您可以set it explicitly

要使其正常工作,您需要将“输入”更改为“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