python面试之爬虫理论篇

1.requests 模块中,requests.content 和 requests.text 的区别

.text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常,这是就需要用.content进行手动编码。

2.lxml的使用方法

# /	下一节点
# //  从当前节点开始递归下降,此路径运算符出现在模式开头时,表示应从根节点递归下降
# . 选取当前节点
# .. 选取当前节点的父节点
# @ 选取属性
# @* 选取所有属性
# [] 应用筛选模式,可以用来筛选想要的内容

#1.从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止
fo = open("html", "r", encoding="utf-8")
print("文件名为:", fo.name)
line = fo.read()
print("读取的字符串: %s" % line)
# 关闭文件
fo.close()

from lxml import etree
html = etree.HTML(line)
li = html.xpath('//li/@class')
print(html.xpath('//li[contains(@class,"name")]/text()'))

在这里插入图片描述

3.scrapy 的工作流程

scrapy详细工作流程:
1.首先Spiders(爬虫)将需要发送请求的url(requests)经ScrapyEngine(引擎)交给Scheduler(调度器)。

2.Scheduler(排序,入队)处理后,经ScrapyEngine,DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader。

3.Downloader向互联网发送请求,并接收下载响应(response)。将响应(response)经ScrapyEngine,SpiderMiddlewares(可选)交给Spiders。     

4.Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。

5.提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。

4.scrapy 的去重原理

1.Scrapy本身自带有一个中间件;
2.scrapy源码中可以找到一个dupefilters.py去重器;
3.需要将dont_filter设置为False开启去重,默认是false去重,改为True,就是没有开启去重;
4 .对于每一个url的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将指纹信息和set()集合中的指纹信息进 行 
比对,如果set()集合中已经存在这个数据,就不在将这个Request放入队列中;5.如果set()集合中没有存在这个加密后的数据,就将
这个Request对象放入队列中,等待被调度。

5.scrapy中有哪些组件

引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

6.工作中经常用到的反爬策略

设置用户代理 伪装浏览器
禁止IP 设置代理服务器(一般是收费、测试可以用免费的)
验证码 通过机器学习相关模型框架设别(后面再说)
动态加载 ajax(追踪请求过程,对url进行抓取,进而请求) 非常复杂的(selenium+无界面浏览器)
加密问题 解密(解密算法)
账户阻挡 通过登录
爬虫和反爬的博弈是做爬虫的核心问题,最终所有的反爬策略都会被解决掉,只不过公司成本能不能负担的了

7.代理失效问题

当我们频繁的爬取某些网站的时候,这些网站有可能会启动其反爬机制,对我们的ip地址进行限制,为了突破这种限制,可以设置代理服务器,对我们的ip进行隐藏。
可以设置一个代理池(一个列表放了多个代理服务器的ip),对代理进行管理,如果某一个禁用立即启用下一个
3.cookie如何处理?
创建cookie->创建handler携带cookie->使用opener携带handler进行请求

8.header头中的参数信息

Accept: 客户端能接收的资源类型

Accept-Encoding: 
gzip  表明实体采用GNU zip编码 JPEG这类文件用gzip压缩的不够好。
compress 表明实体采用Unix的文件压缩程序
deflate  表明实体是用zlib的格式压缩的
identity  表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

Accept-Language: 浏览器申明自己接收的语言。 语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等

Cache-Control: 
常见值有private、no-cache、max-age、must-revalidate等,默认为private.只能应用于http 1.1

Connection: 
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接 Connection: close 代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接

Cookie: 
是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如cookie会存储一些用户的用户名和密码,当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并通过后会判定你是合法用户,从而允许查看相应网页。当然cookie里面的数据不仅仅是上述范围,还有很多信息可以存储是cookie里面,比如sessionid等。

Host: 
请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的

Pragma: 
可以应用到http 1.0 和http 1.1

Referer: 
浏览器向web服务器发送请求的时候,referer用来告诉服务器从哪个页面链接过来的

9.scrapy 和 scrapy-redis 有什么区别

scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。

为什么选择redis数据库,因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。

10.分布式爬虫主要解决什么问题

ip、带宽、cpu、io 

11.写爬虫是用多进程好?还是多线程好?

进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
爬虫是IO密集型,用多线程比较好。
多进程是计算密集型。

12.解析网页的解析器

正则表达式:模糊匹配解析 
html.parser:结构化解析 
Beautiful Soup :结构化解析 
lxml:结构化解析
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值