基础知识

  • HTTP:(HyperText Transport Protocol)是超文本传输协议缩写
  • URL:(Uniform Resource Locator)是统一资源定位符的缩写
  • HTTP请求方式
    | 对比项 | GET | POST | | —- | —- | —- | | 提交方式 | 提交的参数数据放在URL之后,使用?
    与URL进行分割,多个参数之间使用&
    分隔 | 提交的参数数据不放在URL中提交,模拟提交表单数据 | | 提交数据长度 | 受限 | 无限制 | | 安全性 | 安全性低,提交的数据与URL混合在一起提交,很容易被发现 | 安全性高 |

  • 状态码
    常见的状态码:

    • 200:表示请求成功,成功返回请求资源
    • 404:表示请求的资源不存在
    • 500:服务器错误

urllib库

  • urllib库内置模块:
    | 模块 | 说明 | | —- | —- | | urllib.request | HTTP请求模块,在程序中模拟浏览器发送HTTP请求 | | urllib.error | 异常模块,捕获由于HTTP请求问题产生的异常,并进行处理 | | urllib.parse | URL解析模块,提供了处理URL的工具函数 | | urllib.robotparser | robots.txt解析模块,网站通过robots.txt文件设置爬虫可爬取的网页 |

  • urllib.request.urlopen函数

    • 常用参数:
      • url:目标URL访问地址
      • data:默认是None,表示GET方式发送请求,data有值,表示POST方式发送请求
      • timeout:访问超时时间
    • GET请求
      ```python import urllib.request

data没值是GET

res = urllib.request.urlopen(“http://www.baidu.com“) print(res.read().decode(“utf8”))

  1. - POST请求
  2. ```python
  3. import urllib.request
  4. # 请求数据
  5. param_dict = {"key":"hello world"}
  6. # 调用urlencode函数将字典类型数据转成字符串
  7. param_str = urllib.parse.urlencode(param_dict)
  8. #将传输数据封装成一个bytes对象
  9. param_datas=bytes(param_str,encoding="utf8")
  10. #data有值是POST
  11. res = urllib.request.urlopen("http://httpbin.org/post",data=param_datas)
  12. print(res.read().decode("utf8"))
  1. - 超时时间
  1. import urllib.request
  2. res = urllib.request.urlopen("http://www.baidu.com",timeout=0.001)
  3. print(res.read())
  1. - 响应状态码和头信息
  1. import urllib.request
  2. res = urllib.request.urlopen("http://www.baidu.com")
  3. print(res.status)
  4. print(res.getheaders())
  • urllib.request.Request
    • Request类的构造方法
  1. class Request:
  2. def __init__(self, url, data=None, headers={},
  3. origin_req_host=None, unverifiable=False,
  4. method=None):
  5. ...省略

参数说明:

参数名称 是否必填 说明
url HTTP请求的目标地址
data HTTP请求要传输的数据,数据是bytes字节流数据
headers 请求头信息,头信息使用字典存储
origin_req_host 发起HTTP请求的主机名称或者IP地址
unverifiable 表示这个请求是否为无法验证的。默认值是False
method 发起HTTP请求的方式,如GET、POST等
  1. import urllib.request
  2. import urllib.parse
  3. url = "http://httpbin.org/post"
  4. #设置浏览器信息
  5. headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}
  6. data_dict={"word":"hello world"}
  7. #将字典类型数据转换成bytes字节流
  8. data=bytes(urllib.parse.urlencode(data_dict),encoding="utf8")
  9. #创建Request对象
  10. request = urllib.request.Request(url,data=data,headers=headers,method="POST")
  11. res = urllib.request.urlopen(request)
  12. print(res.read().decode("utf8"))
  • urllib.error异常处理
    为了提高程序的稳定性,需要捕获这些异常,还可以根据需要捕获的异常做进一步处理
    • URLError:通过reason属性可以获取产生URLError的原因
      产生URLError的原因:
      • 网络异常,失去网络连接
      • 访问的服务器不存在,服务器连接失败
        ```python import urllib.request import urllib.error

不存在的url

url=”http://www.qwertqwert123.com“ try: request_obj = urllib.request.Request(url=url) res = urllib.request.urlopen(request_obj) except urllib.error.URLError as e: print(e.reason)

  1. - **HTTPError**:是URLError的子类<br />返回属性说明:
  2. - code:响应的状态码
  3. - reason 获取产生HTTPError的原因
  4. - headers:获取HTTP请求头信息
  5. ```python
  6. import urllib.request
  7. import urllib.error
  8. try:
  9. # 不存在的地址
  10. res = urllib.request.urlopen("http://www.baidu.com/qwe")
  11. except urllib.error.HTTPError as e:
  12. print("异常原因:",e.reason)
  13. print("响应状态码:",e.code)
  14. print("请求头信息:",e.headers)
  15. except urllib.error.URLError as err:
  16. print(err.reason)

