今天给大家出一个关于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

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

  1. 2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?

    2019最新Python学习教程(Python视频教程_Python学习教程_Python学习路线):你心目中编程界的MVP是谁?编程界的王者是渐落寞的Java还是大火的Python? 是不是你们也喜 ...

  2. Python爬虫抓取考试试题

    Python爬虫抓取考试试题 今天做了个小玩意,但觉得挺有意思的,分享给大家.主要是这样的,因为帮妹子寻找考试资料,发现同一本书不同的章节分别在不同的链接中,复制起来实在要命,所以就在想能不能用爬虫实 ...

  3. 2019最新Python学习路线图:如何用Python创建微信机器人

    微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地.今天我们要讲的最新Python学习路线教程便是如何用Python来做一个微信聊天机器人,突然想起鲁迅先生曾经说过 ...

  4. 2019最新python面试题详解(应届生)

    1 python三大利器是什么? 1>装饰器 在不修改源代码装饰器的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上. 2>迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合 ...

  5. Python爬虫高阶:微店混淆逆向解密

    大家好,我是辣条. 这是我爬虫系列的第三十篇,爬虫之路永无止境. 采集目标 网址: aHR0cHM6Ly93d3cud2VpZGlhbi5jb20vP3NvdXJjZT1ndWFud2FuZw== 工 ...

  6. 人见人爱的最新 Python 爬虫利器

    Python上有一个非常著名的HTTP库--requests,相比大家都听说过,用过的人都说好!现在requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜出来,这是一个 ...

  7. 2019最新Python从入门到精通之30天快速学Python项目实战(完整)

    课程目录  python入门教程-1-Python编程语言历史及特性.mkv python入门教程-2-Python编程语言初接触.mkv python入门教程-3-Python程序文件结构.mkv ...

  8. 最新python爬虫抓取新浪微博千万级数据,scrapy思路+架构+源码

    一.前期工作... 3 1.1 爬取目标... 3 1.2 准备工作... 3 1.3 爬取思路... 3 1.4 爬取分析... 3 二.项目实战... 5 2.1 新建项目... 5 2.2 创建 ...

  9. 达内 2019最新python(内容全)

    复制这段内容后打开百度网盘手机App,操作更方便哦 链接:https://pan.baidu.com/s/1pDUr436MqmZZuboN6LA9pA 提取码:yyik

最新文章

  1. linux 下 使用wget 下载 jdk资源 命令
  2. 哈希表的实现(取余法)
  3. D3DPOOL(资源池)
  4. Spring 自定义注解玩法大全,从入门到…
  5. ML之NBLoR:利用NB(朴素贝叶斯)、LoR(逻辑斯蒂回归)算法(+CountVectorizer)对Rotten Tomatoes影评数据集进行文本情感分析—五分类预测
  6. android创建avd,详解如何创建和使用AVD
  7. 我们未能完成您的购买_销售完成后,客户的消极情绪产生的原因及处理方法
  8. MapReduce编程实践
  9. 用筛选法求100之内的素数
  10. 热更新_UnityXlua热更新
  11. 基于Mat变换的骨架提取Java
  12. spss进行主成分分析
  13. SM2258XT+B17A测试(焊接+开卡+测速+跑圈)
  14. 第八章 DirectX 3D模型加载和骨骼动画(上)
  15. css字间距 与 Photoshop里字间距关系
  16. linux版虚拟示波器,借你一双慧眼——DSCope虚拟示波器评测
  17. python的str是什么意思?
  18. 会议介绍:国际会议级别
  19. vc2010 std::tr1 bind库捉虫记
  20. 前端绝对路径不显示图片_img标签使用绝对路径无法显示图片

热门文章

  1. 第十五期:真相了,中台到底“出路”还是“末路”?
  2. 计算机操作系统(5):操作系统的结构设计
  3. element-ui cascader 级联选择器 存最后一级id及回显
  4. pcm压缩 java,Java C.PcmEncoding方法代码示例
  5. python plt.show_如何使用Python最大化plt.show()窗口
  6. pytest+allure生成漂亮的报告+显示
  7. Spring Boot实践——基础和常用配置
  8. 第6课 仿Siri机器人-语音朗读和语音识别
  9. iOS 里const在修饰对象时候的用法
  10. 【codeforces 239B】Easy Tape Programming