介绍一个爬虫中非常重要的库requests
在介绍requests库之前,先介绍以下基本的http概念。

http协议

HTTP,超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法,HTTP是一种基于”请求与响应”模式的、无状态的应用层协议。HTTP协议采用URL作为定位网络资源的的标识符。
http://host[:post][path]
host:合法的Internet主机域名或ip地址
port:端口号,缺省为80
path:请求资源的路径

HTTP URl的理解:
url是通过HTTP协议存取资源的的Internet路径,一个URL对应一个数据资源
HTTP协议对资源的操作

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得资源的头部信息
POST 请求向URL位置的资源后附加新的消息
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

以上方法中,GET,HEAD是从服务器获取信息到本地,PUT,POST,PATCH,DELETE是从本地向服务器提交信息。通过URL和命令管理资源,操作独立无状态,网络通道及服务器成了黑盒子。

安装

1
pip install requests

requests测试

通过get方式向目标url的服务器发送请求,拿到网页的源代码

1
2
3
4
5
6
7
8
9
10
import requests

url = "https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=周杰伦"

headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
}
resp = requests.get(url,headers = headers)

print(resp.text) #拿到页面源代码

这里需要注意我们为什么要在请求头中加入user-agent

User-Agent介绍

User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面。

我们知道,网络爬虫使用程序代码来访问网站,而非人类亲自点击访问,因此爬虫程序也被称为“网络机器人”。绝大多数网站都具备一定的反爬能力,禁止网爬虫大量地访问网站,以免给网站服务器带来压力。本节即将要讲解的 User-Agent 就是反爬策略的第一步。

网站通过识别请求头中 User-Agent 信息来判断是否是爬虫访问网站。如果是,网站首先对该 IP 进行预警,对其进行重点监控,当发现该 IP 超过规定时间内的访问次数, 将在一段时间内禁止其再次访问网站。

用人话来讲,在请求头中加入User-Agent 可以让我们的行为更像是一个人在访问网站,这是一种简单的反爬手段

requests库7个主要方法

方法 说明
requsts.requst() 构造一个请求,最基本的方法,是下面方法的支撑
requsts.get() 获取网页,对应HTTP中的GET方法
requsts.post() 向网页提交信息,对应HTTP中的POST方法
requsts.head() 获取html网页的头信息,对应HTTP中的HEAD方法
requsts.put() 向html提交put方法,对应HTTP中的PUT方法
requsts.patch() 向html网页提交局部请求修改的的请求,对应HTTP中的PATCH方法
requsts.delete() 向html提交删除请求,对应HTTP中的DELETE方法

最常用的也就get()post()两个方法

接下来我们看一个小案例

通过向百度翻译发送请求实现在控制台翻译

我们首先进入到百度翻译网站

打开F12抓包工具,进入Network,在翻译框中输入‘dog’

找到sug,点击Preview

我们发现sug这个链接就可以拿到单词的相关翻译

回到请求头,请求方式是post

这意味着会发送一个叫做Form Date的参数

使用get方法发送请求会把传递的参数直接拼接在url里,而使用post方法发送请求会将参数放在Form Date中

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time
from os import times

import requests

url = "https://fanyi.baidu.com/sug"

s = input("请输入你要翻译的英文单词")

dat = {
"kw":s
}

#发送post请求

resp = requests.post(url,data = dat,headers=head)


print(resp.json()) #将服务器返回的内容直接处理成json,相当于python中的json

这里服务器返回的是json格式的数据,所以我们用resp.json()对数据进行解析。

爬虫爬取豆瓣喜剧电影排行榜

拿到请求的url

url地址为https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=0&limit=20
注意观察这个url,?后的部分是参数,在实际应用过程中,可以换一种方式传参。我们点击Payload,可以将这个参数进行封装。

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests

url = "https://movie.douban.com/j/chart/top_list"

#重新封装参数

param = {
"type": "24",
"interval_id": "100:90",
"action":"",
"start": 1,
"limit": 20
}

resp = requests.get(url=url,params=param)

print(resp.text)

我们看到服务器没有给返回任何结果,这一般都是被反爬了。首先可以尝试添加User-Agent。在这之前,可以看看默认的User-Agent是什么。

1
print(resp.request.headers)

我们添加User-Agent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests

url = "https://movie.douban.com/j/chart/top_list"

#重新封装参数

param = {
"type": "24",
"interval_id": "100:90",
"action":"",
"start": 1,
"limit": 20
}
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
}
resp = requests.get(url=url,params=param,headers=headers)

print(resp.json())

resp.close() #关掉resp

成功拿到了想要的数据