您当前的位置:首页 > 计算机 > 编程开发 > Python

python爬虫面试精选01集

时间:04-23来源:作者:点击数:

网络基础专题

五层网络模型

  • 应用层—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)。
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门