前言
网上的多数教程都是先基于urllib这个库开始介绍爬虫的,然而当你学习了一段时间后,就会发现urllib这个库使用起来其实并不方便,多数的代码也是不使用这个库所提供的方法的。所以,对于urllib库只需拥有一个简单的认识即可,可以直接从Requests这个库开始入手学习。
Requests库
一、基本使用:
requests库是python实现的最简单易用的HTTP库,比urllib更加方便。如果未安装requests库,需要通过cmd进行安装。
pip install requests
安装完成后导入requests库,然后来使用requests库的基本方法。
import requests
#获取请求百度后的响应
res = requests.get('http://www.baidu.com')
获取响应属性
print(rse.status_code) # 打印状态码
print(rse.url) # 打印请求url
print(rse.headers) # 打印头信息
print(rse.cookies) # 打印cookie信息
打印网页源码
print(res.text) # 返回网页源码,会出现中文乱码问题
print(res.content) # 返回二进制数据格式源码,解决乱码
print(res.content.decode('utf-8')) # 将二进制数据转换成utf-8
输出的content属性为二进制数据,可以利用这个方法来获取图片以及视频。
各种请求方式
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")
二、请求方式:
通过URL传参:
# 传入name,age两个属性
response = requests.get("http://httpbin.org/get?name=turbo&age=23")
print(response.text)
输出内容:
{
"args": {
"age": "23",
"name": "turbo"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.21.0"
},
"origin": "123.139.165.119, 123.139.165.119",
"url": "https://httpbin.org/get?name=turbo&age=23"
}
GET方法传入的参数写在URL中,用&分隔;若不传入参数,此例输出中的 “args”容器应为空。
通过属性设置进行传参:
创建一个字典,用params参数来传递这个参数。
data = {
"name":"turbo",
"age":23,
}
response = requests.get("http://httpbin.org/get", params=data)
print(response.text)
输出内容与上例相同,并且可以看到url参数发生变化。
JSON解析响应:
将上例中的数据解析成JSON字符串的格式。
print(response.json())
输出:
{'args': {'age': '23', 'name': 'turbo'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.21.0'}, 'origin': '123.139.165.119, 123.139.165.119', 'url': 'https://httpbin.org/get?name=turbo&age=23'}
添加头部信息:
通常我们直接GET一个网页所获取的源码不能保证与浏览器中所看到的一样,因为我们的程序会被识别成爬虫程序从而使得浏览器给我们返回错误的信息。所以我们需要使用添加头部的方式将自己的爬虫程序伪装成浏览器请求。
如我们直接请求知乎的页面,输出会返回一个错误。
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>openresty</center>
</body>
</html>
这时我们通过添加头部属性的方式来伪装自己。
头部信息的属性在浏览器的开发者模式中可查看,这里我们添加的是用户代理。
将头部信息分装成字典的形式,用headers这个参数进行传递。
fake_head = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
response = requests.get("https://www.zhihu.com", headers = fake_head)
# 此时输出的内容便是正常的源码信息
print(response.text)
POST传参:
通过POST请求页面,将参数以字典的形式保存,利用data这个参数将数据以表单的方式进行传递。
my_data ={
"name": "turbo",
"age": 23
}
response = requests.post("http://httpbin.org/post", data=my_data)
print(response.text)
输出:
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "23",
"name": "turbo"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "17",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.21.0"
},
"json": null,
"origin": "123.139.165.119, 123.139.165.119",
"url": "https://httpbin.org/post"
}
三、其它用法
异常处理:
所有的异常都包含在requests.excepitons中。
# 导入异常模块
from requests.exceptions import RequestException
try:
response = requests.get("http://httpbin.org/get")
print(response.status_code)
except RequestException:
print("error")
文件上传:
本地工程路径下有对应的待上传文件,通过构造一个字典,用POST方法的files属性进行传递。
my_file = {"files": open("icon.jpg", "rb")}
response = requests.post("http://httpbin.org/post", files = my_file)
# 在files属性中可以看到文件的二进制数据形式
print(response.text)
会话维持:
以下这段代码的两次请求间是独立的,所以第一次对cookies的设置在第二次请求的response中不会体现。
requests.get("http://httpbin.org/cookies/set/number/123456")
response = requests.get("http://httpbin.org/cookies")
print(response.text)
如果我们需要维持一个会话,让两次请求都通过同一个对象进行,那么我们需要创建一个session对象。
s = requests.session()
s.get("http://httpbin.org/cookies/set/number/123456")
response = s.get("http://httpbin.org/cookies")
print(response.text)
这样两次的请求都是通过s这一个对象进行的了。
超时设置:
通过timeout属性来设置超时时间。
response = requests.get("http://httpbin.org/get", timeout=0.1)
证书验证:
访问https协议类型的网站有时会涉及证书问题,如12306。
这时可以通过verify属性的设定来正常访问该站点。
但此时我们还会遇见其它安全警告信息,解决方案为:
# 通过requests.package模块导入urllib3来实现
from requests.packages import urllib3
# 关闭警告提示
urllib3.disable_warnings()
response = requests.get("https://www.12306.cn",verify=False)
print(response.status_code)
代理设置:
同样以字典的形式传入proxies参数。
proxies= {
"http":"http://127.0.0.1:9999",
"https":"http://127.0.0.1:8888"
}
response = requests.get("https://www.baidu.com",proxies=proxies)
若代理需要设置用户名以及密码,则格式为:
proxies = {
"http":"http://user:password@127.0.0.1:9999"
}
认证设置:
部分网页或许需要认证信息,可以通过requests.auth模块实现。
from requests.auth import HTTPBasicAuth
response = requests.get("http://120.27.34.24:9001/",auth=HTTPBasicAuth("user","123"))
print(response.status_code)
参考: