我之前写的《 Python 3 极简教程. pdf 》,适合有点编程基础的快速入门,通过该系列文章学习,能够独立完成接口的编写,写写小东西没问题。
requests,Python HTTP 请求库,相当于 Android 的 Retrofit,它的功能包括 Keep-Alive 和连接池、Cookie 持久化、内容自动解压、HTTP 代理、SSL 认证、连接超时、Session 等很多特性,同时兼容 Python2 和 Python3,GitHub: https://github.com/requests/requests 。
Mac:
- pip3 install requests
Windows:
- pip install requests
HTTP 请求方法有 get、post、put、delete。
- import requests
- # get 请求
- response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all')
- # post 请求
- response = requests.post('http://127.0.0.1:1024/developer/api/v1.0/insert')
- # put 请求
- response = requests.put('http://127.0.0.1:1024/developer/api/v1.0/update')
- # delete 请求
- response = requests.delete('http://127.0.0.1:1024/developer/api/v1.0/delete')
请求返回 Response 对象,Response 对象是对 HTTP 协议中服务端返回给浏览器的响应数据的封装,响应的中的主要元素包括:状态码、原因短语、响应首部、响应 URL、响应 encoding、响应体等等。
- # 状态码
- print(response.status_code)
- # 响应 URL
- print(response.url)
- # 响应短语
- print(response.reason)
- # 响应内容
- print(response.json())
请求添加 HTTP 头部 Headers,只要传递一个 dict 给 headers 关键字参数就可以了。
- header = {'Application-Id': '19869a66c6',
- 'Content-Type': 'application/json'
- }
- response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all/', headers=header)
想为 URL 的查询字符串 (query string) 传递某种数据,比如: http://127.0.0.1:1024/developer/api/v1.0/all?key1=value1&key2=value2 ,Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。
- payload
- =
- {
- 'key1'
- :
- 'value1'
- ,
- 'key2'
- :
- 'value2'
- }
- response
- =
- requests.get(
- "http://127.0.0.1:1024/developer/api/v1.0/all"
- , params
- =
- payload)
还可以将 list 作为值传入:
- payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
- response = requests.get("http://127.0.0.1:1024/developer/api/v1.0/all", params=payload)
- # 响应 URL
- print(response.url)# 打印:http://127.0.0.1:1024/developer/api/v1.0/all?key1=value1&key2=value2&key2=value3
如果服务器要求发送的数据是表单数据,则可以指定关键字参数 data。
- payload
- =
- {
- 'key1'
- :
- 'value1'
- ,
- 'key2'
- :
- 'value2'
- }
- response
- =
- requests.post(
- "http://127.0.0.1:1024/developer/api/v1.0/insert"
- , data
- =
- payload)
如果要求传递 json 格式字符串参数,则可以使用 json 关键字参数,参数的值都可以字典的形式传过去。
- obj = {
- "article_title": "小公务员之死2"
- }
- # response = requests.post('http://127.0.0.1:1024/developer/api/v1.0/insert', json=obj)
Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。
- # 响应内容
- # 返回是 是 str 类型内容
- # print(response.text())
- # 返回是 JSON 响应内容
- print(response.json())
- # 返回是二进制响应内容
- # print(response.content())
- # 原始响应内容,初始请求中设置了 stream=True
- # response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all', stream=True)
- # print(response.raw())
如果没有显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果遇到服务器没有响应的情况时,整个应用程序一直处于阻塞状态而没法处理其他请求。
- response
- =
- requests.get(
- 'http://127.0.0.1:1024/developer/api/v1.0/all'
- , timeout
- =
- 5
- )
- # 单位秒数
如果频繁访问一个网站,很容易被服务器屏蔽掉,requests 完美支持代理。
- # 代理
- proxies = {
- 'http': 'http://127.0.0.1:1024',
- 'https': 'http://127.0.0.1:4000',
- }
- response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all', proxies=proxies)
BeautifulSoup,Python html 解析库,相当于 Java 的 jsoup。
BeautifulSoup 3 目前已经停止开发,直接使用 BeautifulSoup 4。
Mac:
- pip3 install beautifulsoup4
Windows:
- pip install beautifulsoup4
我用的是 html5lib,纯 Python 实现的。
Mac:
- pip3 install html5lib
Windows:
- pip install html5lib
BeautifulSoup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象。
- from bs4 import BeautifulSoup
- def get_html_data():
- html_doc = """
- <html>
- <head>
- <title>WuXiaolong</title>
- </head>
- <body>
- <p>分享 Android 技术,也关注 Python 等热门技术。</p>
- <p>写博客的初衷:总结经验,记录自己的成长。</p>
- <p>你必须足够的努力,才能看起来毫不费力!专注!精致!
- </p>
- <p class="Blog"><a href="http://wuxiaolong.me/">WuXiaolong's blog</a></p>
- <p class="WeChat"><a href="https://open.weixin.qq.com/qr/code?username=MrWuXiaolong">公众号:吴小龙同学</a> </p>
- <p class="GitHub"><a href="http://example.com/tillie" class="sister" id="link3">GitHub</a></p>
- </body>
- </html>
- """
- soup = BeautifulSoup(html_doc, "html5lib")
- tag = soup.head
- print(tag) # <head><title>WuXiaolong</title></head>
- print(tag.name) # head
- print(tag.title) # <title>WuXiaolong</title>
- print(soup.p) # <p>分享 Android 技术,也关注 Python 等热门技术。</p>
- print(soup.a['href']) # 输出 a 标签的 href 属性:http://wuxiaolong.me/
注意:tag 如果多个匹配,返回第一个,比如这里的 p 标签。
- print(soup.find('p'))# < p > 分享Android技术,也关注Python等热门技术。 < /p>/
find 默认也是返回第一个匹配的标签,没找到匹配的节点则返回 None。如果我想指定查找,比如这里的公众号,可以指定标签的如 class 属性值:
- # 因为 class 是 Python 关键字,所以这里指定为 class_。
- print(soup.find('p', class_="WeChat"))
- # <p class="WeChat"><a href="https://open.weixin.qq.com/qr/code?username=MrWuXiaolong">公众号</a> </p>
来源: https://www.cnblogs.com/WuXiaolong/p/8144459.html