一、爬虫的概念:
口语版:也叫网络蜘蛛,它是批量下载网络资源的程序
专业版:网络爬虫是伪装成客户端与服务端进行数据交互的程序
二、爬虫的应用:
1. 数据采集 例:收集数据,大数据
2. 搜索引擎 例:百度,谷歌搜索引擎都属于爬虫技术
3. 模拟操作 例:模拟用户操作,测试机器人,灌水机器人
三、爬虫的请求过程:
发送请求(请求获取网页中HTML文件等数据)
应用程序(如浏览器) ----------------------------------------------> 应用程序(如网站后台)服务器
应用程序(如浏览器) <---------------------------------------------- 应用程序(如网站后台)服务器
获得响应(根据请求返回网页HTML文件等数据,进行加载和渲染后显示出页面给我们)
四、爬虫需要了解的一些常识:
1.url指定了一个固定网络资源(统一资源定位符)是用来标识某一处资源的地址,也就是我们常说的网址.
2.爬虫需要考虑到效率,但更重要的是需要考虑到被爬取网站的承受能力,即你必须考虑到你的爬虫不会对网站造成严重的影响,你的请求次数绝对不可以超过网站可以同一时间的最大响应次数
3.如果一个网站有robots.txt,那么robots.txt文本文档规定了哪些爬虫可以来获取我的资源,哪些爬虫不可以来获取我的资源,例如,百度可以通过https://www.baidu.com/robots.txt来查看该文档
4.HTTPS协议的默认端口是443
5.http协议是基于tcp/ip协议的,而https是在http协议的基础之上,在加了一层SSL/TLS协议,数据在传输过程中是加密的
6.提供http服务的服务器会默认监听80端口
7.如果我们想要查看一个网页的源代码,可以通过右键网页查看元素或右键网页查看网页源代码
8.需要注意的是,我们查看元素(即在Elements中的html代码)和我们查看网页源代码的html可能是不同的,因为element中的代码是经过js和css来加载和渲染后执行完毕的代码(属于动态数据),而我们右键点击查看的网页源代码使我们请求后的html数据,未经任何渲染和加载(属于静态数据)。
9.网站的反爬技术即让我们只能爬到未经过渲染之前的数据,通过渲染后的数据不让我们获得到.
10.http协议:是超文本传输协议的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议,即网上信息交流需要遵循的协议规定.
11.请求后获得响应的状态码:(分为5种)
1** 以1为开头的状态码,信息,服务器首都请求,需要请求者继续执行操作
2** 以2位开头的状态码,一般为200,代表请求数据成功
3** 以3位开头的状态码,重定向,需要进一步操作以完成请求
4** 以4为开头的状态码,客户端错误,请求包含语法错误或无法完成请求,例如我们调试网页时出现的404,403错误
5** 以5位开头的状态码,服务器错误,服务器在处理请求的过程中发生了错误
五、爬虫的请求报文:
包括以下部分:请求行,请求头,空行,和报文主体
请求报文第一行:请求行: GET / HTTP/1.1 # 其中GET 是请求的方式(包括GET和POST两种,get方法请求数据会将参数在url上显示出来,Post就不会)
/ 是指该请求的网站的域名后面只有一个/ 例如: https://www.baidu.com/ ,如果说你请求的网站是这样的:http://588ku.com/?h=bd&sem=1 那么你的这个位置就应该写成 /?h=bd&sem=1
HTTP/1.1 是指使用的http协议的版本,大部分网站都是1.1版本的,但是现在2.0版本也出了,部分网站用的是2.0版本的
需要注意的是: 在你的请求方式的后面和http协议版本的前面均要有一个空格,这使它符合http协议的规定,不然你的请求可能会出错
请求的域名: HOST: www.baidu.com # HOST 是固定的名称,代表这一行是发送的我们请求的域名,域名一般在http://之后或者https://之后和出现的第一个/之前
www.baidu.com 是我们所请求的域名,例如:https://www.baidu.com/的域名就是www.baidu.com
发送请求的客户端版本身份:
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
# User-Agent 是固定的名称,代表这一行是发送请求的客服端的版本(即客户端的请求身份,如果是我们写的python程序访问,我们该行不修改或不写,它将自动补充成python的版本,而不是浏览器的版本)
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0 这个是我发送请求的客户端是火狐浏览器
注意:请求头的每一行的末尾都要加上\r\n # \r\n 是window中的换行, \r 是mac的换行, \n 是linux中的换行
而且在请求头的末尾应该再加上一个\r\n,即整个请求头应该以\r\n\r\n来进行结尾。
header = b'GET /?h=bdsem=1 HTTP/1.1\r\nHost: 588ku.com\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n' print(header) # 打印出我们的写的一个简单的请求头
打印结果如下:
六、爬虫中请求报文的需要注意的:
1. 如果我们的域名后的数据过长,那么为了美观我们难免要换行,这个时候就需要注意了,如果是以下这种三引号的方式(错误)来进行换行:
http_req = b'''GET /photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image /aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA= /dissolve/50/gravity/Center/ws/1 HTTP/1.1\r\n Host: images.gaga.me\r\n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n ''' print(http_req)
打印结果为:
很明显我们可以看到,我们自己写的报文被打印出来每个\r\n的后面都多个个\n,这会导致我们的请求头报文错误,因为我们在三引号中的换行,系统都自动给我们补全了一个\n,那么如何处理呢,我们可以在每一行的后面多加一个\,来达到我们仅仅是书写的板式的换行,而内容并没换行的效果。(正确)代码如下:
http_req = b'''GET /photos2/2019/0416/5cb5e9950e25a.jpeg?watermark/1/image\ /aHR0cDovL3Jlcy5nYWdhLm1lL3dhdGVybWFyay9wYWl4aW4xLnBuZz9pbWFnZVZpZXcyLzIvdy80MDAvaC80MDA=\ /dissolve/50/gravity/Center/ws/1 HTTP/1.1\r\n\ Host: images.gaga.me\r\n\ User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0\r\n\r\n\ ''' print(http_req) #打印我们的请求报文
打印结果为:
这样的话我们的报文内容就没有被修改了。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
本文仅为个人学习笔记,如有侵权或者相关的python问题想要与我联系或指正,可发送至1730797947@qq.com邮箱,我会及时删除文章或回复消息