今天开始学习爬虫了,主要参考的是崔庆才的《python3 网络爬虫开发实战》。
由于第一章主要是python环境的搭建以及一些可能用到的库的安装,所以直接从第二章开开始学习,需要什么装什么。
今天主要学习的是关于爬虫的一些基础知识。
HTTP基本原理
URI:Uniform Resource Identifier 统一资源标志符
URL:Uniform Resource Locator 统一资源定位符
URN:Uniform Resource Name 统一资源名称(只命名资源,不指定如何定位)
URL是URI的子集
但是现在,一般来说所有的URL都是URI,很少用URN了。
URL的开头都会有http/https,这是协议类型,ftp/sftp/smb也是协议类型,前者用的较多。
HTTP:超文本传输协议,用于从网络传输超文本数据到本地浏览器的传送协议
HTTPS:HTTP的安全版,HTTP下加入SSL层
HTTP的安全基础是SSL,传输内容经过SSL加密,主要作用是:
1.建立安全通道保证数据传输的安全
2.确认网站的安全性
下面说明一下HTTP的请求过程:
手机/PC端的浏览器向网站所在的服务器发起一个请求,网站服务器接收到该请求后进行处理和解析,然后返回对应的响应,传回给浏览器,响应里包含了页面源代码等内容,浏览器对其进行解析,然后呈现出来。
请求
客户端向服务端发出,分为请求方法、请求的网址、请求头、请求体四部分。
请求方法Request Method
GET/POST
GET:比如说在百度python,就是一个GET请求,URL中包含了请求的参数信息。数据最多1024字节
POST:大多在表单提交时发起,比如说对于登录表单,输入用户名和密码后,点击“登陆”按钮,就发起了一个POST请求,数据以表单方式传输,不表现在URL中,而是包含在请求体中。数据大小无限制。
还有一些其他的请求方法,下图来源于runoob:
请求的网址Request URL
即URL,唯一确定我们想请求的资源
请求头Request Headers
用来说明服务器要使用的附加信息,
- Accept:指定客户端可以接受的信息类型
- Accept-language:指定客户端可以接受的语言类型
- Accept-Encoding:指定客户端可以接受的内容编码
- Host:指定请求资源的主机IP和端口号,是请求URL的原始服务器或网管的位置
- Cookies:比如说用户之前登陆过某网站,服务器存储了登录状态信息,那么后面刷新或请求该站点的其他页面时,服务器通过cookie识别出是该用户,返回的是登陆后才能看到的页面
- Referer:标识该请求从哪个页面发起,服务器可以通过这个信息作来源统计、防盗链处理等
- User-Agent:UA,使服务器识别用户的操作系统以及版本、浏览器以及版本等信息,写爬虫时加上这一信息,可以伪装成浏览器
- Content-Type:表示具体请求中的媒体类型信息,text/html表示HTML格式,image/gif表示GIF,application/json表示JSON,mutipart/form-data表示文件等
在写爬虫时,大多要设定请求头。
请求体Request Body
一般承载的是POST请求的表单数据,对于GET请求,请求体是空的。
响应
服务端返回给客户端,分为响应状态码、响应头、响应体三部分
响应状态码Response Status Code
表示服务器的响应状态:200表示服务器正常响应、404代表页面未找到、500表示服务器内部发生错误等。
响应头Response Headers
包含了服务器对请求的应答信息
- Date:响应产生的时间
- Last-Modified:指定资源的最后修改时间
- Content-Encoding:指定响应内容的编码
- Server:服务器的信息,比如名称、版本号等
- Content-Type:指定返回数据的类型
- Set-Cookie:告诉浏览器需要将该内容放在cookies中,下次请求要携带cookies
- Expires:制定响应的过期时间
响应体Response Body
响应的正文数据,请求网页,响应体就是HTML代码;请求图片,响应体就是图片的二进制数据。
写爬虫请求网页时,解析的内容就是响应体。
网页基础
主要介绍了网页的基本组成、结构和节点等
网页组成
HTML+CSS+JS
网页结构
主要就是介绍了HTML的结构吧
节点树及节点间的关系
HTML中,所有标签定义的内容都是节点,构成了HTML DOM树
选择器
CSS选择节点时,#开头代表id,.开头代表class,还可以直接用标签名来筛选。
可以嵌套
具体语法可以自行搜索
还有一种常用的选择器是XPath,是一种用来确定XML文档中某部分位置的语言。
爬虫的基本原理
爬虫概述
爬虫是一种获取网页并提取和保存信息的自动化程序。
- 获取网页:可以用urllib、requests等库来实现HTTP请求,得到响应后解析body部分。
- 提取信息:得到网页源代码后,要分析源代码,万能方法时采用正则表达式提取,还可以用根据网页节点属性、CSS选择器或XPath来提取网页信息的库(Beautiful Soup、pyquery、lxml等)
- 保存数据:txt、json、数据库、远程服务器
- 自动化程序:爬虫进行异常处理、错误重试等确保爬取持续高效进行
抓取的数据
常规网页一般是html;
有的网页还有大部分的API接口会返回JSON字符串,这种格式方便抓取和解析;
二进制数据,比如图片、音频、视频等;
各种扩展名的文件,比如css、js、config等。
JS渲染页面
有时候我们用requests、urllib抓取的网页得到的源代码和浏览器中见到的不一样,这是因为这些网页由js进行渲染,原始的html可能就是个空壳。
对于这种情况,可以用Selenium、Splash等进行js的模拟。
会话和Cookies
会话和Cookies用于保持HTTP连接状态。
会话在服务端保存用户的会话信息。
Cookies在客户端(浏览器端),浏览器下次访问网页时会自动附带它发送给服务器,然后服务器通过识别Cookies[保存了登陆的凭证]来鉴定是哪个用户,再判断该用户是否为登录状态,然后返回响应。
所以遇到需要登录的界面,一般把登陆后的Cookies放在请求头里直接请求,避免了重新登陆。
会话
用来存储特定用户会话所需的属性以及配置信息。
当用户请求来自应用程序的Web页时,若用户还没有会话,那么Web服务器自动创建一个会话对象,当会话过期或被放弃后,服务器终止该会话。
Cookies
会话维持
客户端第一次请求服务端时,服务器返回一个请求头中带有Set-Cookies字段的响应给客户端,用来标记时哪个客户,客户端会把该Cookies保存起来,当下一次浏览器再次请求该网站时,浏览器把该Cookies放到请求头提交给服务器,由于Cookies携带了会话ID信息,服务器检查Cookies找到对应的会话,然后判断会话来辨认用户的状态。
如果Cookies无效或会话已经过期,则不能继续访问。
属性结构
可以打开开发者工具的Application下查看Cookies的信息,有很多属性
- Name:该Cookie的名称,不可更改
- Value:Cookie值,若为Unicode字符,需要为字符编码;如果是二进制数据,需要用BASE64编码
- Domain:可以利用该Cookie的域名;如果是.zhihu.com这种形式,那么所有以zhihu.com结尾的域名都可以访问该cookie
- Max Age:Cookie有效期,单位为秒,若为负数,那么关闭浏览器则失效
- Path:设置为/path/,只有路径为/path/的页面可访问该Cookie,设置为/,那么本域名下所有页面都可以访问该Cookie
- Size:Cookie大小
- HTTP:httponly属性,若为True,那么只有在HTTP头中会带有此Cookie的信息
- Secure:该Cookie是否被使用安全协议传输,安全协议有HTTPS、SSL等;默认为False
代理的基本原理
运行爬虫时,如果服务器检测到某个IP在单位时间内请求次数超过某个阈值,可能会拒绝服务,这时候需要我们伪装IP,使用代理是一种比较好的方法。
代理实际上指的是代理服务器,proxy server。就是在客户端和服务器之间搭建一个中转站,客户端向代理服务器发起请求,请求由代理发给Web服务器,然后Web服务器把响应发给代理,代理转发给我们。那么这时候,Web服务器识别的真实IP就是代理服务器的IP,所以就实现了IP伪装。
具体到爬虫中,可以通过不断更换代理,避免IP被封锁。一般要使用高匿代理,避免追查到真实IP。