2019最新Python爬虫高频率面试题总结(一)

今天给大家出一个关于Python爬虫面试题的总结,相对于来说出现频率比较高的一些!

1. 为什么 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)

2. 谈一谈你对 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。

3. 写一个邮箱地址的正则表达式?

[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$
复制代码

4. 你遇到的反爬虫策略有哪些?及应对策略有什么?

  • 通过headers反爬虫
  • 基于用户行为的发爬虫:例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作
  • 动态网页反爬虫,例如:我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的
  • 对部分数据进行加密处理的,例如:我们要抓的数据部分能够抓到,另外的部分加密处理了,是乱码
  • 应对策略:
对于基本网页的抓取可以自定义headers,添加headers的数据,代理来解决
有些网站的数据抓取必须进行模拟登陆才能抓取到完整的数据,所以要进行模拟登陆。
对于限制抓取频率的,可以设置抓取的频率降低一些,
对于限制ip抓取的可以使用多个代理ip进行抓取,轮询使用代理
针对动态网页的可以使用selenium+phantomjs进行抓取,但是比较慢,所以也可以使用查找接口的方式进行抓取。
对部分数据进行加密的,可以使用selenium进行截图,饭后使用python自带的 pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
复制代码

5. 分布式爬虫原理?

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 上的程序移植到另一台机器上运行,基本上就是复制粘贴的事情。

6. 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的辅助。
复制代码

7.robots协议是什么?

Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。

8.什么是爬虫?

爬虫是请求网站并提取数据的自动化程序

9.爬虫的基本流程?

1、通过http库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应
2、如果服务器能正常响应,会得到一个Response,Response的内容比啊是索要获取的页面内容
3、解析内容:正则表达式、页面解析库、json
4、保存数据:文本或者存入数据库
复制代码

10.什么是Request和Response?

本地 向 服务器 发送Request,服务器根据请求返回一个Response,页面就显示在页面上了

1、浏览器就发送消息给该网址所在的服务器,这个过程叫做Http Request

2、服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处

理,然后把消息回传给浏览器,这个过程叫做HTTP Response

3、浏览器收到服务器的Response消息后,会对信息进行相应处理,然后显示

下期会继续为大家更新更多关于Python爬虫的面试题总结!


转载于:https://juejin.im/post/5d551d3a518825371070e57c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Silverlight专题(15) - 你自己的视频播放器之自定义MoveToPointSlider

前言: 这几天在网络上看到不少人在问如何创建一个Video Player(Silverlight版本) 而我在微软和这方面打了不少交道 所以计划用两篇文章解答下大家的问题 本篇文章先介绍下如何创建一个自定义的滚动条 下篇文章创建完整的一个Video Player 问题…

java面试题31:结构型模式中最体现扩展性的模式是()

java面试题31:结构型模式中最体现扩展性的模式是() A:装饰模式 B:合成模式 C:桥接模式 D:适配器 蒙蔽树上蒙蔽果,蒙蔽树下你和我 结构型模式是描述如何将类对象结合在一起,形成一个更大的结构&#x…

hive 多用户访问模注意问题

首先是安装mysql 安装mysql数据库及客户端 yum install mysql-server yum install mysql servicemysqld start步骤一: yum -y install mysql-server步骤二:service mysqld start步骤三:mysql -u root -p  Enter password: (默认…

10行代码实现小程序支付功能!丨实战

前面给大家讲过一个借助小程序云开发实现微信支付的,但是那个操作稍微有点繁琐,并且还会经常出现问题,今天就给大家讲一个简单的,并且借助官方支付api实现小程序支付功能。 传送门:借助小程序云开发实现小程序支付功能…

ASP.NET站点导航(五)

理解并扩展 ASP.NET 2.0 中的站点导航系统 http://msdn.microsoft.com/zh-cn/library/aa479338.aspx 发布日期 : 2006-3-15 | 更新日期 : 2006-3-15David Gristwood Developer & Platform Group, Microsoft 适用于: Microsoft ASP.NET 2.0 (Beta 2) 摘要&#…

java面试题32:Java网络程序设计中,下列正确的描述是()

java面试题32:Java网络程序设计中,下列正确的描述是() A:Java网络编程API建立在Socket基础之上 B:Java网络接口只支持tcP以及其上层协议 C:Java网络接口只支持UDP以及其上层协议 D:Java网络接口支持IP以上的所有高…

【收藏】C# WinForm开发系列 - DataGridView 使用方法集锦 - 宁波.Net技术讨论区

1.DataGridView实现课程表 testcontrol.rar 2.DataGridView二维表头及单元格合并 DataGridView单元格合并和二维表头.rar myMultiColHeaderDgv.rar 3.DataGridView单元格显示GIF图片 gifanimationindatagrid.rar 4.自定义显示DataGridView列(行头显示行号与图标,同一单元格显示…

Java中Map, List, Set和Queue的区别和使用场景

转:https://blog.csdn.net/kingcat666/article/details/75579632 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据。从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量…

java面试题33 Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).

java面试题33 Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ). A 11 ,-11 B 11 ,-12 C 12 ,-11 D 12 ,-12 蒙蔽树上蒙蔽果,蒙蔽树下你和我。 做Java的面试题时遇到了以下这题,百度了一下Math.round()的修约规则,有的说…

VC返回文件所在的路径

//返回文件所在的路径void GetPath(CString& Des,char* src){CString TmpStr src;int Location TmpStr.ReverseFind("");Des TmpStr.Left(Location);}转载于:https://www.cnblogs.com/enterBeijingThreetimes/archive/2008/11/26/1341615.html

Protel 介绍 protel99se正式汉化版下载 Protel DXP2004简体中文版

1. Protel介绍 protel99se正式汉化版下载 Protel DXP2004简体中文版http://www.elecfans.com/soft/22/23/2008/200807315722.html2.protel99se正式汉化版免费下载http://www.elecfans.com/zhuanti/protel99se.htmProtel se:Protel 99SE具有丰富的设计功能&#xff0…

java面试题34下面关于程序编译说法正确的是()

java面试题34下面关于程序编译说法正确的是() A:java语言是编译型语言,会把java程序编译成二进制机器指令直接运行 B:java编译出来的目标文件与具体操作系统有关 C:java在运行时才进行翻译指令 D:java编译出来的目…

java面试题35 给定以下JAVA代码,这段代码运行后输出的结果是()

java面试题35 给定以下JAVA代码,这段代码运行后输出的结果是() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class Test { public static int aMethod(int i)throws Exception { try{ …

HDU-4027 Can you answer these queries? --线段树

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid4027 题意及思路: 有一排战舰,给出每个战舰的能力值,存在两种操作:第一种是把一定范围内所有战舰能力值开根号并向下取整,第二种是求一定区域内所有战…

Proxy server 緩存 jsp html

如果服務器端使用Proxy server,jsp頁面會出現頁面混亂的問題.(不同用戶登陸,出現的是同一個用戶的資料),為了避免這種情況存在,可以有兩種方法解決. eg: menu 所在頁面為toppanel.jsp,鏈接就為:http://localhost:8080/q/toppanel.jsp. 這樣user登陸可能會出現manager的menu,man…

shiro学习(6):shiro连接数据库

首先我们先看一下数据库 再看看数据库的测试数据 在我们创建好的maven项目中看一下目录结构 在pom.xml引入 <dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency&g…

【js监听报错】页面监听js报错问题

<html> <head> <script type"text/javascript">// 页面监听js报错问题 οnerrοrhandleErrvar txt"" function handleErr(msg,url,l) { txt"本页中存在错误如下&#xff1a;\n\n" txt"错误&#xff1a;" msg &quo…

链表逆序(JAVA实现)

题目&#xff1a;将一个有链表头的单向单链表逆序 分析&#xff1a; 链表为空或只有一个元素直接返回&#xff1b;设置两个前后相邻的指针p,q&#xff0c;使得p指向的节点为q指向的节点的后继&#xff1b;重复步骤2&#xff0c;直到q为空&#xff1b;调整链表头和链表尾&…

vs/c++缓冲区溢出,未初始化变量检查

缓冲区溢出(buffer overrun)是c/c开发中比较令人头痛的问题,vs2005中有若干编译选项 可以有效的帮助程序员定位这些问题: 1,/GS:优化模式下有效,检测缓冲区溢出,只能检测出覆盖了返回地址的情况. 2,/RTCs:优化模式下无效,检测缓冲区溢出 voidTest2() { charbuffer1[100]; …

java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的? ( )

java面试题36 已知如下的命令执行 java MyTest a b c 请问哪个语句是正确的&#xff1f; ( ) A args[0] "MyTest a b c" B args[0] "MyTest" C args[0] "a" D args[1] "b" 蒙蔽树上蒙蔽果&#xff0c;蒙蔽树下你和我 对于java命…