动态网页抓取(一个关于Python爬虫面试题的总结,相对于来说出现频率比较高的一些!)

优采云 发布时间: 2022-02-08 01:14

  动态网页抓取(一个关于Python爬虫面试题的总结,相对于来说出现频率比较高的一些!)

  今天就给大家总结一下Python爬虫面试题,出现的比较多!

  1. 为什么请求需要带headers?

  原因是:模拟浏览器,欺骗服务器,获取与浏览器一致的内容

  表头形式:字典

  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 的“无头”浏览器,它将 网站 加载到内存中并在页面上执行 JavaScript,因为它不显示图形界面,运行时间比完整的浏览器高效。与传统的 Chrome 或 Firefox 等浏览器相比,资源消耗会更少。

  如果我们将 Selenium 和 PhantomJS 结合起来,我们可以运行一个非常强大的网络爬虫,它可以处理 JavaScript、cookie、标头以及我们真实用户需要做的任何其他事情。主程序退出后,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,添加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. python2.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.txt,网站通过robots协议告诉搜索引擎哪些页面可以爬取,哪些页面不能爬取。

  机器人协议是国际互联网社区普遍使用的网站道德准则,其目的是保护网站数据和敏感信息,确保用户的个人信息和隐私不受侵犯。因为不是命令,所以需要搜索引擎有意识地服从。

  8.什么是爬虫?

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

  9.爬虫的基本流程?

  1、通过http库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应

2、如果服务器能正常响应,会得到一个Response,Response的内容比啊是索要获取的页面内容

3、解析内容:正则表达式、页面解析库、json

4、保存数据:文本或者存入数据库

  10.什么是请求和响应?

  本地向服务器发送Request,服务器根据请求返回Response,页面显示

  1、浏览器向URL所在的服务器发送消息。这个过程称为 Http 请求

  2、服务器收到浏览器发送的消息后,可以根据浏览器发送的消息内容采取相应的动作

  过程,然后将消息发送回浏览器,这个过程称为 HTTP Response

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

  下一期,我们将继续为大家更新更多关于Python爬虫的面试题!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线