网络基础专题
五层网络模型
- 应用层—http ftp dns nfs
- 传输层—tcp --udp
- 网络层—ip icmp igmp
- 链路层—data link
- 物理层—media
什么是 2MSL?
- 2MSL 即两倍的 MSL,TCP 的 TIME_WAIT 状态也称为 2MSL 等待状态,当 TCP 的一端发起主动关闭,在发出最后一个 ACK 包后,即第 3 次握手完成后发送了第四次握手的 ACK包后就进入了 TIME_WAIT 状态,必须在此状态上停留两倍的 MSL 时间,等待 2MSL 时间主要目的是怕最后一个 ACK 包对方没收到,那么对方在超时后将重发第三次握手的 FIN包,主动关闭端接到重发的 FIN 包后可以再发一个 ACK 应答包。在 TIME_WAIT 状态时两端的端口不能使用,要等到 2MSL 时间结束才可继续使用。当连接处于 2MSL 等待阶段时任何迟到的报文段都将被丢弃。不过在实际应用中可以通过设置 SO_REUSEADDR 选项达到不必等待 2MSL 时间结束再使用此端口。
tcp 服务器创建流程
1.socket 创建一个套接字
2.bind 绑定 ip 和 port
3.listen 使套接字变为可以被动链接
4.accept 等待客户端的链接
5.recv/send 接收发送数据
什么是TTL,MSL,RTT?
(1)MSL:报文最大生存时间”,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
(2)TTL:TTL 是 time to live 的缩写,中文可以译为“生存时间”,这个生存时间是由源主机设置初始值但不是存的具体时间,而是存储了一个 ip 数据报可以经过的最大路由数,每经过一个处理他的路由器此值就减 1,当此值为 0 则数据报将被丢弃,同时发送 ICMP 报文通知源主机。RFC 793 中规定 MSL 为 2 分钟,实际应用中常用的是 30 秒,1 分钟和 2 分钟等。TTL 与 MSL 是有关系的但不是简单的相等的关系,MSL要大于等于 TTL。
(3)RTT: RTT 是客户到服务器往返所花时间(round-trip time,简称 RTT),TCP 含有动态估算 RTT 的算法。TCP 还持续估算一个给定连接的 RTT,这是因为 RTT受网络传输拥塞程序的变化而变化。
HTTP/HTTPS 的区别
- HTTPS 和 HTTP 的区别:
(1)https 协议需要到 ca 申请证书,一般免费证书很少,需要交费。
(2)http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议
(3)http 和 https 使用的是完全不同的连接方式用的端口也不一样,前者是 80,后者是 443。
(4)http 的连接很简单,是无状态的
(5)HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议 要比http 协议安全
- 应用场合:
(1)http:适合于对传输速度,安全性要求不是很高,且需要快速开发的应用。如 web 应用,小的手机游戏等等.
(2)https:https 应该用于任何场景!
## HTTPS 是如何实现安全传输数据
- HTTPS 其实就是在 HTTP 跟 TCP 中间加多了一层加密层 TLS/SSL。SSL 是个加密套件,负责对 HTTP 的数据进行加密。TLS 是 SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。原先是应用层将数据直接给到 TCP 进行传输,现在改成应用层将数据给到TLS/SSL,将数据加密后,再给到 TCP 进行传输。
HTTPS 安全证书由来
- 如何申请,国内和国外有哪些第三方机构提供安全证书认证。
- 国内:
- 沃通(WoSign)
- 中国人民银行联合 12 家银行建立的金融 CFCA
- 中国电信认证中心(CTCA)
- 海关认证中心(SCCA)
- 国家外贸部 EDI 中心建立的国富安 CA 安全认证中心
- SHECA(上海 CA)为首的 UCA 协卡认证体系
- 国外:
- StartSSL
- GlobalSign
- GoDaddy
- Symantec
常见的HTTP状态码
- 200状态码 服务器请求正常
- 301状态码:被请求的资源已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
- 302状态码:请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置来进行以后的请求
- 401状态码:请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
- 403状态码:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。
- 404状态码:请求失败,请求所希望得到的资源未被在服务器上发现。
- 500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
- 503状态码:由于临时的服务器维护或者过载,服务器当前无法处理请求。
初级爬虫专题
什么是爬虫?
pythoon2.x 中urllib和urllib2的区别
- 异同:都是做url请求的操作的,但是区别很明显。
- urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以通过urllib模块伪装你的User Agent字符串等(伪装浏览器)。
- urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
- 模块比较优势的地方是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header部。
- 但是urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。
robots协议是什么?
- Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
- Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
Request和Response
- 本地 向 服务器 发送Request,服务器根据请求返回一个Response,页面就显示在页面上了
1、浏览器就发送消息给该网址所在的服务器,这个过程叫做Http Request
2、服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处理,然后把消息回传给浏览器,这个过程叫做HTTP Response
3、浏览器收到服务器的Response消息后,会对信息进行相应处理,然后显示
Request中包含什么呢?
1、请求方式:主要有GET和POST两种方式,POST请求的参数不会包含在url里面
2、请求URL
URL:统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一确定
3、请求头信息,包含了User-Agent(浏览器请求头)、Host、Cookies信息
4、请求体,GET请求时,一般不会有,POST请求时,请求体一般包含form-data
Why requests 请求需要带上 header
- 模拟浏览器,欺骗服务器,获取和浏览器一致的内容 header 的形式:字典
- headers = {“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36”}
- 用法: requests.get(url,headers=headers)
Response中包含什么信息?
1、响应状态:状态码 正常响应200 重定向
2、响应头:如内容类型、内容长度、服务器信息、设置cookie等
3、响应体信息:响应源代码、图片二进制数据等等
HTTP 的请求和响应都包含哪些内容
- HTTP请求头
Accept:浏览器能够处理的内容类型
Accept-Charset:浏览器能够显示的字符集
Accept-Encoding:浏览器能够处理的压缩编码
Accept-Language:浏览器当前设置的语言
Connection:浏览器与服务器之间连接的类型
Cookie:当前页面设置的任何Cookie
Host:发出请求的页面所在的域
Referer:发出请求的页面的URL
User-Agent:浏览器的用户代理字符串
HTTP响应头部信息:
Date:表示消息发送的时间,时间的描述格式由rfc822定义
server:服务器名字。
Connection:浏览器与服务器之间连接的类型
content-type:表示后面的文档属于什么MIME类型
Cache-Control:控制HTTP缓存
get 和 post 请求区别
- 区别:
- get:
- 从指定的服务器中获取数据。
- GET 请求能够被缓存
- GET 请求会保存在浏览器的浏览记录中
- 以 GET 请求的 URL 能够保存为浏览器书签
- GET 请求有长度限制
- GET 请求主要用以获取数据
- post:
- POST 请求不能被缓存下来
- POST 请求不会保存在浏览器浏览记录中
- 以 POST 请求的 URL 无法保存为浏览器书签
- POST 请求没有长度限制
- POST 请求会把请求的数据放置在 HTTP 请求包的包体中,POST 的安全性比 GET的高.可能修改变服务器上的资源的请求.
- 应用场合:
- post:
- 请求的结果有持续性的副作用(数据库内添加新的数据行)
- 若使用 GET 方法,则表单上收集的数据可能让 URL 过长。
- 要传送的数据不是采用 7 位的 ASCII 编码。
- get:
- 请求是为了查找资源,HTML 表单数据仅用来帮助搜索。
- 请求结果无持续性的副作用。
- 收集的数据及 HTML 表单内的输入字段名称的总长不超过 1024 个字符
- HTTP 请求会有哪些信息发送到后台服务器
- 请求行 (请求方式、资源路径和 HTTP 协议版本)POST /demo/login HTTP/1.1
- 请求消息头
- 消息正文(也叫实体内容) username=xxxx&password=1234
python 爬虫有哪些常用技术?
- Scrapy,Beautiful Soup, urllib,urllib2,requests
爬虫的基本流程
1、通过http库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应
2、如果服务器能正常响应,会得到一个Response,Response的内容比啊是索要获取的页面内容
3、解析内容:正则表达式、页面解析库、json
4、保存数据:文本或者存入数据库
实现模拟登录的方式
①使用一个具有登录状态的 cookie,结合请求报头一起发送,可以直接发送 get 请求,访问登录后才能访问的页面。
②先发送登录界面的 get 请求,在登录页面 HTML 里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送 post 请求,即可登录成功。然后根据获取的 cookie信息,继续访问之后的页面
自动化爬虫面试专题
动态加载又对及时性要求很高怎么处理?
- Selenium+Phantomjs
- 尽量不使用 sleep 而使用 WebDriverWait
Selenium 和 PhantomJS 的了解
- Selenium 是一个Web 的自动化测试工具,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。Selenium库里有个叫 WebDriver 的API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup 或者其他Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。
- PhantomJS是一个基于 Webkit 的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。相比传统的Chrome或 Firefox 浏览器等,资源消耗会更少。
- 如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。主程序退出后,selenium 不保证 phantomJS 也成功退出,最好手动关闭 phantomJS 进程。(有可能会导致多个 phantomJS 进程运行,占用内存)。WebDriverWait 虽然可能会减少延时,但是目前存在 bug(各种报错),这种情况可以采用 sleep。phantomJS爬数据比较慢,可以选择多线程。如果运行的时候发现有的可以运行,有的不能,可以尝试将 phantomJS 改成 Chrome。
常用反爬虫策略有哪些?及应对策略有什么?
- 通常使用headers反爬虫
- 基于用户行为的发爬虫:
- 同一IP短时间内多次访问同一页面,
- 同一账户短时间内多次进行相同操作
- 动态网页反爬虫
- 数据是通过ajax请求得到
- 通过JavaScript生成的
- 对部分数据进行加密处理的
- 只能抓取的数据部分,另外的部分加密处理了,显示乱码等
- 应对策略
- 对于基本网页的抓取可以自定义headers,添加headers的数据,代理来解决
- 有些网站的数据抓取必须进行模拟登陆才能抓取到完整的数据,所以要进行模拟登陆。
- 对于限制抓取频率的,可以设置抓取的频率降低一些,
- 对于限制ip抓取的可以使用多个代理ip进行抓取,轮询使用代理
- 针对动态网页的可以使用selenium+phantomjs进行抓取,但是比较慢,所以也可以使用查找接口的方式进行抓取。
- 对部分数据进行加密的,可以使用selenium进行截图,饭后使用python自带的 pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
Scrapy面试专题
Scrapy优缺点:
- 优点:
- scrapy 是异步的
- 采取可读性更强的xpath代替正则
- 强大的统计和log系统
- 同时在不同的url上爬行
- 支持shell方式,方便独立调试
- 写middleware,方便写一些统一的过滤器
- 通过管道的方式存入数据库
- 缺点:基于python的爬虫框架,扩展性比较差优点:
- 基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。
- 理解描述
- scrapy 是一个 Python 爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而 scrapy-redis 一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让scrapy 支持分布式策略,Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。
- 为什么选择 redis 数据库,因为 redis 支持主从同步,而且数据都是缓存在内存中的,所以基于 redis 的分布式爬虫,对请求和数据的高频读取效率非常高
- scrapy 是一个快速(fast)、高层次(high-level)的基于 python 的 web 爬虫构架。
用来下载、并解析 web 页面, 其 parse->yield item->pipeline 流程是所有爬虫的固有模式。
- 构造形式主要分spider、pypipeline.py 、item.py、 decorator.py、 middlewares.py 、setting.py。
分布式爬虫主要解决什么问题?
(1)ip
(2)带宽
(3)cpu
(4)io
scrapy 框架运行机制?
- 从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:
- 如果提取出需要的数据,则交给管道文件处理;
如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列…),直到请求队列里没有请求,程序结束。
分布式爬虫原理?
- scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的核心服务器称为 master,而把用于跑爬虫程序的机器称为 slave。
- 我们知道,采用 scrapy 框架抓取网页,我们需要首先给定它一些 start_urls,爬虫首先访问 start_urls里面的 url,再根据我们的具体逻辑,对里面的元素、或者是其他的二级、三级页面进行抓取。而要实现分布式,我们只需要在这个 starts_urls 里面做文章就行了。
- 我们在 master 上搭建一个 redis 数据库(注意这个数据库只用作 url 的存储,不关心爬取的具体数据,不要和后面的 mongodb 或者 mysql 混淆),并对每一个需要爬取的网站类型,都开辟一个单独的列表字段。通过设置 slave 上 scrapy-redis 获取 url 的地址为 master 地址。这样的结果就是,尽管有多个 slave,然而大家获取 url 的地方只有一个,那就是服务器 master 上的 redis 数据库。并且,由于 scrapy-redis 自身的队列机制,slave 获取的链接不会相互冲突。这样各个 slave 在完成抓取任务之后,再把获取的结果汇总到服务器上(这时的数据存储不再在是 redis,而是 mongodb 或者mysql等存放具体内容的数据库了)这种方法的还有好处就是程序移植性强,只要处理好路径问题,把 slave 上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情。
scrapy 的异步处理
- scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)。