目录
1.你写爬虫的时候都遇到过什么反爬虫措施,你最终是怎样解决的... 1
2.你写爬虫的时候 使用的什么框架 选择这个框架的原因是什么?... 1
二.scrapy框架专题部分(很多面试都会涉及到这部分)... 1
2.为什么要使用scrapy框架?scrapy框架有哪些优点?... 1
3.scrapy框架有哪几个组件/模块?简单说一下工作流程。... 1
4.scrapy的去重原理(指纹去重到底是什么原理)... 1
2.代理怎么使用(具体代码, 请求在什么时候添加的代理)... 1
1.Python2和Python3的区别,如何实现python2代码迁移到Python3环境... 1
2.Python2和Python3的编码方式有什么差别... 1
1.主要使用什么样的结构化数据提取方式,可能会写一两个例子... 1
2、Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)... 1
11,使用redis搭建分布式系统时如何处理网络延迟和网络异常?... 1
1、python 常用数据结构有哪些?请简要介绍一下。... 1
2、如何在一个 function 里面设置一个全局的变量?... 1
3、Python 里面如何拷贝一个对象?(赋值、浅拷贝、深拷贝的区别)... 1
4、请写出一段 Python 代码实现删除一个 list 里面的重复元素。... 1
5、这两个参数是什么意思:args,*kwargs?... 1
7、给列表中的字典排序:假设有如下 list 对象... 1
3、有一个升序后又降序的数组,比如 1356742,如何查找到 2 的位置。... 1
7、fun(*args,**kwargs)中的*args,**kwargs什么意思?... 1
8、python2和python3的range(100)的区别... 1
11、简述面向对象中__new__和__init__区别... 1
12、简述with方法打开处理文件帮我我们做了什么?... 1
13、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25] 1
14、python中生成随机整数、随机小数、0--1之间小数方法... 1
16、<div class="nam">中国</div>,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的... 1
18、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句... 1
20、python2和python3区别?列举5个... 1
21、列出python中可变数据类型和不可变数据类型,并简述原理... 1
22、s = "ajldjlajfdljfddd",去重并从小到大排序输出"adfjl". 1
25、利用collections库的Counter方法统计字符串每个单词出现的次数"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h". 1
26、字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳". 1
27、filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 1
28、列表推导式求列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 1
30、a=(1,)b=(1),c=("1") 分别是什么类型的数据?... 1
31、两个列表[1,5,7,9]和[2,2,6,8]合并为[1,2,2,3,6,7,8,9] 1
32、用python删除文件和用linux命令删除文件方法... 1
33、log日志中,我们需要用时间戳记录error,warning等的发生时间,请用datetime模块打印当前时间戳 “2018-04-01 11:38:54”. 1
35、请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库,第三方也行... 1
37、正则表达式匹配中,(.*)和(.*?)匹配区别?... 1
39、[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6] 1
40、x="abc",y="def",z=["d","e","f"],分别求出x.join(y)和x.join(z)返回的结果... 1
41、举例说明异常模块中try except else finally的相关意义... 1
44、a="张明 98分",用re.sub,将98替换为100. 1
46、a="hello"和b="你好"编码成bytes类型... 1
47、[1,2,3]+[4,5,6]的结果是多少?... 1
52、list=[2,3,5,4,9,6],从小到大排序,不许用sort,输出[2,3,4,5,6,9] 1
57、分别从前端、后端、数据库阐述web项目的性能优化... 1
58、使用pop和del删除字典中的"name"字段,dic={"name":"zs","age":18} 1
60、计算代码运行结果,zip函数历史文章已经说了,得出[("a",1),("b",2),("c",3),("d",4),("e",5)] 1
66、python中copy和deepcopy区别... 1
68、C:\Users\ry-wu.junya\Desktop>python 1.py 22 33命令行启动程序并传参,print(sys.argv)会输出什么数据?... 1
69、请将[i for i in range(3)]改成生成器... 1
71、举例sort和sorted对列表排序,list=[0,-1,3,-10,5,9] 1
72、对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用lambda函数从小到大排序... 1
73、使用lambda函数对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为... 1
[0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小... 1
80、最后出一道检验题目,根据字符串长度排序,看排序是否灵活运用... 1
82、s="info:xiaoZhang 33 shandong",用正则切分字符串输出['info', 'xiaoZhang', '33', 'shandong'] 1
85、python字典和json字符串相互转化方法... 1
92、int("1.4"),int(1.4)输出结果?... 1
99、正则表达式匹配出<html><h1>www.itcast.cn</h1></html>. 1
一些经典的Python爬虫和网络编程面试题
1、动态加载又对及时性要求很高怎么处理?
Selenium+Phantomjs
尽量不使用 sleep 而使用 WebDriverWait
2、分布式爬虫主要解决什么问题?
(1)ip
(2)带宽
(3)cpu
(4)io
3、什么是 URL?
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的 URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
4、python 爬虫有哪些常用技术?
Scrapy,Beautiful Soup, urllib,urllib2,requests
5、简单说一下你对 scrapy 的了解?
scrapy 是一个快速(fast)、高层次(high-level)的基于 python 的 web 爬虫构架。
用来下载、并解析 web 页面, 其 parse->yield item->pipeline 流程是所有爬虫的固有模式。
构造形式主要分spider.pypipeline.py item.py decorator.py middlewares.py setting.py。
6、Scrapy 的优缺点?
(1)优点:scrapy 是异步的
采取可读性更强的 xpath 代替正则强大的统计和 log 系统,同时在不同的 url 上爬行支持 shell 方式,方便独立调试写 middleware,方便写一些统一的过滤器,通过管道的方式存入数据库
(2)缺点:基于 python 的爬虫框架,扩展性比较差
基于 twisted 框架,运行中的 exception 是不会干掉 reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。
7、scrapy 和 request?
(1)scrapy 是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted 的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100 个网站,并发及分布式处理方面,不够灵活,不便调整与括展。
(2)request 是一个 HTTP 库, 它只是用来,进行请求,对于 HTTP 请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现.
8、五层网络模型?
应用层—http ftp dns nfs
传输层—tcp --udp
网络层—ip icmp igmp
链路层—data link
物理层—media
设置 ip 和掩码
<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> Ifconfig eth0 192.168.13.225 netmask 255.255.255.0
</pre>
设置网关
route add default gw 192.168.5.1
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受网络传输拥塞程序的变化而变化。
12、常用的反爬虫措施?
1.添加代理
2.降低访问频率
User-Agent动态 HTML 数据加载验证码处理Cookie
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
16、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
17、描述下 scrapy 框架运行的机制?
(1)从 start_urls 里获取第一批 url 并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:1. 如果提取出需要的数据,则交给管道文件处理;
(2)如果提取出 url,则继续执行之前的步骤(发送 url 请求,并由引擎将请求交给调度器入队列…),直到请求队列里没有请求,程序结束。
18、为什么选择redis 数据库?
①scrapy 是一个 Python 爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而 scrapy-redis 一套基于 redis 数据库、运行在 scrapy 框架之上的组件,可以让scrapy 支持分布式策略,Slaver 端共享 Master 端 redis 数据库里的 item 队列、请求队列和请求指纹集合。
②为什么选择 redis 数据库,因为 redis 支持主从同步,而且数据都是缓存在内存中的,所以基于 redis 的分布式爬虫,对请求和数据的高频读取效率非常高
19、实现模拟登录的方式有哪些?
①使用一个具有登录状态的 cookie,结合请求报头一起发送,可以直接发送 get 请求,访问登录后才能访问的页面。
②先发送登录界面的 get 请求,在登录页面 HTML 里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送 post 请求,即可登录成功。然后根据获取的 cookie信息,继续访问之后的页面。
20、简单介绍下 scrapy 的异步处理
scrapy 框架的异步机制是基于 twisted 异步网络框架处理的,在 settings.py 文件里可以设置具体的并发量数值(默认是并发量 16)。
一.项目问题:
1.你写爬虫的时候都遇到过什么反爬虫措施,你最终是怎样解决的
①通过headers反爬虫:解决策略,伪造headers
②基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为, 使用IP代理池爬取或者降低抓取频率,或 通过动态更改代理ip来反爬虫
③基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求,selnium
和phtamjs。或 使用selenium + phantomjs 进行抓取抓取动态数据,或者找到动态数据加载的json页面。
④验证码 :使用打码平台识别验证码
⑤数据加密:对部分数据进行加密的,可以使用selenium进行截图,使用python自带的pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
2.你写爬虫的时候 使用的什么框架 选择这个框架的原因是什么?
scrapy。
优势:
- 可以实现高并发的爬取数据, 注意使用代理;
- 提供了一个爬虫任务管理界面, 可以实现爬虫的停止,启动,调试,支持定时爬取任务;
- 代码简洁
劣势:
- 可扩展性不强。
②整体上来说: 一些结构性很强的, 定制性不高, 不需要太多自定义功能时用pyspider即可, 一些定制性高的,需要自定义一 些 功能时则使用Scrapy。
二.scrapy框架专题部分(很多面试都会涉及到这部分)
1.请简要介绍下scrapy框架。
scrapy 是一个快速(fast)、高层次(high-level)的基于 python 的 web 爬虫构架,用于抓取web站点并从页面中提取结构化的数据。scrapy 使用了 Twisted异步网络库来处理网络通讯
2.为什么要使用scrapy框架?scrapy框架有哪些优点?
- 它更容易构建大规模的抓取项目
- 它异步处理请求,速度非常快
- 它可以使用自动调节机制自动调整爬行速度
- 提供了一个爬虫任务管理界面, 可以实现爬虫的停止,启动,调试,支持定时爬取任务;
- 代码简洁
3.scrapy框架有哪几个组件/模块?简单说一下工作流程。
Scrapy Engine:这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等等!(像不像人的身体?)
Scheduler(调度器): 它负责接受引擎发送过来的requests请求,并按照一定的方式进行整理排列,入队、并等待Scrapy Engine(引擎)来请求时,交给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spiders来处理,
Spiders:它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline:它负责处理Spiders中获取到的Item,并进行处理,比如去重,持久化存储(存数据库,写入文件,总之就是保存数据用的)
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spiders中间‘通信‘的功能组件(比如进入Spiders的Responses;和从Spiders出去的Requests)
工作流程:
数据在整个Scrapy的流向:
程序运行的时候,
引擎:Hi!Spider, 你要处理哪一个网站?
Spiders:我要处理23wx.com
引擎:你把第一个需要的处理的URL给我吧。
Spiders:给你第一个URL是XXXXXXX.com
引擎:Hi!调度器,我这有request你帮我排序入队一下。
调度器:好的,正在处理你等一下。
引擎:Hi!调度器,把你处理好的request给我,
调度器:给你,这是我处理好的request
引擎:Hi!下载器,你按照下载中间件的设置帮我下载一下这个request
下载器:好的!给你,这是下载好的东西。(如果失败:不好意思,这个request下载失败,然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载。)
引擎:Hi!Spiders,这是下载好的东西,并且已经按照Spider中间件处理过了,你处理一下(注意!这儿responses默认是交给def parse这个函数处理的)
Spiders:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,这是我需要跟进的URL,将它的responses交给函数 def xxxx(self, responses)处理。还有这是我获取到的Item。
引擎:Hi !Item Pipeline 我这儿有个item你帮我处理一下!调度器!这是我需要的URL你帮我处理下。然后从第四步开始循环,直到获取到你需要的信息,
注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy会重新下载。)
以上就是Scrapy整个流程了。
官方语言版本:
流程
1.引擎打开一个域名,蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
2.引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
3.引擎从调度那获取接下来进行爬取的页面。
4.调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。
5.当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
6.引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
7.蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
8.引擎将抓取到的项目发送给项目管道,并向调度发送请求。
系统重复第二步后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系
4.scrapy的去重原理(指纹去重到底是什么原理)
需要将dont_filter设置为False开启去重,默认是False;
对于每一个url的请求,调度器都会根据请求的相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进行比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中。如果set()集合中没有,就将这个Request对象放入队列中,等待被调度。
5.scrapy中间件有几种类,你用过哪些中间件*
scrapy的中间件理论上有三种:
Scheduler Middleware,Spider Middleware,Downloader Middleware,
在应用上一般有以下两种:
1.爬虫中间件Spider Middleware
主要功能是在爬虫运行过程中进行一些处理.
2.下载器中间件Downloader Middleware
主要功能在请求到网页后,页面被下载时进行一些处理.
使用
1.Spider Middleware有以下几个函数被管理:
process_spider_input 接收一个response对象并处理,
位置是Downloader–>process_spider_input–>Spiders(Downloader和Spiders是scrapy官方结构图中的组件