爬虫常见面试题汇总

1.列举您使用过的python网络爬虫所用到的网络数据包(最熟悉的在前):

 requests、urllib、urllib2、httplib2

2.列举您使用过的python网络爬虫所用到的解析数据包(最熟悉的在前):

BeautifulSoup、pyquery、Xpath、lxml

3.列举您使用过的python中的编码方式(最熟悉的在前):

UTF-8,ASCII,gbk

4.写出在网络爬虫爬取数据的过程中,遇到的反爬虫问题的解决方案

通过headers反爬虫:解决策略,伪造headers

基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为

基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求

尽量减少请求次数,能抓列表页就不抓详情页

可以考虑多线程,以及分布式

5.列出比较熟悉的爬虫框架?

常见爬虫框架列表

6.scrapy由几个主要的部分组成?分别代表什么意思?

a.Engine:引擎负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件。

b.Scheduler:调度程序接收来自引擎的请求,并将它们排入队列,并在之后,当Engine需要的时候,将requests发送给engine。

c.Downloader:下载器负责提取网页并将它们馈送到引擎,然后引擎将其发送给spider。

d.Spiders:蜘蛛是Scrapy用户编写的自定义类,用于解析响应并从中提取item项目(也称为抓取的项目)或追加的其他请求。

e.Item Pipeline:Item Pipeline负责处理被蜘蛛提取的item, 典型的任务包括清理,验证和持久性 (如将项目存储在数据库中)。

f.Downloader middlewares:下载器中间件是位于引擎和下载器之间的特定的钩子,当它们从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。使用下载中间件可以达成如下的目的:

在将请求发送到下载器之前处理请求(即在Scrapy将请求发送到网站之前)。在传递给蜘蛛之前改变接收到的响应;
发送新的请求,而不是将接收到的响应传递给蜘蛛;向蜘蛛传递响应而不需要获取网页;

7.scrapy项目的搭建过程?

先安装scrapy

pip install scrapy

安装完成后就可以使用scrapy命令来创建项目了,如下:

scrapy startproject FirstSpider

上面的命令只是生成了一个scrapy项目,之后还需要创建爬虫才能爬取,创建爬虫的命令如下:

scrapy genspider stack http://stackoverflow.com/

使用scrapy genspider来创建一个爬虫,并且指定名称为stack,起始爬取路径为http://stackoverflow.com/

创建完成后的项目目录结构如下:

可以看到在项目目录下会有一个与项目名同名的FirstSpider包,里面是我们Scrapy项目的各个模块。

8.xpath是什么?常用的路径及节点表示法?

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。

XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。 

路径表达式语法: 

1.路径 = 相对路径 | 绝对路径

2.XPath路径表达式 = 步进表达式 | 相对路径 "/"步进表达式。

3.步进表达式=轴 节点测试 谓词

9. BS4是什么,有什么作用?常见的函数有哪些?

网络爬虫的最终目的就是过滤选取网络信息,最重要的部分可以说是解析器。解析器的优劣决定了爬虫的速度和效率。

解析器库bs4 库将复杂的html文档转化为一个复杂的树形结构,每个节点都是Python对象 ,所有对象可以分为以下四个类型:Tag , NavigableString , BeautifulSoup , Comment

Tag: 和html中的Tag基本没有区别,可以简单上手使用
NavigableString: 被包裹在tag内的字符串
BeautifulSoup: 表示一个文档的全部内容,大部分的时候可以吧他看做一个tag对象,支持遍历文档树和搜索文档树方法。
Comment:这是一个特殊的NavigableSting对象,在出现在html文档中时,会以特殊的格式输出,比如注释类型。  

10.urllib的常见子模块是哪些?  

 urllib.request模块:帮助在复杂的世界中打开URL(主要是HTTP)的函数和类——基本和摘要身份验证、重定向、cookie等等。

urllib.error子模块相对来说比较简单,官方定义为由urllib.request导致的异常,其中URLError是最基本的异常。

urllib.parse可以拆分URL,也可以拼接URL。

11. 如何给 request加入一个代理,如何修改 user-agent的值?

代理(Streaming Requests)
如果你需要使用一个代理,你可以在任何请求方法中使用proxies参数配置单个请求:
 

import requests

