1、反反爬虫相关机制
1、动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息)
2、禁用Cookies(也就是不启用cookies middleware,不向Server发送cookies,有些网站通过cookie的使用发现爬虫行为)
3、可以通过COOKIES_ENABLED 控制 CookiesMiddleware 开启或关闭
4、设置延迟下载(防止访问过于频繁,设置为 2秒 或更高)
5、Google Cache 和 Baidu Cache:如果可能的话,使用谷歌/百度等搜索引擎服务器页面缓存获取页面数据。
6、使用IP地址池:VPN和代理IP,现在大部分网站都是根据IP来ban的。
7、使用 Crawlera(专用于爬虫的代理组件),正确配置和设置下载中间件后,项目所有的request都是通过crawlera发出。
2、爬虫的抓取流程?
1、发起请求
通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应
2、获取响应内容
如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型
3、解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理
4、保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
Python基础
Python和Java区别
1、动态类型和静态类型
所有的变量类型必须被显示地声明,因为这些信息在编译阶段就被需要。这就是静态类型。很明显Java就是
python是动态语言(类型检查发生在运行阶段,而且不需要显示声明类型)

弱/强类型指的是语言类型系统的类型检查的严格程度。静态动态指的是变量与类型的绑定方法 。这是不同的层级的概念。
弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换。强类型语言一般不允许这么做。Python是强类型的语言,并不是弱类型的。
动态类型和静态类型的本质区别是在哪个阶段做类型检查。动态语言之所以看上去能够改变变量的类型是因为对值的类型检查在运行时。Python是动态类型的。
2、Python中一切皆对象
在Python中,不论是数值(整型、浮点型),字符串,字典,元组对象,还是他们所对应的类型,以及函数,模块等你所能看到的都是对象,他们的祖先是PyObject。而Java中至少函数,基本数据类型都不算对象。
3、可移植性
不管你在哪里运行Python的程序你都需要一个编译器来将Python代码转化为你特定的操作系统可理解的代码。
4、Java和Python的应用领域
Java主要用于商业逻辑强的领域,如商城系统,金融,保险等传统数据库事务领域。Python主要用于web数据分析,科学计算,金融分析,信号分析,图像算法,数学计算,统计分析,算法建模,服务器运维,自动化操作,快速开发理念强,适合快速开发团队或个人敏捷模式。
Scrapy
用的什么框架,为什么选择这个框架
scrapy
- 基于twisted异步io框架,是纯python实现的爬虫框架,性能是最大的优势
- 可以加入request和beautifulsoup
- 方便扩展,提供了很多内置功能
- 内置的cssselector和xpath非常方便
- 默认深度优先
简单说一下你对 scrapy 的了解?
scrapy 是一个快速、高层次的基于 python 的 web 爬虫构架。
用来下载、并解析 web 页面, 其 parse->yield item->pipeline 流程是所有爬虫的固有模式。
构造形式主要分spider.pypipeline.py 、item.py 、decorator.py 、middlewares.py setting.py。
scrapy 中间件有几种类,你用过哪些中间件
(1)spider中间件(主职过滤)
对Request、Response的主要作用在过滤,可以对特定路径的URL请求丢弃、对特定页面响应过滤、同时对一些不含有指定信息的item过滤,当然pipeline也能实现item的过滤。
(2)下载download中间件(主职加工)
主要作用是加工,如给Request添加代理、添加UA、添加cookie,对Response返回数据编码解码、压缩解压缩、格式化等预处理。
描述下 scrapy 框架运行的机制?
(1)从 start_urls 里获取第一批 url 并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:如果提取出需要的数据,则交给管道文件处理;
(2)如果提取出 url,则继续执行之前的步骤(发送 url 请求,并由引擎将请求交给调度器入队列…),直到请求队列里没有请求,程序结束。
scrapy 的去重原理
对于每一个url的请求,调度器都会根据请求的相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中得指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有,就将这个Request对象放入队列中,等待被调度。
Scrapy 的优缺点?
(1)优点:scrapy 是异步的
采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器,通过管道的方式存入数据库
(2)缺点:基于 python 的爬虫框架,扩展性比较差
基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。
scrapy 和 request?
(1)scrapy 是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted 的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100 个网站,并发及分布式处理方面,不够灵活,不便调整与括展。
(2)request 是一个 HTTP 库, 它只是用来,进行请求,对于 HTTP 请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现.
简单介绍下 scrapy 的异步处理
scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)
为什么选择redis 数据库?
-
scrapy 是一个 Python 爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而 scrapy-redis 一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让scrapy 支持分布式策略,Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。
-
为什么选择 redis 数据库,因为 redis 支持主从同步,而且数据都是缓存在内存中的,所以基于 redis 的分布式爬虫,对请求和数据的高频读取效率非常高
你写爬虫的时候都遇到过什么反爬虫措施?你是怎么解决的?
反爬虫措施:限制访问次数,检验浏览器头,异步加载,验证码,限制 IP 。
解决:
- 通过headers反爬虫:解决策略,伪造headers
- 基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
- 通过动态更改代理ip来反爬虫
- 基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求,selnium 和phtamjs
为什么会用到代理?
答:很多网站限制 IP 访问的速度和次数,导致大规模采集的时候影响速度,所以用代理的方式绕过。
代理失效了怎么处理?
答:一般尝试三次,失败了重新丢回队列中,换个代理地址继续用。
列出你知道 header 的内容以及信息
答:UA:浏览器头信息,refer:表示从哪个网页跳转的,还有一些比较小的忘记了,回头补上。
说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。
答:先向 DNS 服务器查询对应 IP ,浏览器访问 IP ,网站响应若是 HTTPS 的验证一下证书,然后 TCP 三次握手开始传数据。
爬取速度过快出现了验证码怎么处理
答:降速,上打码平台,尝试登录后爬取,挂代理多 IP 爬。
写爬虫是用多进程好?还是多线程好? 为什么?
答:限制爬虫的两方面,一个是网络请求速度,这个通过线程来提升。另一个是硬盘读写,这个用多进程解决。
解析网页的解析器使用最多的是哪几个
答:BeautifulSoup,lxml。
需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下?
答:自动化框架。
验证码的解决
答:简单的图像识别,困难的自动化框架,再不行接打码平台。
1、动态加载又对及时性要求很高怎么处理?
- Selenium+Phantomjs
- 尽量不使用 sleep 而使用 WebDriverWait
2、分布式爬虫主要解决什么问题?
- ip
- 带宽
- cpu
- io
12、常用的反爬虫措施?
1.添加代理
2.降低访问频率
User-Agent动态 HTML 数据加载验证码处理Cookie
19、实现模拟登录的方式有哪些?
-
使用一个具有登录状态的 cookie,结合请求报头一起发送,可以直接发送 get 请求,访问登录后才能访问的页面。
-
先发送登录界面的 get 请求,在登录页面 HTML 里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送 post 请求,即可登录成功。然后根据获取的 cookie信息,继续访问之后的页面。
4、python 爬虫有哪些常用技术?
Scrapy,Beautiful Soup, urllib,urllib2,requests
网络
3、什么是 URL?
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
9、什么是 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 时间结束再使用此端口。
10、创建一个简单 tcp 服务器需要的流程?
1.socket 创建一个套接字
2.bind 绑定 ip 和 port
3.listen 使套接字变为可以被动链接
4.accept 等待客户端的链接
5.recv/send 接收发送数据
11、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受网络传输拥塞程序的变化而变化。
13、关于 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 应该用于任何场景!
14、HTTPS 有什么优点和缺点
优点:
1、使用 HTTPS 协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
2、HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 http 协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
3、HTTPS 是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本
缺点:
1.HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用
2.HTTPS 协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。
3.SSL 证书需要钱。功能越强大的证书费用越高。个人网站、小网站没有必要一般不会用。
4.HTTPS 连接服务器端资源占用高很多,握手阶段比较费时对网站的相应速度有负面影响。
5.HTTPS 连接缓存不如 HTTP 高效。
15、HTTPS 是如何实现安全传输数据的
HTTPS 其实就是在 HTTP 跟 TCP 中间加多了一层加密层 TLS/SSL。SSL 是个加密套件,负责对 HTTP 的数据进行加密。TLS 是 SSL 的升级版。现在提到 HTTPS,加密套件基本指的是 TLS。原先是应用层将数据直接给到 TCP 进行传输,现在改成应用层将数据给到TLS/SSL,将数据加密后,再给到 TCP 进行传输。
16、HTTPS 安全证书是怎么来的
如何申请,国内和国外有哪些第三方机构提供安全证书认证。
国内:
- 沃通(WoSign)
- 中国人民银行联合 12 家银行建立的金融 CFCA
- 中国电信认证中心(CTCA)
- 海关认证中心(SCCA)
- 国家外贸部 EDI 中心建立的国富安 CA 安全认证中心
- SHECA(上海 CA)为首的 UCA 协卡认证体系
国外:
- StartSSL
- GlobalSign
- GoDaddy
- Symantec
网友评论