zoukankan      html  css  js  c++  java
  • 爬虫第四节 http协议请求


    # http协议请求
    # 如果进行客户端与服务器之间的信息传递,我们0可以用HTTP协议请求进行
    # 对于HTTP请求 主要分六种类型,各类型的作用如下
    """
    1) GET请求:GET请求会通过URL网址传递信息,可以直接在URL中写上要传递的 信息,
    也可以由表单进行传递。如果使用表单进行传递,这表单中的信息会自动转为URL地址中的数据,
    通过URL地址传递。
    2)POST请求:可以向服务器提交数据,是一种比较主流也比较安全的数据传递方式,
    比如在登录时,经常使用POST请求发送数据。
    3)PUT请求:请求服务器存储一个资源,通常要指定存储的位置。
    4)DELETE请求:请求服务器删除一个资源。
    5 ) HEAD请求:请求获取对应的HTTP报头信息。
    6) OPTIONS请求:可以获得当前URL所支持的请求类型。


    """


    #(1)get请求
    # https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1
    # &tn=48021271_15_hao_pg&wd=hello&fenlei=256
    # 可以发现,对应的査询信息是通过URL传递的,这里说采用的是HTTP请求中 的GET方法,
    # 我们将该网址提取出来就行分析,
    # 该网址为:https://www.baidu.com/ s?ie=utf8&wd=hello&tn=87048150_dg,
    # 字段ie的值为utf8,代表的是编码信息,而字段wd 为hello
    # ,所以字段wd应该存储的就是用户带检索的关键词。根 据我们的猜测,简化一下该网址,
    # 可以简化为:https://www.baidu.com/s?wd=hello,
    # 此时只 包含了对应的wd字段,即待检索关键词字段,将该网址复制到浏览器中,刷新一下,
    # 发现 该网址也能够出现关键词为“hello”的搜索结果。
    # 由此可见,我们在百度上査询一个关键词时,会使用GET请求进行,
    # 其中关键性字段是wd,网址的格式是:"https://www.baidu.com/ s?wd=关键词"
    # 实际案例
    import urllib.request

    keywd = "hello"
    url = "http://www.baidu.com/s?wd=" + keywd
    req = urllib.request.Request(url)
    data = urllib.request.urlopen(req).read()
    fhandle = open("G:python爬虫精通Python网络爬虫源码书中源码/2.html", "wb")
    fhandle.write(data)
    fhandle.close()
    # 接下来,我们将详细分析一下上面的代码。首先定义要査询的关键词,并赋 给keywd变量,
    # 然后按照分析出来的URL格式,构造了对应的URL并赋值给对应的url变 量,
    # 随后,使用urllib.request.Request()构建了一个Request对象并赋给变量req,
    # 通过urllib. request.urlopen()打开对应的Request对象,
    # 此时,由于网址中包含了 GET请求信息,所以会 以GET请求的方式获取该页面,
    # 随后读取该页面的内容并赋值给data变量,
    # 再将爬取到的 内容写入"G:python爬虫精通Python网络爬虫源码书中源码/2.html”网页文件中。


    # 第二
    # 注意
    # 上面的代码有不完善的地方,如果我们要检索的关键词是中文,
    # 如“韦玮老师”,若还 以上面的代码去执行,则会出现如下错误。
    # UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-13:
    # ordinal not in range(128)

    import urllib.request

    url = "http://www.baidu.com/s?wd="
    key = "爬虫"
    key_code = urllib.request.quote(key)
    url_all = url + key_code
    req = urllib.request.Request(url_all)
    data = urllib.request.urlopen(req).read()
    fh = open("G:python爬虫精通Python网络爬虫源码书中源码/3.html", "wb")
    fh.write(data)
    fh.close()

    """
    通过以上实例我们可以知道,如果要使用GET请求,思路如下:
    1 )构建对应的URL地址,该URL地址包含GET请求的字段名和字段内容等信息,并
    且URL地址满足GET请求的格式,即“http://网址?字段名1=字段内容1&字段名2=字 段内容2”。
    2)以对应的URL为参数,构建Request对象。
    3 )通过urlopen()打开构建的Request对象。
    4)按需求进行后续的处理操作,比如读取网页的内容、将内容写入文件等。
    以上,我们为大家通过实例讲解了爬虫中如何使用GET请求,并总结了爬虫中使用 GET请求的基本步骤和思路。
    """

    # (2)POST请求
    # 我们在进行注册、登录等操作的时候,基本上都会遇到POST请求,
    # 接下来通过实例来分析如何通过爬虫来实现POST请求。
    # 由于登录需要用到Cookie的知识,所以关于如何登录这一块的内容,学完了 Cookie的知识之后,
    # 再为大家详细介绍,在此,我们仅需要知道如何使用爬虫通过 POST表单传递信息即可。

    # POST表单的测试网页,供学习时做测试使用,
    # 网址为: http://www.iqianyue.com/mypost/打开对应网址,发现有一个表单
    """

    姓名:【___________】

    密码:【___________】

    【单击提交】

    """


    # 那么怎样通过爬虫自动实现这个传递过程呢?
    # 因为这里所采用的传递方法是POST方法,所以如果要使用爬虫自动实现,我们要构造 POST请求,
    # 实现的思路如下:
    # 1)设置好URL网址。
    # 2)构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理。
    # 3)创建Request对象,参数包括URL地址和要传递的数据。
    # 4)使用add_header()添加头信息,模拟浏览器进行爬取。
    # 5 )使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递。
    # 6)后续处理,比如读取网页内容、将内容写入文件等。

    # 首先,需要设置好对应的URL地址,分析该网页,在单击提交之后,会传递到当前面进行处理,
    # 所以处理的页面应该是http://www.iqianyue.com/mypost/,
    # 所以,URL应该设置为 http://www.iqianyue.com/mypost/"
    # 然后我们需要构建表单数据,在该网页上右击“査看页面源代码”,找到对应的form表单部分,

    # 可以发现,表单中的姓名对应的输入框中,name属性值为“name”,密码对应的输入框中,name属性值为“pass”,
    # 所以,我们单位构造的数据中会包含两个字段,字段名分别是 “name”、“pass”,
    # 字段值设置为对应的我们要传递的值。
    # 格式为字典形式,即:
    # {字段名1:字段值1,字段名2:字段值2,-}
    # 所以,我们要构造的数据可以为("name":"ceo@iqianyue.com", "pass":"aA123456"},
    # 将要传递的姓名设置为**ceo@iqianyue.com",要传递的密码设置为了 “aA123456”。
    # 设置好数据之后,需要使用urllib.parse.urlencode对数据进行编码处理。
    # 然后,我们还需要创建Request对象,参数包括URL地址和要传递的数据。
    # 可以这样创建:req=urllib.request.Request (url 地址,传递的数据)。
    # 接下来,可以使用add_header()添加头信息,模拟浏览器进行爬取,
    # 并且使用urllib. request.urlopen()打开对应的Request对象,
    # 完成信息的传递并进行后续处理等,这一部分内 容我们之前提过,这里不再赘述。
    # 实例如下:
    import urllib.request
    import urllib.parse

    url = "http://www.iqianyue.com/mypost/"
    postdata = urllib.parse.urlencode({
    "name": "ceo@iqianyue.com",
    "pass": "aA123456"
    }).encode('utf-8') # 将数据使用urlencode编码处理后,使用encode()设置为utf-8编码
    req = urllib.request.Request(url, postdata)
    req.add_header('User-Agent',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0')
    data = urllib.request.urlopen(req).read()
    fhandle = open("G:python爬虫精通Python网络爬虫源码书中源码/5.html", "wb")
    fhandle.write(data)
    fhandle.close()
  • 相关阅读:
    Ansible Playbook 变量与 register 详解
    Ansible Playbook 初识
    Ansible Ad-Hoc与常用模块
    Ansible-免密登录与主机清单Inventory
    Ansible-安装配置
    Ansible-基本概述
    Linux tcpdump 命令详解与示例
    Linux 查看磁盘IO并找出占用IO读写很高的进程
    腾讯云部署Django成功,本地无法访问网页的解决办法
    CVM配置微信服务器之坑-待更新
  • 原文地址:https://www.cnblogs.com/kwkk978113/p/12870936.html
Copyright © 2011-2022 走看看