proxies = {
  "http": "10.10.1.10:3128",
  "https": "10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)

你也可以通过环境变量HTTP_PROXY和HTTPS_PROXY来配置代理:

$ export HTTP_PROXY="10.10.1.10:3128"
$ export HTTPS_PROXY="10.10.1.10:1080"
$ python
>>> import requests
>>> requests.get("http://example.org")

如何修改网页的user-agent值?

12. selenium是一个什么样的爬虫框架?如何使用?

自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。话说回来,PhantomJS不也是一个浏览器吗,那么 Selenium 支持不?答案是肯定的,这样二者便可以实现无缝对接了。
模拟提交 测试用例 页面交互 填充表单 元素拖拽 页面切换  弹窗处理 Cookies处理 元素选取 页面等待
Selenium 提供了两种等待方式,一种是隐式等待,一种是显式等待。
隐式等待是等待特定的时间,显式等待是指定某一条件直到这个条件成立时继续执行

https://www.cnblogs.com/BigFishFly/p/6380024.html

13.如何给selenium爬虫添加user-agent, proxy?

默认情况下,是没有自动设置User-Agent的,默认的User-Agent显示为PhantomJS;selenium可调用firefox chrome phantomjs等各种浏览器。设置PhantomJS的user-agent,是要设置“phantomjs.page.settings.userAgent”这个desired_capability。

https://blog.csdn.net/zaixiahanli/article/details/64479463

14.selenium爬虫如何跟踪ajax请求?

想办法分析出接收ajax返回数据的变量,然后用

data = driver.execute_script("return Json") //假设Json是那个变量。

驱动要用phantomjs,data就是你要的json数据。

15. 是否了解线程的同步和异步?

多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线
程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解
决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲
系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制。
同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求
不到,怎么办,A线程只能等待下去
异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程
仍然请求的到,A线程无需等待
显然,同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个
进程崩溃,但没有同步机制的存在,性能会有所提升。

16.你是否了解谷歌的无头浏览器?

无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。

Python中selenium模块中的PhantomJS即为无界面浏览器(无头浏览器):是基于QtWebkit的无头浏览器。

17.分布式爬虫的设计原理是什么,解决了什么问题?

设计原理:引入了master-slaver机制,用master来控制,监控slaver爬取状态,进度引入心跳机制。

解决问题: (1)ip    (2)带宽    (3)cpu    (4)io

18.gzip压缩是什么?python爬取网页时,如何处理?

在我们用python3爬取一些网站时,获取网页url后进行解析,在采用decode('utf-8')解码时有时候会出现utf-8无法解码的问题,比如结果会提示:

Unicode Decode Error: 'utf8' codec can't decode byte 0xb2 in position 0: invalid start byte

是因为有些网站进行了gzip压缩,最典型的就是sina。

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载*. *一般服务器中都安装有这个功能模块的。

19.scrapy的去重原理 

1.Scrapy本身自带有一个中间件;

2.scrapy源码中可以找到一个dupefilters.py去重器;

3.需要将dont_filter设置为False开启去重,默认是True,没有开启去重;

4 .对于每一个url的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进 行 比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中;

5.如果set()集合中没有存在这个加密后的数据,就将这个Request对象放入队列中,等待被调度。

20.代理问题: 为什么会用到代理?代理怎么使用?代理失效了怎么处理?

为什么会用到代理?

1.安全避免同一个代理IP访问同一个网页,对于长时间访问同一个网页的IP,极大可能性IP会被封掉。

2.方便解决IP代理问题技术含量高,找代理处理方便省事。

3.成本低自己去维护服务器成本过高,不低于长久持续发展。

代理怎么使用?代理失效了怎么处理?

https://baijiahao.baidu.com/s?id=1618299340903906830&wfr=spider&for=pc

事先用检测代码检测可用的代理,每隔一段时间更换一次代理,如果出现302等状态码,则立即更换下一个可用的IP。

21. http协议: http协议请求头,请求体,响应头,响应体语法?

HTTP请求:Hyper Text Transfer Protocol的缩写,即超文本传输协议。

HTTP请求报文由3部分组成(请求行+请求头+请求体)。HTTP的响应报文也由3部分组成(响应行+响应头+响应体)

https://blog.csdn.net/weixin_30347009/article/details/96857498

猜你喜欢

转载自blog.csdn.net/qq_41127332/article/details/103494353