爬虫学习笔记(二)
介绍一个爬虫中非常重要的库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 | import requests |
这里需要注意我们为什么要在请求头中加入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 | import time |
这里服务器返回的是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 | import requests |
我们看到服务器没有给返回任何结果,这一般都是被反爬了。首先可以尝试添加User-Agent。在这之前,可以看看默认的User-Agent是什么。
1 | print(resp.request.headers) |
我们添加User-Agent
1 | import requests |
成功拿到了想要的数据