requests库

  • 基于urllib开发的HTTP相关操作库,相比直接使用urllib库更加简单、更加易用

    • 安装(pip或者pip3安装)

      1. pip3 install requests
    • 使用

      • GET请求
  1. import requests
  2. url="http://httpbin.org/get"
  3. res = requests.get(url)
  4. print("返回类型:",type(res))
  5. print("状态码:",res.status_code)
  6. print("响应内容:\n",res.text)

结果:

  1. 返回类型: <class 'requests.models.Response'>
  2. 状态码: 200
  3. 响应内容:
  4. {
  5. "args": {},
  6. "headers": {
  7. "Accept": "*/*",
  8. "Accept-Encoding": "gzip, deflate",
  9. "Host": "httpbin.org",
  10. "User-Agent": "python-requests/2.22.0",
  11. "X-Amzn-Trace-Id": "Root=1-5ff045c8-30b38f5f724544101d7cd8cb"
  12. },
  13. "origin": "223.73.124.224",
  14. "url": "http://httpbin.org/get"
  15. }
  1. - **POST请求**
  1. import requests
  2. url="http://httpbin.org/post"
  3. data ={
  4. "test":"hello world"
  5. }
  6. res = requests.post(url=url,data=data)
  7. print("状态码:",res.status_code)
  8. print("响应内容:\n",res.text)

结果:

  1. 状态码: 200
  2. 响应内容:
  3. {
  4. "args": {},
  5. "data": "",
  6. "files": {},
  7. "form": {
  8. "test": "hello world"
  9. },
  10. "headers": {
  11. "Accept": "*/*",
  12. "Accept-Encoding": "gzip, deflate",
  13. "Content-Length": "16",
  14. "Content-Type": "application/x-www-form-urlencoded",
  15. "Host": "httpbin.org",
  16. "User-Agent": "python-requests/2.22.0",
  17. "X-Amzn-Trace-Id": "Root=1-5ff04695-0cc9f99351d3f06c3345a93c"
  18. },
  19. "json": null,
  20. "origin": "223.73.124.224",
  21. "url": "http://httpbin.org/post"
  22. }
  1. - **添加头信息**:主要是伪装成浏览器向网站发送请求,防止被请求的服务器拦截非浏览器的请求
  1. import requests
  2. url="http://httpbin.org/post"
  3. data ={
  4. "test":"hello world"
  5. }
  6. # 添加头信息
  7. headers={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}
  8. res = requests.post(url=url,data=data,headers=headers)
  9. print("状态码:",res.status_code)
  10. print("响应内容:\n",res.text)

结果:

  1. 状态码: 200
  2. 响应内容:
  3. {
  4. "args": {},
  5. "data": "",
  6. "files": {},
  7. "form": {
  8. "test": "hello world"
  9. },
  10. "headers": {
  11. "Accept": "*/*",
  12. "Accept-Encoding": "gzip, deflate",
  13. "Content-Length": "16",
  14. "Content-Type": "application/x-www-form-urlencoded",
  15. "Host": "httpbin.org",
  16. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36",
  17. "X-Amzn-Trace-Id": "Root=1-5ff0473d-0e1061c93fb5612c5004fc37"
  18. },
  19. "json": null,
  20. "origin": "223.73.124.224",
  21. "url": "http://httpbin.org/post"
  22. }
  • 通过添加头信息和不加头信息的POST请求对比得到的结果发现:
    1. - 不加头信息返回结果显示:`"User-Agent": "python-requests/2.22.0"`
    2. - 添加头信息返回结果的`User-Agent`与我们设置的头信息一样的
  • Response对象:常用返回值说明:
    • text:获取服务端返回的响应内容
    • content:获取二进制数据,如服务器返回的图片、视频等
    • url:获取请求的url
    • encoding:获取响应内容的编码格式
    • cookies:获取cookies信息
    • headers:获取响应头信息

  • 当才华还配不上野心,就静下来学习