爬虫第二篇——requests初级教程

爬虫教程——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,一些自己解决了,剩下的问题我也会慢慢地改,如果看到这篇文章的你知道我错在那里,记得评论区告诉我呀,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stanhuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值