zoukankan      html  css  js  c++  java
  • Python 爬虫从入门到进阶之路(三)

    之前的文章我们做了一个简单的例子爬取了百度首页的 html,本篇文章我们再来看一下 Get 和 Post 请求。

    在说 Get 和 Post 请求之前,我们先来看一下 url 的编码和解码,我们在浏览器的链接里如果输入有中文的话,如:https://www.baidu.com/s?wd=贴吧,那么浏览器会自动为我们编码成:https://www.baidu.com/s?wd=%E8%B4%B4%E5%90%A7,在 Python2.x 中我们需要使用 urllib 模块的 urlencode 方法,但我们在之前的文章已经说过之后的内容以 Python3.x 为主,所以我们就说一下 Python3.x 中的编码和解码。

    在 Python3.x 中,我们需要引入 urllib.parse 模块,如下:

    1 import urllib.parse
    2 data= {"kw":"贴吧"}
    3 # 通过 urlencode() 方法,将字典键值对按URL编码转换,从而能被web服务器接受。
    4 data = urllib.parse.urlencode(data)
    5 print(data)  # kw=%E8%B4%B4%E5%90%A7
    6 # 通过 unquote() 方法,把 URL编码字符串,转换回原先字符串。
    7 data = urllib.parse.unquote(data)
    8 print(data)  # kw=贴吧

    下面我们来看一下 Get 请求

    GET请求一般用于我们向服务器获取数据,比如说,我们用百度搜索 贴吧,结果如下

    在其中我们可以看到在请求部分里,http://www.baidu.com/s? 之后出现一个长长的字符串,其中就包含我们要查询的关键词 贴吧,于是我们可以尝试用默认的 Get 方式来发送请求。

     1 import urllib.request
     2 import urllib.parse
     3 import ssl
     4 
     5 # 取消代理验证
     6 ssl._create_default_https_context = ssl._create_unverified_context
     7 
     8 # url 地址
     9 url = "http://www.baidu.com/s"
    10 word = {"wd": "贴吧"}
    11 word = urllib.parse.urlencode(word)  # 转换成url编码格式(字符串)
    12 url = url + "?" + word  # url首个分隔符就是 ?
    13 
    14 # User-Agent
    15 headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
    16 
    17 # url 作为Request()方法的参数,构造并返回一个Request对象
    18 request = urllib.request.Request(url, headers=headers)
    19 
    20 # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
    21 response = urllib.request.urlopen(request)
    22 
    23 # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    24 html = response.read().decode("utf-8")
    25 
    26 # 打印字符串
    27 print(html)

    我们在请求页面的时候将我们要传的值直接通过转码拼接在 url 地址后面,然后就可以获取到我们想要的内容了,最终结果如下:

    通过开发者工具看页面的 HTML 和我们得到的结果是完全一致的。

    接下来我们看一下 post 请求,先来看一个 post 请求接口:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100:90&start=0&limit=10,该接口为豆瓣的一个电影列表接口,为 post 请求,url 问号后面的为请求参数,结果如下:

    如果我们要使用 urllib 的 post 请求,则要在 Request 第二个参数加入我们想要的参数,如下:

     1 import urllib.request
     2 import urllib.parse
     3 import ssl
     4 
     5 # 取消代理验证
     6 ssl._create_default_https_context = ssl._create_unverified_context
     7 
     8 # User-Agent
     9 headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
    10 # post 请求参数
    11 data = {
    12     "type": "11",
    13     "interval_id": "100:90",
    14     "start": "0",
    15     "limit": "10"
    16 }
    17 data = urllib.parse.urlencode(data).encode("utf-8")
    18 
    19 # url 作为Request()方法的参数,构造并返回一个Request对象
    20 request = urllib.request.Request("https://movie.douban.com/j/chart/top_list?", data=data, headers=headers)
    21 
    22 # Request对象作为urlopen()方法的参数,发送给服务器并接收响应
    23 response = urllib.request.urlopen(request)
    24 
    25 # 类文件对象支持 文件对象的操作方法,如read()方法读取文件全部内容,返回字符串
    26 html = response.read().decode("utf-8")
    27 
    28 # 打印字符串
    29 print(html)

    urllib 默认的是 get 请求,urllib.request.Request() 里第一个参数为 url 地址,第二个参数为请求报头 headers,请求包头可以不写。

    urllib 默认的是 get 请求,urllib.request.Request() 里第一个参数为 url 地址,第二个参数为请求数据 data,第三个参数为请求报头 headers,请求包头可以不写。

    最终结果如下:

    和我们在页面请求的结果是一样的。

    为什么有时候POST也能在URL内看到数据?

    • GET方式是直接以链接形式访问,链接中包含了所有的参数,服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。

    • POST则不会在网址上显示所有的参数,服务器端用Request.Form获取提交的数据,在Form提交的时候。但是HTML代码里如果不指定 method 属性,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。

    • 表单数据可以作为 URL 字段(method="get")或者 HTTP POST (method="post")的方式来发送。

  • 相关阅读:
    bzoj1015星球大战(并查集+离线)
    bzoj1085骑士精神(搜索)
    bzoj1051受欢迎的牛(Tarjan)
    左偏树学习
    hdu1512 Monkey King(并查集,左偏堆)
    左偏树(模板)
    PAT (Basic Level) Practice (中文) 1079 延迟的回文数 (20分) (大数加法)
    PAT (Basic Level) Practice (中文) 1078 字符串压缩与解压 (20分) (字符转数字——栈存放)
    PAT (Basic Level) Practice (中文) 1077 互评成绩计算 (20分) (四舍五入保留整数)
    PAT (Basic Level) Practice (中文) 1076 Wifi密码 (15分)
  • 原文地址:https://www.cnblogs.com/weijiutao/p/10737101.html
Copyright © 2011-2022 走看看