爬虫教程——requests初级教程
一、模块安装
在环境jupyter中安装requests模块
!pip install requests
安装成功:
二、requests初体验
首先,我们以百度为例子来演示requests模块
import requests
r = requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text)
print(r.cookies)
运行后的结果如下:
在这里我们得到的是一个 Response 对象,然后分别输出了 Response 的类型(红)、状态码(绿)、响应体的类型(蓝)、内容(黑)以及 Cookies(黄)。下面会具体讲,这里只是一个小例子,继续往下看吧。
三、get请求
3.1 基础讲解一
现在我们仍然以百度作为例子,利用get请求网址,打印txt则获取到百度页面源码:
https://www.baidu.com/
import requests
r = requests.get('https://www.baidu.com/')
print(r.text)
运行:
这里用百度作为例子是因为百度不会被反扒,如果被反扒,返回为空。
3.2 基础讲解二
接下来我们以B站为例,使用requests模块的get函数直接获取
import requests
u = requests.get('https://www.bilibili.com/')
print(u.status_code)#打印状态码
print(u.cookies)#打印cookie
print(u.text)#打印文本
运行:
这两个例子中我们都成功请求到了内容,再举一个被反扒的例子,比如用put,post,delete等请求方法:
import requests
r = requests.post('https://www.csdn.net/?spm=1001.2014.1000.2115')
s = requests.put('https://www.csdn.net/?spm=1001.2014.1000.2115')
print(r.status_code)
print(r.text)
print(s.status_code)
print(s.text)
3.3 基础讲解三
首先,对网站构建一个get 请求,请求后该网站会判断客户端发起的是 get 请求,它返回相应的请求信息。
这里我们请求的链接为 http://httpbin.org/get。
http://httpbin.org/get
import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
运行:
这样我们就成功发起了get请求,返回结果中包含请求头、url、IP等信息。
那么,如果我们怎样在get请求中添加额外的信息呢?
比如我们要在前一个例子中添加name是germey、age是22这两个参数,要怎么做呢?
直接利用params这个参数就可以了:
import requests
data = {
'name':'germey',
'age':22
}
r = requests.get("http://httpbin.org/get",params=data)
print(r.text)
运行:
通过返回信息我们可以发现请求的链接自动被构造成了:http://httpbin.org/get?age=22&name=germey
另外,网页的返回类型实际上是 str 类型,但是它很特殊,是 JSON 格式的。所以,如果想直接解析返回结果,得到一个字典格式的话,可以直接调用 json 方法。示例如下:
import requests
r = requests.get("http://httpbin.org/get")
print(type(r.text))
print(r.json())
print(type(r.json()))
这里我们可以发现,调用json方法后,得到的返回结果是字典格式。
3.4 获取cookie
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'
}#请求头
url='https://www.csdn.net/?spm=1001.2014.1000.2115'
r=requests.get(url=url,headers=headers)
print(r.cookies)#打印cookie
运行:
这里headers请求头是什么意思呢,
客户端在浏览器发送请求给服务器时,会携带请求头,在请求头中有一个User-Agent属性,User-Agent是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
那么,又是怎么获取的呢?
3.5 获取请求头
手动获取:
在任意网页右键检查—>选择网络(network)—>随机选其中,得到如图所示的User-Agent:
得到后,直接复制就可以。
3.6 添加请求头
如果不添加请求头会怎样呢?
import requests
r = requests.get("https://www.zhihu.com/")
print(r.text)
运行:
很明显,不添加请求头我们请求失败了,加上再试试:
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'
}#请求头
r = requests.get("https://www.zhihu.com/",headers =headers )
print(r.text)
运行:
加上User-Agent属性后,请求就成功了。
通过这个例子我们就知道为什么要添加请求头了,为了模拟正常浏览器,防止被反扒。
3.7 知乎爬取+反扒技术
先获取cookie,或者登录知乎,找到cookie,用获取到的cookie来获取网页
先看第一种方法:
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'
}#请求头
url = 'https://www.zhihu.com/'
r = requests.get(url=url,headers =headers )
print(r.cookies)
运行:
第二种方法:
import requests
headers={
'cookie': '_zap=bf693aa3-9fb3-445e-8ed5-ec0d59c7d10d; d_c0="AGDfZ78KtROPTphvy9ZFmOvFMfDwYZtiYsw=|1631347036"; _xsrf=ipOs9l35YFUurPihZ5Uc3QQ95BVoqePr; captcha_session_v2="2|1:0|10:1636707206|18:captcha_session_v2|88:dGtlTTJ3bTcvZkVxeStHZU00YjIrSUFmKytvelRhaXJLUHQ5bUxJOTBURkdrb3FEK3hlVitxUEY2SVpMMEhqaw==|fd38481b8a273c2304147f7117e8093f78891a2bfac62a3cf3c9b88d50738248"; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1634447239,1635413640,1636547329,1636707205; z_c0="2|1:0|10:1636707239|4:z_c0|92:Mi4xbXppWkR3QUFBQUFBWU45bnZ3cTFFeWNBQUFDRUFsVk5wN2kxWVFDN1NyOEZJRy1zSmpSTDFRdVMyNDJYLUo5UXFB|4ad12a0760ab51593a762898c95397759242ccb549f7c4ab410c49f4db38ebe9"; NOT_UNREGISTER_WAITING=1; tst=r; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1636708108',
'host': 'www.zhihu.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
}
url = 'https://www.zhihu.com/'
r = requests.get(url = url,headers = headers)
print(r.text)
运行:
这里刚开始写的时候我出现了bug,一检查是个特别蠢的错误,把错误截图放在下面,大家对比一下找找原因,希望大家写的时候认真一点,不要像我一样:
返回结果有知乎里的相关内容,这样就是成功登录知乎了
再提一点session,它可以实现同一个站点进去不同页面:
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/147258369')
r=s.get('http://httpbin.org/cookies')
print(r.text)
运行:
3.8 抓取二进制数据
二进制数据都包括哪些呢?其实图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,所以,想要抓取它们,就要有它们的二进制码。
3.8.1 例一
以 GitHub 的站点图标为例:
import requests
r = requests.get("https://github.com/favicon.ico")
print(r.text)
print(r.content)
运行:
可以看到前面都是乱码,乱码后面出现了一个b,这代表是 bytes 类型的数据。图片是二进制数据,在打印时转化为 str 类型,也就是图片直接转化为字符串,所以前面会出现乱码。
接着,我们将刚才提取到的图片保存下来:
import requests
r = requests.get("https://github.com/favicon.ico")
with open('favicon.ico','wb') as f:
f.write(r.content)
运行后我这里出现了bug,目前还没有解决,大佬们知道为什么可以评论区告诉我呀。
3.8.2 例二
爬取我自己的CSDN头像:
import requests
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'
}#请求头
url = 'https://avatar.csdnimg.cn/A/3/9/1_stanhuo_1636704922.jpg'
r = requests.get(url = url, headers = headers)
with open('photo.jpg','wb') as f:
f.write(r.content)
这里还是出现了一点问题,图像加载不出来,不清楚是网络问题还是其他原因。
更新!!!
知道原因了,是我的问题,头像违规了所以 呃…
修改之后就没有问题啦!
四、 POST请求
除了get之外,另一种比较常见的就是POST请求
4.1 数据表单提交
import requests
data = {'name':'germey','age':'22'}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)
运行:
4.2 添加请求头
import requests
import json
host = "http://httpbin.org/"
endpoint = "post"
url = ''.join([host,endpoint])
headers = {"User-Agent":"test request headers"}
r = requests.post(url,headers=headers)
print(r.text)
运行:
4.3 提交json
# -*- coding:utf-8 -*-
import requests
import json
host = "http://httpbin.org/"
endpoint = "post"
url = ''.join([host,endpoint])
data = {
"sites": [
{ "name":"test" , "url":"https://blog.csdn.net/weixin_46211269?spm=1000.2115.3001.5343" },
{ "name":"google" , "url":"https://blog.csdn.net/weixin_46211269/article/details/120703631?spm=1001.2014.3001.5501" },
{ "name":"weibo" , "url":"https://blog.csdn.net/weixin_46211269/article/details/120659923?spm=1001.2014.3001.5501" }
]
}
r = requests.post(url,json=data)
# r = requests.post(url,data=json.dumps(data))
response = r.json()
print(response)
运行:
4.4 普通文件上传
# -*- coding:utf-8 -*-
import requests
import json
host = "http://httpbin.org/"
endpoint = "post"
url = ''.join([host,endpoint])
#普通上传
files = {
'file':open('test.txt','rb')
}
r = requests.post(url,files=files)
print (r.text)
运行:
可以发现,bug又出现了,为什么呢?因为我并没有创建文件就运行,程序找不到‘text.txt’文件。知道原因了,创建一个text.txt文件就可以了。
内容为:哈哈哈哈哈哈 就可以
然后对文件进行重命名为:text.txt:
再运行:
五、总结
这里主要讲的是requests的基础用法,在写的过程中出现了一些bug,一些自己解决了,剩下的问题我也会慢慢地改,如果看到这篇文章的你知道我错在那里,记得评论区告诉我呀,谢谢!