【问题标题】:Sending requests to webpages using Python's urllib2使用 Python urllib2 向网页发送请求
【发布时间】:2012-05-07 17:35:47
【问题描述】:

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

【问题讨论】:

  • 什么特别不适合你?你有错误吗?

标签: python urllib2


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果你只想使用 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 会为您添加,但是您可以 set it explicitly

    要使其生效,需要将“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
    

    【讨论】:

    • 所以,如果我理解正确,我必须查看页面的源代码并找到“
      example/<action>?<encodeddata>。对吗?
    • 如果是登录页面,我需要发送用户名和密码怎么办?我是否不必使用 POST 发送实际请求,或者如果我需要填写返回数据的表单怎么办? (我什至见过一些页面的表单返回结果而不更改实际页面的 url,我如何使用 Python 访问这些站点?)
    • 是的,你是对的,检查表格中的“方法”。通常搜索将使用 GET,登录将使用 POST。对于 POST 请求,使用urllib2.Request(url, data),urllib2 会将“数据”发布到 url 处理程序。
    • 好的,我遇到了问题。对数据进行编码并使用 action/?key=item 将其附加到 URL 的末尾,可以填写字段;但是,该表格仍未提交。我是否需要包括一些额外的东西才能提交。该标签类似于 。所以它的类型是submit,它的名字是form。我是否需要在末尾添加类似 &form=submit 的内容?我试过了还是没有提交?谢谢。
    • 你能提供更多的表格细节吗?或者只是通过表单的 html 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多