其实,我们有专门的网络库进行直接的网络请求与处理,它就是requests库。在我们开始讲解与使用之前,需要通过如下命令进行安装:
pip install requests
首先,我们先来看看Requests库可以进行哪些操作:
- 发送HTTP请求
- 上传文件
- 处理Cookie
- 支持Session会话
- 使用代理
- 身份验证
- 打包请求
- SSL证书验证
下面,我们来一一介绍这些操作具体是如何实现的。
发送HTTP请求与urllib与urllib3一样,HTTP请求常用的是GET请求与POST请求。
GET请求其中,GET请求使用的方式是requests.get()。它可以设置参数params,也可以设置超时timeout,同时也可以设置请求头headers。
示例如下:
import requests
url = "HTTPS://www.CSDN.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.get(url=url, timeout=1, headers=headers)
#打印网页源代码
print(result.text)
#打印响应状态码
print(result.status_code)
#打印Cookie
print(result.cookies)
#打印result类型
print(type(result))
运行之后,输出如下:
POST请求接着,我们来介绍POST请求。这里,我们同样使用测试网站http://httpbin.org/post,向它发送一些数据。示例如下:
import requests
url = "http://httpbin.org/post"
data = {
"name": "liyuanjing",
"age": "29"
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.post(url=url, timeout=1, headers=headers, data=data)
# 打印网页源代码
print(result.text)
# 将其转换为json
print(result.json())
运行之后,效果如下:
抓取二进制图片对于文本文件的获取,我们很简单的通过text进行处理分析。但是假如我们是获取的一张图片显然text是无法还原真实内容。
不仅如此,图片的text是乱码。所以,我们需要将获取到的图片二进制数据通过相应的API保存为文件。示例代码如下:
import requests
url = "https://img1.baidu.com/it/u=954496120,1621506021&fm=26&fmt=auto&gp=0.jpg"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
result = requests.get(url=url, timeout=1, headers=headers)
with open('requests.png', 'wb') as f:
f.write(result.content)
运行之后,就会在程序目录的统计目录下生成一张图片,当然图片链接读者可以自己去找。这里的链接暂时有效。
上传文件需要注意的是,response.text是Unicode编码,而response.content是原始二进制字节流,这一点要额外注意,如果网页出现乱码,可以使用response.encoding=”gbk”进行设置解析。
与讲解urllib3一样,我们这里上传文件的服务器端口,由Flask编写。我们先来看看服务器端的代码:
import flask
import os
UPLOAD_file = 'uploads'
app = flask.Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():
file = flask.request.files['file']
if file:
file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))
return '文件上传成功'
else:
return '文件上传失败'
if __name__ == '__main__':
app.run()
运行此段代码,默认会一致运行等待下去。
而使用requests进行文件的上传,也非常的简单,因为文件上传是Post请求,我们只需要设置file参数。示例如下:
import requests
url = "http://127.0.0.1:5000"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
files = {
"file": open('123.png', 'rb')
}
result = requests.post(url=url, files=files)
print(result.text)
运行之后,会在项目文件uploads文件夹下多一个123.png图片,当然123上传时的文件必须存在。同时也要事先创建uploads文件夹。
处理Cookie一般来说,爬虫分为2个部分:首先是登录,然后才是爬取。而在登录时,我们一般使用selenium,进行cookie的返回。
接着使用requests进行爬取网页的源代码,因为selenium是一个专门的库,后面我们会介绍,这里我们先假设我们获取到了cookie。
直接将Cookie设置到请求头为了更有意思,我们在chrome按F12之后,用浏览器评论一个CSDN帖子,会捕捉到如下图所示的请求数据:
这里,我们可以复制cookie数据到我们的headers之中。
同时下面有一个提交表单,其中,content是我们评论CSDN的内容,articleId是我们评论CSDN的帖子,读者可以自己看看CSDN帖子是否有一串数字。
通过请求头,评论CSDN那么,我们可以仿照这个请求连接,通过requests完成CSDN的评论操作,示例代码如下所示:
import requests
url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'cookie': 'CSDN登录后返回的cookie',
}
data = {
"commentId": "",
"content": "最近正在学习刚好能用上",
"articleId": "118750834",
}
result = requests.post(url=url, data=data, headers=headers)
print(result.status_code)
运行之后,控制台会输出200,同时评论帖子下面会多出一条评论数据。
RequestsCookieJar()除了通过请求头设置Cookie进行访问之外,其实我们的post()方法还有一个专门的cookies参数,它用于接收RequestsCookieJar对象。
示例如下:
import requests
url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
cookieStr = 'CSDN登录后返回的cookie'
data = {
"commentId": "",
"content": "最近正在学习刚好能用上",
"articleId": "118517922",
}
jar = requests.cookies.RequestsCookieJar()
for cookie in cookieStr.split(";"):
key, value = cookie.split('=', 1)
jar.set(key, value)
result = requests.post(url=url, data=data, headers=headers, cookies=jar)
print(result.status_code)
这段代码与前文运行效果一样,这里不在输出运行结果,仅仅只是cookie使用方式的不同形式。
Session会话cookie数据保存在客户端,Session数据保存在服务器端,一个Session代表一个特定的客户端。那么如何在特定的客户端与服务器端的Session对象之间建立联系呢?
通常就是不断在客户端与服务器端之间来回传递一个ID,通过这个ID,客户端就能在服务器端找到对应的Session对象。
在实际的爬虫项目中,有时候需要使用同一个客户端来多次抓取页面,就可以用到Session。示例代码如下:
result = requests.post(url=url, data=data, headers=headers, cookies=jar)
session = requests.Session()
r2 = session.post(url=url, data=data, headers=headers, cookies=jar)
print(r2.status_code)
这里,我们将上面的Cookie代码改一改即可。
使用代理对于requests库来说,使用代理非常简单,因为get与post函数都有一个proxies参数,用于设置代理即可。示例如下:
import requests
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
proxies = {
'http': 'http://183.47.138.80:8888',
'http': 'http://125.78.226.217:8888'
}
result = requests.post(url=url, proxies=proxies)
需要注意的是,这里的代理IP博主测试的时候是有效的,但读者可能读到的时候已经失效,读者可以自己去网络搜寻免费的代理测试。
除了基本的HTTP代理,Request还支持SOCKS协议的代理。这是一个可选的功能,若要使用,需要使用下面的命令安装第三方库。
pip install requests[socks]
安装完成之后,替换proxies即可。
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
身份验证
requests库还提供了身份验证功能,其中,get与post方法有一个auth参数专门用于身份验证,传入的参数是HTTPBasicAuth,示例代码如下:
import requests
from requests.auth import HTTPBasicAuth
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
result = requests.post(url=url, auth=HTTPBasicAuth('name', 'password'))
print(result.status_code)
这里,只是给读者展示如何通过代码进行身份验证,如果你自己编写服务器,可以通过如上代码进行操作,这里就不编写了。
打包请求不管是上面的get请求还是post请求,我们都是通过requests.get或者requests.post进行操作的,但其实我们可以将请求参数单独列出来打包。
也就是,俗称的封装。示例代码如下所示:
import requests
url = "https://www.csdn.net/"
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}
req = requests.Request('get', url=url, headers=headers)
session = requests.Session()
prepared = session.prepare_request(req)
result = session.send(prepared)
print(result.text)
这里,通过Request进行封装请求数据,然后调用Session的prepare_request方法处理Request对象,并返回一个requests.models.Response对象。
最后,通过Session.send方法发送Response对象。
SLL证书验证在requests请求中,有一个verify的参数。访问HTTPS时,如果需要验证SSL证书,可以不设置改数据,它默认为True表示验证证书。
如果不需要验证证书,可以设置verify等于False,那么就不会进行验证。验证的代码很简单,就是什么也不用做即可,代码如下:
import requests
try:
url = "https://www.csdn.net/"
result = requests.get(url)
print(result.status_code)
except requests.exceptions.SSLError as e:
print(e.args[0])
如果你的网站没有SLL证书,或者证书未经过权威机构认证,则会抛出SSLError异常。
如果你的网站有SLL证书,且经过了权威的认证,那么就不会抛出异常。
而如果你不想验证证书的话,可以将代码修改未如下代码:
import requests
try:
urllib3.disable_warnings()
url = "https://www.csdn.net/"
result = requests.get(url, verify=False)
print(result.status_code)
except requests.exceptions.SSLError as e:
print(e.args[0])
不过,它会报InsecureRequestWarning警告信息,如果需要禁止输出警告信息,可以使用urllib3.disable_warnings()进行屏蔽。
喜欢的别忘了关注,帮我三连一下吧~
原文链接:https://blog.csdn.net/liyuanjinglyj/article/details/118734748