一、什么是爬虫
<b>爬虫:又称网页蜘蛛,网络机器人,从互联网上自动抓取数据的程序,通俗地讲,就是可以爬取浏览器中看得到的数据
二、爬虫的基本流程
- 1、分析网站,得到目标url
- 2、根据url,发起请求,获取页面的HTML源码
- 3、从页面源码中提取数据:
- a、提取到目标数据,做数据的筛选和持久化存储
- b、从页面中提取新的url地址,继续执行第二步操作
- 4、爬虫结束:
所有的目标url都提取完毕,并且得到数据了,再也没有其他的请求任务了,这时候就意味着爬虫结束了
三、网页的三大特征
- 1、每一个网页都有一个唯一的url(统一资源定位符)来进行定位
- 2、网页都是通过HTML(超文本标记语言)文本展示的
- 3、所有的网页都是通过http(超文本传输协议)或https协议来传输的
四、通用爬虫和聚焦爬虫
(一)通用爬虫:
是搜索引擎的重要组成部分
1、 目的:
尽可能的将所有的互联网上的网页下载到本地,经过预处理(去噪、分词、去广告等等),最终将数据存储到本地,做一个镜像备份,形成一个检索系统
2、通用爬虫抓取网页的流程:
(1)选取一部分的URL作为种子URL,将这些URL放入到带爬去的任务队列里面
(2)从带爬取的任务队列中取出URL,发起请求,将获取到的网页源码存储到本地,并将已经爬取过的URL放入已爬取的队列中
(3)从已爬取URL的响应结果中,分析提取其他的URL地址,继续添加到待爬取队列中,之后就是不断的循环,知道所有的URL都提取完毕
3、通用爬虫中的种子URL如何获取
(1)通过网站提交自己的网站地址(https://ziyuan.baidu.com/linksubmit/url)
(2)搜索引擎会和DNS服务商(DNS服务:将我们的域转换为对应IP的一种技术)合作,拿到最新的网站地址
(3) 网站中包含的其他外链
4、通用爬虫的整体流程:
数据的获取 -> 预处理(分词,去噪,去广告……)-> 存储 -> 提供检索接口|排名(网站排名)
5、网站排名:
(1)根据用户的访问量,网站的流量越多,越靠前
(2)竞价排名:谁出价高,谁就排在前面
6、 通用爬虫的缺点:
(1)必须遵守robot协议
就是一个规范,告诉搜索引擎,哪些目录下的资源允许爬取,哪些目录下的资源不允许爬取(https://www.taobao.com/robots.txt)"User-agent":该项值用来表示是哪家的搜索引擎
"allow":允许被爬取的URL
"disllow":不允许被爬取的URL
(2)搜索引擎返回的都是网页,并且返回的90%的都是无用的数据
(3)不能够根据不同的用户的需求或者检索结果返回不同的结果
(4)通用爬虫对于媒体的文件不能够获取
(二)聚焦爬虫:
聚焦补充是面向主题的爬虫,再爬取数据的过程中会对数据进行筛选,往往只会爬虫与需求相关的数据
五、Robot.txt是什么,里面的参数是什么意思
1、Robot:
(也叫爬虫协议、机器人协议等),全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
2、Robot协议中的参数:
(1)User-agent: Baiduspider
识别是哪家的爬虫
(2)Allow: /article
允许爬取的目录
(3)Allow: /oshtml
(4)Allow: /ershou
(5)Allow: /$
(6)Disallow: /product/
不允许爬取的目录
(7)Disallow: /
六、七层协议(OSI协议:从上向下)
应用层
为用户的应用程序提供网络服务的(HTTP、HTTPS、FTP……)
表示层
负责端到端的数据信息可以被另一个主机所理解和识别,并且按照一定的格式将信息传递到会话层
会话层
会话层是管理主机之间的会话进程,负责建立,管理,和终止会话进程
传输层
进行数据传输的(TCP UDP)
TCP和UDP
区别 | TCP | UDP |
---|---|---|
传输方式上 | 面向连接的 | 非面向连接的 |
传输的数据 | 传输的是数据流 | 传输的是数据包(可能会出现丢包) |
传输的效率 | 慢 | 快 |
传输的稳定性 | 高 | 低 |
网络层
路由器
数据链路层
网桥 交换机
物理层
网线 网卡 集线器 中继器
七、http和https协议
HTTP协议:
HyperText Transfer Protocol 中文名叫超文本传输协议: 是用于从网络传送超文本数据到本地浏览器的传送协议,端口号:80
HTTPS协议
Hypertext Transfer Protocol over Secure Socket Layer 简单讲是HTTP的安全版,在HTTP协议的基础上加入SSL层(HTTP+SSL),端口号:443
八、url的基本组成部分
URI
Uniform Resource Identifier:统一资源标识符
URL
Uniform / Universal Resource Locator的缩写:统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
URN
Universal Resource Name:统一资源名称,只命名资源而不指定如何定位资源
九、发起一个请求基本流程
- 当用户 在浏览器的地址栏中输入一个URL并按回车键之后(会先经过DNS服务将域名解析为ip),浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。
- 当我们在浏览器输入URL http://www.baidu.com 的时候,浏览器发送一个Request请求去获取 http://www.baidu.com 的html文件,服务器把Response文件对象发送回给浏览器。
- 浏览器分析Response中的 HTML,发现其中引用了很多其他文件,比如Images文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件。
- 当所有的文件都下载成功后,网页会根据HTML语法结构,完整的显示出来了。
十、get请求和post请求的区别
- GET是从服务器上获取数据,POST是向服务器传送数据
- GET请求参数显示,都显示在浏览器网址上,HTTP服务器根据该请求所包含URL中的参数来产生响应内容,即“Get”请求的参数是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese
- POST请求参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等),请求的参数包含在“Content-Type”消息头里,指明该消息体的媒体类型和编码.
十一、请求头参数和响应头里面的参数
请求头参数
- User-Agent
User-Agent:是客户浏览器的名称。
- Cookie
浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。
- Referer
表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面, 是从什么网站来的等。
有时候遇到下载某网站图片,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链,原理就是根据referer去判断是否是本网站的地址 ,如果不是,则拒绝,如果是,就可以下载;
- Content-Type
POST请求里用来表示的内容类型。
举例:Content-Type = Text/XML; charset=gb2312:
指明该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。
- Host (主机和端口号)
对应网址URL中的Web名称和端口号,用于指定被请求资源的Internet主机和端口号,通常属于URL的一部分。
- X-Requested-With: XMLHttpRequest
表示是一个Ajax异步请求
- Connection (链接类型)
表示客户端与服务连接类型
- Client 发起一个包含 Connection:keep-alive 的请求,HTTP/1.1使用 keep-alive 为默认值。
- Server收到请求后:
(1) 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;
(2) 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。
(3) 如果client收到包含 Connection:keep-alive 的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。
- keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间,比如当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都去请求建立连接。
- Upgrade-Insecure-Requests (升级为HTTPS请求)
升级不安全的请求,意思是会在加载 http 资源时自动替换成 https 请求,让浏览器不再显示https页面中的http请求警报。
HTTPS 是以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 HTTP 请求,一旦出现就是提示或报错。
- Accept (传输文件类型)
指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions(多用途互联网邮件扩展))文件类型,服务器可以根 据它判断并返回适当的文件格式。
举例:
Accept: /:表示什么都可以接收。
Accept:image/gif:表明客户端希望接受GIF图像格式的资源;
Accept:text/html:表明客户端希望接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有 的图像格式资源。
q是权重系数,范围 0 =< q <= 1,q 值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被 赋值为0,则用于表示浏览器不接受此内容类型。
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Application:用于传输应用程序数据或者二进制数据。(http://blog.sina.com.cn/s/blog_866e403f010179f1.html)
- Accept-Encoding(文件编解码格式)
指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应 之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。
举例:
Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0
如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。
如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
- Accept-Language(语言种类)
指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。
- Accept-Charset(字符编码)
指出浏览器可以接受的字符编码。
举例:
Accept-Charset:gb2312,utf-8
gb2312:标准简体中文字符集;
utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。
响应头参数
- Cache-Control:must-revalidate, no-cache, private。
是否需要缓存资源
- Connection:keep-alive
保持连接
- Content-Encoding:gzip
web服务器支持的返回内容压缩编码类型
- Content-Type:text/html;charset=UTF-8
文件类型和字符编码格式
- Date:Sun, 21 Sep 2016 06:18:21 GMT
服务器消息发出的时间
- Expires:Sun, 1 Jan 2000 01:00:00 GMT
响应过期的日期和时间
- Pragma:no-cache
这个含义与Cache-Control(是否缓存资源)等同。
- Server:Tengine/1.4.6
服务器和服务器版本
- Transfer-Encoding:chunked
这个响应头告诉客户端,服务器发送的资源的方式是分块发送的。
- Vary: Accept-Encoding
告诉缓存服务器,缓存压缩文件和非压缩文件两个版本,现在这个字段用处并不大,因为现在的浏览器都是 支持压缩的。 响应状态码 响应状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
Cookie 和 Session:
服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。
为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息。
Cookie:通过在 客户端 记录的信息确定用户的身份。
Session:通过在 服务器端 记录的信息确定用户的身份。
十二、请求常见的状态码
200:
请求成功
301:
永久重定向
302:
临时重定向
400:
客户端错误
401:
未授权
403:
服务器拒绝访问
404:
页面未找到
405:
请求方式不对
408:
请求超时
500:
服务器错误
503:
服务器不可用
十三、bytes类型和str字符串类型的相互转换,bytes和bytearray的区别
转换
将bytes类型的数据转换为字符串使用decode('编码类型')
将字符串转换为bytes类型的数据使用encode('编码类型')
区别
bytearray和bytes类型的数据是有区别的:前者是可变的,后者是不可变的
十四、如何发起一个get请求
1、使用urllib发送请求
2、得到url目标地址
3、使用urlopen方法模拟浏览器发起请求