Python 爬虫 面试题

 爬虫遵循的协议:robot协议

定义:网络爬虫排除标准。

作用:告诉搜索引擎哪里可以爬,哪里不可以爬。

爬虫分类

(1)通用爬虫:搜索引擎的主要组成,作用就是将互联网的上页面整体的爬取下来之后,保存到本地。

(2)聚焦爬虫:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。通用爬虫和聚焦爬虫的区别:聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。

通用爬虫工作流程

1)抓取网页:通过搜索引擎将待爬取的url加入到通用爬虫的url队列中,进行网页内容的爬取

2)数据存储:将爬取下来的网页保存到本地,这个过程会有一定的去重操作,如果某个网页的内 容大部分内容都会重复,搜索引擎可能不会保存。

3)预处理:提取文字,中文分词,消除噪音(比如版权声明文字,导航条,广告等)。

4)设置网站排名,为用户提供服务。

一些反爬及其应对措施

推送门:关于反爬与反反爬

1)通过user-agent来判断是否是爬虫。

解决方案:可以通过伪装请求头中的user-agent来解决。若user-agent被检测到,可以找大量的user-agent,放入列表,然后进行更换

2)将IP进行封杀。

解决方案:可以通过代理来伪装IP。

3)通过访问频率来判断是否是一个爬虫。

解决方案:可以通过设置请求间隔,和爬取间隔。

4)当一定时间内的总请求数超过上限,弹出验证码。

解决方案:对于简单的验证码图片可以使用tesseract来处理,对于复杂的可以去打码平台。

5)通过JS来获取页面数据。

解决方案:可以使用selenium+phantomjs来加载JS获取数据。

介绍搜索引擎

1.搜索引擎的主要组成

通用爬虫:就是将互联网的上页面整体的爬取下来之后,保存到本地。通用爬虫要想爬取网页,需要网站的url.但是搜索引擎是可以搜索所有网页的。那么通用爬虫url就要涉及到所有网页,这个‘所有’是如何做到的:

  • 新网站向搜索引擎主动提交网址;
  • 在其他网站上设置新网站外链;
  • 搜索引擎和DNS解析服务商(如DNSPod等)合作,新网站域名将被迅速抓取。

2.搜索引擎的工作流程(通用爬虫的工作流程)

(1)抓取网页:通过搜索引擎将待爬取的URL加入到通用爬虫的URL队列中,进行网页内容的爬取。

(2)数据存储:将爬取下来的网页保存到本地,这个过程会有一定的去重操作,如果某个网页的内 容大部分内容都会重复,搜索引擎可能不会保存。

(3)预处理:提取文字,中文分词,消除噪音(比如版权声明文字,导航条,广告等)。

(4)设置网站排名,为用户提供服务。

3.搜索引擎的局限性

(1)搜索引擎只能爬取原网页,但是页面90%内容都是无用的。

(2)搜索引擎不能满足不同行业,不同人的特定需求。

(3)通用搜索引擎只能爬取文字信息,不能对音频、图片等进行爬取。

(4)只能基于关键字查询,无法基于语义查询。

 介绍HTTP

网络七层协议:

Python 爬虫 面试题

1.HTTP协议特点

  • HTTP协议是超文本传输协议;
  • HTTP协议是一个应用层协议;
  • 无连接:每次请求都是独立的;
  • 无状态,表示客户端每次请求都不能记录请求状态,就是两条请求直接不可通信。

2.HTTP工作过程

  • 地址进行DNS解析,将URL解析出对应的内容
  • 封装HTTP请求数据包
  • 封装成TCP包,建立TCP连接(TCP的三次握手)
  • 客户端发送请求
  • 服务器接收请求,发送响应
  • 客户端接收到响应,进行页面渲染
  • 服务器关闭TCP连接(TCP的四次挥手)

3.HTTP协议和HTTPS协议的区别

  • HTTP协议是使用明文数据传输的网络协议,明文传输会让用户存在一个非常大的安全隐患。端口80
  • HTTPS协议可以理解为HTTP协议的安全升级版,就是在HTTP的基础上增加了数据加密。端口443
  • HTTPS协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议要比HTTP协议安全。

4.HTTP通信

HTTP通信由两部分组成:客户端请求消息与服务器响应消息。

5.关于响应常见的响应码

Python 爬虫 面试题

6.客户端请求(Get和Post区别)

(1)组成:请求行、请求头部、空行、请求数据四个部分组成

(2)请求方法Get/Post

(3)Get和Post的区别GET和POST本质上就是TCP链接,并无差别。但是由于HTTP的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

Python 爬虫 面试题

(4)常见的请求头

User-Agent:客户端请求标识

Accept:传输文件类型。Referer :请求来源

cookie (cookie):在做登录的时候需要封装这个头

Content-Type (POST数据类型)

7.服务器响应

(1)组成:状态行,响应头,空行,响应正文。

(2)常见的响应头

Content-Type:text/html;资源文件的类型,还有字符编码

