爬取网页带通用代码框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import requests

def getHTMLText(url):
try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"

if __name__ == "__main__":
url = "https://www.baidu.com"
print(getHTMLText(url))

HTTP 协议和Requests 库的主要方法

HTTP协议

HTTP, Hypertext Transfer Protocol, 超文本传输协议。

HTTP 是一个基于“请求与响应”模式的、无状态的应用层协议。

HTTP 协议采用 URL 作为定位网络资源的标识。

URL 格式

https://host[:port][path]

host: 合法的 Internet 主机域名或 IP 地址
port: 端口号, 缺省端口号为 80
path: 请求资源的路径

HTTP URL 的理解:

URL 是通过 HTTP 协议存取资源的 Internet 路径, 一个 URL 对应一个数据资源

HTTP 协议对资源的操作

方法说明
GET请求获取 URL 位置的资源
HEAD请求获取 URL 位置资源的响应消息报告, 即获得该资源的头部信息
POST请求向 URL 位置的资源后附加新的数据
PUT请求向 URL 位置存储一个资源,覆盖原 URL 位置的资源
PATCH请求局部更新 URL 位置的资源,级改变该处资源的部分内容
DELETE请求删除 URL 位置存储的资源

理解 PATCH 和 PUT 的区别

假设 URL 位置有一组数据UserInfo, 包括UserID UserName 等 20 个字段.
需求:用户修改UserName, 其他不变

  • 采用 PATCH, 仅向 URL 提交UserName的局部更新请求
  • 采用 PUT, 必须将所有 20 个字段一并提交到 URL, 未提交的字段被删除

HTTP 协议与 Requests 库

HTTP 协议方法Requests 库方法功能一致性
GETrequests.get()一致
HEADrequests.head()一致
POSTrequests.post()一致
PUTrequests.put()一致
PATCHrequests.patch()一致
DELETErequests.delete()一致

Requests 库主要方法解析

方法说明
requests.request()构造一个请求,支撑以下各方法的基础方法
requests.get()获取 HTML 网页的主要方法,对应于 HTTP 的 GET
requests.head()获取 HTML 网页头信息的方法,对应于 HTTP 的 HEAD
requests.post()向 HTML 网页提交 POST 请求的方法,对应于 HTTP 的 POST
requests.put()向 HTML 网页提交 PUT 请求的方法,对应于 HTTP 的 PUT
requests.patch()向 HTML 网页提交局部修改请求,对应于 HTTP 的 PATCH
requests.delete()向 HTML 页面提交删除请求,对应于 HTTP 的 DELETE

requests.request(method, url, **kwargs)

method: 方法
url: 拟获取页面的 url 链接
**kwargs: 控制访问的参数, 均为可选项

** **kwargs **
params: 字典或字节序列, 作为参数增加到 url 中

1
2
3
4
5
kv = {'key1' : 'value1', 'key2' : 'value2'}
r = requests.request('GET', 'http://python133.io/ws', params = kv)
print(r.url)
# http://python123.io/ws?key1=value1&key2=value2

data: 字典 字节序列或文件对象, 作为 Request 的内容

1
2
3
4
kv = {'key1' : 'value1', 'key2' : 'value2'}
r = requests.request('POST', 'http://python133.io/ws', data = kv)
body = '主体内容'
r = requests.request('POST', 'http://python133.io/ws', data = body)

json: JSON 格式的数据, 作为 Request 的内容

1
2
kv = {'key1' : 'value1'}
r = requests.request('POST', 'http://python123.io/ws', json=kv)

headers: 字典, HTTP 定义头

1
2
hd = {'user-agent' : 'Chrome/10'}
r = requests.request('POST', 'http://python123.io/ws', headers = hd)

cookies: 字典或 CookieJar, Request 中的 cookie
auth: 元祖, 支持 HTTP 认证功能
files: 字典类型,传输文件

1
2
fs = {'file': open('data.xls', 'rb')}
r = requests.request('POST', 'http://python123.io/ws', files = fs)

timeout : 设定超时时间, 秒为单位
proxies: 字典类型, 设定访问代理服务器, 可以增加登录认证

1
2
3
pxs = {'http': 'http://user:pass@10.10.10.1:1234'
'https': 'https://10.0.0.1:4321}
r = requests.request('GET', 'http://www.baidu.com', proxies = pxs)

allow_redirects: True/False, 默认为 True, 重定向开关
stream: True/False, 默认为 True, 获取内容立即下载开关
verify: True/False, 默认为 True, 认证 SSL 证书开关
cert: 本地 SSL 证书路径

requests.get(url, params = None, **kwargs)

url: 拟获取页面的 url 链接
params: url 中的额外参数, 字典或字节流格式, 可选
**kwargs: 12 个访问控制参数

requests.head(url, **kwargs)

url: 拟获取页面的 url 链接
**kwargs: 13 个访问控制参数

requests.head(url, data = None, json = None, **kwargs)

url: 拟获取页面的 url 链接
data: 字典 字节序列或文件, Request 的内容
json: JSON 格式的数据, Request 的内容
**kwargs: 11 个访问控制参数

requests.put(url, data = None, **kwargs)

url: 拟获取页面的 url 链接
data: 字典 字节序列或文件, Request 的内容
**kwargs: 12 个访问控制参数

requests.patch(url, data = None, **kwargs)

url: 拟获取页面的 url 链接
data: 字典 字节序列或文件, Request 的内容
**kwargs: 12 个访问控制参数

requests.delete(url, **kwargs)

url: 拟删除页面的 url 链接
**kwargs: 13 个访问控制参数