学习爬虫之前呢,最好要对HTTP协议有了解,我前面有写过几篇关于HTTP协议的文章,建议读者阅读一下,对爬虫帮助很大。
方法 | 说明 |
---|---|
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 |
最常用的get方法:
requests.get(url,params=None,**kwargs)
其他几个方法如下:
requests.request(method,url,**kwargs)
requests.post(url,data=None,json=None,**kwargs)
requests.head(url,**kwargs)
requests.put(url,data=None,**kwargs)
requests.patch(url,data=None,**kwargs)
requests.delete(url,**kwargs)
PS:这里要说明一下:
r = requests.request(method='GET', url=url, **kwargs)
r = requests.get(url, **kwargs)
这两句代码的意思完全一样,只是为了方便,做了一层封装而已。
r = requests.get(url)
r:是一个Response对象,一个包含服务器资源的对象,Request对象包含爬虫返回的内容。
.get(url):是一个Request对象,构造一个向服务器请求资源的Request。
PS:这两个对象指的就是就是HTTP协议中的请求和响应报文。
常见的Response对象的属性:
属性 | 说明 |
---|---|
r.status_code | HTTP 请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即,url对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容的编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
r.headers | HTTP响应内容的头部信息 |
**kwargs:控制访问的参数,均为可选项
参数 | 说明 |
---|---|
params | 字典或字节序列,作为参数增加到url中。 |
data | 字典、字节序列或文件对象,作为Request的内容 ,放在url链接对应位置的地方,作为数据来存储 |
json | JSON数据格式,作为Request的内容 |
headers | 字典,HTTP定制头 |
cookies | 字典或CookieJar,Request中的cookie |
auth | 元组类型,它是支持http认证功能的。 |
files | 字典类型,传输文件 |
timeout | 设置超时时间,秒为单位 |
proxies | 字典类型,设定访问代理服务器,可以增加登录认证。(有效地防止对爬虫的逆追踪) |
allow_redirects | True/False,默认为True,表示允许对url进行重定向 |
stream | True/False,默认为True,获取内容即下载开关 |
verify | True/False,默认为True,认证SSL证书开关 |
cert | 保存本地SSL证书路径的字段 |
这十三个控制访问参数具体使用如下:
import requests
kv = {'key1': 'one', 'key2': 'two'}
r = requests.request('GET', 'http://python123.io/ws', params=kv)
print(r.request.url) #看看提交的URL变成了什么
'https://python123.io/ws?key1=one&key2=two'
import requests
key = {'key1':'one', 'key2':'two'}
url = 'http://httpbin.org/put'
r = requests.request('POST', 'http://python123.io/ws', data=key)
# or
r = requests.request('POST', 'http://python123.io/ws', data='FDGDFG') #字符串
import requests
kv = {'name': 'youdi', 'role': 'king', 'rank': 'the one'}
url = 'http://httpbin.org/post'
r = requests.request(method='POST', url=url, json=kv)
print(r.text)
{
"args": {},
"data": "{\"role\": \"king\", \"rank\": \"the one\", \"name\": \"youdi\"}", #json格式,其实就是字符串
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "52",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.13.0"
},
"json": {
"name": "youdi",
"rank": "the one",
"role": "king"
},
"origin": "183.60.175.16",
"url": "http://httpbin.org/post"
}
import requests
url = 'http://httpbin.org/post'
r = requests.request('POST', url)
print(r.request.headers) # 请求头部信息
# 观察User-Agent
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '0'}
#加入headers后
headers = {"User-Agent": "Mozilla/5.0"}
r = requests.request('POST', url, headers=headers)
# 观察User-Agent
print(r.request.headers)
{'User-Agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '0'}
#先获取百度的cookie
import requests
r = requests.request('GET', 'https://www.baidu.com')
cookie = r.cookies
# cookie类型
print(type(cookie))
<class 'requests.cookies.RequestsCookieJar'>
import requests
# 最简单的http验证
from requests.auth import HTTPBasicAuth
r = requests.get('http://httpbin.org/auth', auth=HTTPBasicAuth('user', 'user'))
# r = requests.get('http://httpbin.org/auth', auth=('user', 'user'))
print(r.status_code)
fs = {file: open('data.xls', 'rb')}
# 使用files参数就可以了
r = requests.request('POST','http://httpbin.org/post',files=fs)
import requests
from requests.exceptions import ReadTimeout
try:
# 设置必须在500ms内收到响应,不然或抛出ReadTimeout异常
response = requests.get("http://httpbin.org/get", timeout=0.5)
print(response.status_code)
except ReadTimeout:
print('Timeout')
import requests
#普通代理
proxies = {
"http": "http://127.0.0.1:1080",
"https": "https://127.0.0.1:1080",
}
# 往请求中设置代理(proxies)
r = requests.get("https://www.taobao.com", proxies=proxies)
print(r.status_code)
# 带有用户名和密码的代理
proxies = {
"http": "http://user:[email protected]:9743/",
}
r = requests.get("https://www.taobao.com", proxies=proxies)
print(r.status_code)
# 设置socks代理,必备。但是得提前安装库:pip install pysocks
proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}
r = requests.get("https://www.google.com", proxies=proxies)
print(r.status_code)
r = requests.request('GET','http://httpbin.org/get',allow_redirects=False)
r = requests.request('GET','http://httpbin.org/get/**.txt',stream=False)
# 无证书访问
r = requests.get('https://www.12306.cn')
# 在请求https时,request会进行证书的验证,如果验证失败则会抛出异常
print(r.status_code)
# 关闭验证,但是仍然会报出证书警告
r = requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
# 消除关闭证书验证的警告
from requests.packages import urllib3
# 关闭警告
urllib3.disable_warnings()
r = requests.get('https://www.12306.cn',verify=False)
print(r.status_code)
# 设置本地证书
r = requests.get('https://www.12306.cn', cert=('/home/youdi/Download/**.crt', '/hone/youdi/.ssh/**.key'))
print(r.status_code)
不是所有请求都能成功的,会有许多异常。
异常 | 说明 |
---|---|
requests.ConnectionError | 网络连接异常,如DNS查询失败,拒绝连接等 |
requests.HTTPError | HTTP错误异常 |
requests.URLRequired | URL缺失异常 |
requests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout | 连接远程服务器超时异常 |
requests.Timeout | 请求URL超时,产生超时异常 |
import requests
import requests.exceptions
try:
response = requests.get("http://httpbin.org/get", timeout = 0.5)
print(response.status_code)
except requests.ReadTimeout:
print('Timeout') # 超时异常
except requests.ConnectionError:
print('Connection error') # 连接异常
except requests.HTTPError:
print('Error')
r.raise_for_status(),如果status_code不是200,产生异常requests.HTTPError。
r.raise_for_status()方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理。
import requests
import requests.exceptions
url = "https://www.amazon.cn/dp/B00J7E381S?ref_=Oct_DotdV2_PC_2_GS_DOTD_f0f9ddb1&pf_rd_r=269HMTWP7R5ZPFRGY17V&pf_rd_p=8c48638a-3752-448a-8685-5a17153fb132&pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2"
try:
r = requests.get(url)
r.raise_for_status()
except requests.HTTPError:
print("error")
#报错,显示HTTPError异常
网络爬虫的限制:
User-Agent:*
Disallow:/
Robots协议语法:*代表所有,/代表根目录
文章对Python的Request库进行了详解,爬虫系列有时间话会一直更新下去。这里也强烈推荐《中国大学慕课》上北京理工大学嵩天老师的Python爬虫课,非常好!文章也是根据嵩老师的课程所写。
本宝才疏学浅,文章如有不当之处,还请多多指教~~ (●′ω`●)