Python网络爬虫与信息提取
1.Requests的官网与安装
通过pip安装
pip install requests
官网安装指南:安装requests库
2.小案例:测试简单Requests库
import requests
r = requests.get("http://www.baidu.com")
print("状态码:%d" % r.status_code)
r.encoding = "utf-8"
print("页面信息:%s" % r.text)
3.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 |
4.Requests库的get()方法
简单写法
r = requests.get(url)
构造一个向服务器请求资源的Request对象
返回一个包含服务器资源的Response对象,包含从服务器返回的所有相关资源。
完整使用方法
requests.get(url,params=None,**kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
源码
def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param \*\*kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)
其实用request方法进行封装
Response对象的属性
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404或者其他表示失败 |
r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTPheader中猜测的响应内容编码方式,找服务器响应头中的charset字段,若charset字段不存在,则认为编码为ISO-8859-1 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式),分析内容猜测编码方式比较准确 |
r.content | HTTP响应内容的二进制形式 |
5.爬取网页的通用代码框架(异常处理)
Requests库的异常
异常 | 说明 |
---|---|
requests.ConnectionError | 网页连接错误异常,如DNS查询失败,拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
Response对象异常
异常 | 说明 |
---|---|
r.raise_for_status() | 判断返回的Response状态,如果不是200,产生异常requests.HTTPError |
爬取网页的通用代码框架
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status() # 如果状态不是200,引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
6.HTTP协议
- Hypertext Transfer Protocol,超文本传输协议
- HTTP是一个基于“请求与相应”模式的、无状态的应用层协议。
- HTTP协议采用URL作为定位网络资源的标识。
- URL格式 http://host[:port][path]
host:合法的Internet主机域名或IP地址
post:端口号,缺省端口为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,未提交字段被删除。
PATCH的最主要好处:节省网络带宽
HTTP协议与Requests库
HTTP协议方法 | Requests库方法 | 功能一致性 |
---|---|---|
GET | requests.get() | 一致 |
HEAD | requests.head() | 一致 |
POST | requests.post() | 一致 |
PUT | requests.put() | 一致 |
PATCH | requests.patch() | 一致 |
DELETE | requests.delete() | 一致 |
Requests库的head()方法
import requests
url = "http://httpbin.org/get"
r = requests.head(url)
print("r.headers=%s" % r.headers)
print("r.text=%s" % r.text)
输出结果为:
r.headers={'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Mon, 18 Nov 2019 15:14:06 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Connection': 'keep-alive'}
r.text=
只输出了头部信息,r.text输出信息为空。
结论:head()方法能使用很少的网络流量获取网络资源的概要信息。
Requests库的post()方法
1.向URL POST一个字典,自动编码为form(表单)
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
url = "http://httpbin.org/post"
r = requests.post(url, data=payload)
print(r.text)
输出结果为:
{ ……
"form": {
"key1": "value1",
"key2": "value2"
},
……
}
2.向URL POST一个字符串,自动编码为data
import requests
url = "http://httpbin.org/post"
r = requests.post(url, data='ABC')
print(r.text)
输出结果为:
{ ……
"data": "ABC",
"form": {},
……
}
Requests库的put()方法
import requests
payload = {'key1': 'value1', 'key2': 'value2'}
url = "http://httpbin.org/put"
r = requests.put(url, data=payload)
print(r.text)
输出结果为:
{ ……
"form": {
"key1": "value1",
"key2": "value2"
},
……
}
与post()方法类似,但是put()方法能将原来的数据覆盖掉
7.requests.request()方法解析
requests.request(method,url,**kwargs)
method:请求方式,对应HTTP协议方法和OPTIONS的7种
r = requests.request('GET', url, **kwargs)
r = requests.request('HEAD', url, **kwargs)
r = requests.request('POST', url, **kwargs)
r = requests.request('PUT', url, **kwargs)
r = requests.request('PATCH', url, **kwargs)
r = requests.request('delete', url, **kwargs)
r = requests.request('OPTIONS', url, **kwargs)
# OPTIONS是向服务器获取一些服务器跟客户端打交道的参数,并不与获取资源直接相关,使用较少
url:拟获取页面的url链接
**kwargs:13个控制访问的参数,均为可选项
13个控制访问的参数
控制访问的参数:params(灵活掌握)
字典或字节序,作为参数增加到url中
import requests
kv = {'key1': 'value1', 'key2': 'value2'}
url = "http://python123.io/ws"
r = requests.request('GET', url, params=kv)
print(r.url)
结果:
https://python123.io/ws?key1=value1&key2=value2
控制访问的参数:data(灵活掌握)
字典、字节序列或文件对象,作为Request的内容
import requests
kv = {'key1': 'value1', 'key2': 'value2'}
url = "http://httpbin.org/post"
r = requests.request('POST', url, data=kv)#向URL POST一个字典,自动编码为form
print(-------------------)
body = 'hello world'
r = requests.request('POST', url, data=body)#向URL POST一个字符串,自动编码为data
结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
……
}
-----------------------------------
{
"args": {},
"data": "hello world",
"files": {},
"form": {},
……
}
控制访问的参数:json(灵活掌握)
JSON格式的数据,作为Request的内容
import requests
kv = {'key1': 'value1'}
url = "http://httpbin.org/post"
r = requests.request('POST', url, json=kv)
print(r.text)
结果:
{
"args": {},
"data": "{\"key1\": \"value1\"}",
"files": {},
"form": {},
……
"json": {
"key1": "value1"
},
……
}
控制访问的参数:headers(灵活掌握)
字典,HTTP定制头
import requests
hd = {'user-agent': 'Chrome/10'}
url = "http://httpbin.org/post"
r = requests.request('POST', url, headers=hd)
print(r.text)
结果:
{
……
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "Chrome/10"
},
……
}
控制访问的参数:cookies
字典或CookieJar,Request中的cookie
控制访问的参数:auth
元组,支持HTTP认证功能
控制访问的参数:files
字典类型,传输文件
import requests
fs = {"file": open('file.txt', 'rb')}
url = "https://httpbin.org/post"
r = requests.request("POST", url, files=fs)
print(r.text)
file.txt中的内容为:
Hello World!
这是txt文件的内容!
结果:
{
……
"files": {
"file": "Hello World!\r\n\u8fd9\u662ftxt\u6587\u4ef6\u7684\u5185\u5bb9\uff01"
},
……
}
控制访问的参数:timeout
设定超时时间,秒为单位
import requests
url = "https://httpbin.org/get"
r = requests.request("GET", url, timeout=10)
print(r.text)
如果在timeout时间内,请求内容没有返回,则会抛出一个timeout的异常
控制访问的参数:proxies
字典类型,设定访问代理服务器,可以增加登录认证
例如:
import requests
pxs = {'http': 'http://user:pass@10.10.10.1:1234', 'https': 'https://10.10.10.1:4321'}
url = "http://httpbin.org/get"
r = requests.request("GET", url, proxies=pxs)
print(r.text)
控制访问的参数:allow_redirects
True/False,默认为True,重定向开关
控制访问的参数:stream
True/False,默认为True,获取内容立即下载开关
控制访问的参数:verify
True/False,默认为True,认证SSL证书开关
控制访问的参数:cert
本地SSL证书路径
Requests库的七个主要方法解析
requests.get()方法(最常用的方法)
requests.get(url, params=None, **kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
requests.head()方法(较常用的方法)
requests.head(url, **kwargs)
url:拟获取页面的url链接
**kwargs:13个控制访问的参数
requests.post()方法
requests.post(url, data=None, json=None, **kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
json:JSON格式的数据,Request的内容
**kwargs:11个控制访问的参数
requests.put()方法
requests.put(url, data=None, **kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
requests.patch()方法
requests.patch(url, data=None, **kwargs)
url:拟更新页面的url链接
data:字典、字节序列或文件,Request的内容
**kwargs:12个控制访问的参数
requests.delete()方法
requests.delete(url, **kwargs)
url:拟删除页面的url链接
**kwargs:13个控制访问的参数