Content-Length:响应长度

Content-Size响应大小

Content-Encoding告诉客户端,服务端发送的资源是采用什么编码的

Connection:keep-alive这个字段作为回应客户端的

Connection:keep-alive,告诉客户端服务器的tcp连接也是一个长连接,客户端可以继续使用这个TCP连接发送HTTP请求。

URL

统一资源定位符:

基本格式:scheme://host[:port#]/path/…/?query-string

协议://服务器ip地址:端口号/资源路径/?key1=参数1&key2=参数2

scheme:协议(例如:HTTP、HTTPS、FTP)

host/IP:服务器的IP地址或者域名

port:服务器的端口(如果是走协议默认端口,缺省端口80),用来从互联网进入电脑

path:访问资源的路径,就是为了在电脑中找到对应的资源路径

query-string:参数,发送给http服务器的数据

anchor:锚(跳转到网页的指定锚点位置)

Q:当我们在浏览器输入一个URL,为什么可以加载出一个页面?为什么抓包的过程中请求一个URL,出现很多的资源请求?

当我们在浏览器输入一个URL,客户端会发送这个URL对应的一个请求到服务器获取内容。服务器收到这个请求,解析出对应内容,之后将内容封装到响应里发送到客户端

当客户端拿到这个HTML页面,会查看这个页面中是否有CSS、JS、image等URL,如果有,在分别进行请求,获取到这些资源。

客户端会通过HTML的语法,将获取到的所有内容完美的显示出来。

Cookie和Session

产生原因:由于HTTP是一个无状态的协议,每次请求如果需要之前的一些信息,无法记录,因此为了解决这个问题,产生了一种记录状态技术,Cookie和Session。

Cookie指某些网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据,种类有会话Cookie和持久Cookie。

(1)会话Cookie指存在浏览器内存的Cookie,当浏览器关闭,会话Cookie会失效;

(2)持久Cookie是保存在硬盘上的Cookie。

Session用来存储特定的用户会话所需的属性及其配置信息。

Cookie是在客户端记录状态,Session是在服务端记录状态。

联系:当客户端发送一个Cookie,服务器会从这个Cookie中找到sessionID,再查找出相应的Session信息返回给客户端,来进行用户页面的流转。如果通过sessionID来查找Session的时候,发现没有Session(一般第一次登陆或者清空了浏览器),那么就会创建一个Session。

hashlib密码加密

def get_hex(value): 

md5_ = hashlib.md5()

    md5_.update(value.encode('utf-8')) 

    return md5_.hexdigest() 

关于response.text乱码问题

response的常用属性:

1.获取字符串类型的响应正文:response.text

2.获取bytes类型的响应正文:response.content

3.响应正文字符串编码:response.encoding

4.状态码:response.status_code5.响应头:response.headers

response.text乱码问题:

#方法一:转换成utf-8格式  

response.encoding='utf-8'  

print(response.text) 

#方法二:解码为utf-8 :

with open('index.html','w',encoding='utf-8') as fp:    fp.write(response.content.decode('utf-8')) 
 

代理

代理的作用:

1、突破自身IP 访问限制, 访问一些平时不能访问的站点。

2、访问一些单位或团体内部资源:比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。

3、提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时, 同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取屮信息传给用户,以提高访问速度。

4、隐藏真实IP :上网者也可以通过这种方法隐藏自己的IP , 免受攻击。对于爬虫来说, 我们用代理就是为了隐藏自身IP , 防止自身的被*。代理根据匿名程度的分类:

Python 爬虫 面试题

JSON数据

数据的分类:

Python 爬虫 面试题

JSON的本质:是一个字符串,JSON是对JS对象的字符串表达式,它使用文本形式表示一个JS对象的信息。

JSON使用:

(1)json.dumps(Python的list或者dict),将Python的list或者dict返回为一个JSON字符串;

(2)json.loads(json字符串),将JSON字符串返回为Python的list或者dict;

(3)json.dump(list/dict,fp),将Python的list或者dict转为一个JSON字符串,保存到文件中;

(4)json.load(fp) ,从JSON文件中读出JSON数据,并转换为Python的list或者dict。

正则表达式

1、贪婪和非贪婪

(1)正则默认是贪婪模式,所以数量控制符默认是取最大值,也是贪婪。例如*

(2)非贪婪是用?来控制,尽量匹配最少的次数,0次或一次。2、Python使用格式:

pattern=re.compile('正则表达式') 

print(pattern.match(字符串,start,end))#默认从头开始匹配,只匹配一次,返回一个match对象

print(pattern.search(字符串,start,end))#从任意位置开始匹配,只匹配一次,返回一个match对象

print(pattern.findall(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个list返回给我们

print(pattern.finditer(字符串,start,end))#全文多次匹配,将匹配到的结果放到一个match对象的迭代器返回

3、常见的正则题目

Python 爬虫 面试题

上一篇:阶段笔记


下一篇:[python]WindowsError的错误代码详解