Python爬虫面试总结


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

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

2. 谈一谈你对 Selenium 和 PhantomJS 了解

Selenium 是一个Web 的自动化测试工具,可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。Selenium库里有个叫 WebDriver 的API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像BeautifulSoup 或者其他Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。

PhantomJS是一个基于 Webkit 的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。相比传统的Chrome或 Firefox 浏览器等,资源消耗会更少。

如果我们把 SeleniumPhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScripCookieheaders,以及任何我们真实用户需要做的事情。主程序退出后,selenium 不保证 phantomJS 也成功退出,最好手动关闭 phantomJS 进程。(有可能会导致多个 phantomJS 进程运行,占用内存)。WebDriverWait 虽然可能会减少延时,但是目前存在 bug(各种报错),这种情况可以采用 sleep。phantomJS爬数据比较慢,可以选择多线程。如果运行的时候发现有的可以运行,有的不能,可以尝试将 phantomJS 改成 Chrome

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

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

    1. 通过headers反爬虫
    1. 基于用户行为的发爬虫:例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作
    1. 动态网页反爬虫,例如:我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的
    1. 对部分数据进行加密处理的,例如:我们要抓的数据部分能够抓到,另外的部分加密处理了,是乱码
      应对策略:
  • 1.对于基本网页的抓取可以自定义headers,添加headers的数据,代理来解决
    1. 有些网站的数据抓取必须进行模拟登陆才能抓取到完整的数据,所以要进行模拟登陆。
    1. 对于限制抓取频率的,可以设置抓取的频率降低一些,
    1. 对于限制ip抓取的可以使用多个代理ip进行抓取,轮询使用代理
    1. 针对动态网页的可以使用selenium+phantomjs进行抓取,但是比较慢,所以也可以使用查找接口的方式进行抓取。
    1. 对部分数据进行加密的,可以使用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请求的操作的,但是区别很明显。
    1. urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以通过urllib模块伪装你的User Agent字符串等(伪装浏览器)。
    1. urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
    1. 模块比较优势的地方是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header部。
    1. 但是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消息后,会对信息进行相应处理,然后显示

11.Request中包含什么呢?

  • 1、请求方式:主要有GETPOST两种方式,POST请求的参数不会包含在url里面
  • 2、请求URL
    URL:统一资源定位符,如一个网页文档、一张图片、一个视频等都可以用URL来唯一确定
  • 3、请求头信息,包含了User-Agent(浏览器请求头)、HostCookies信息
  • 4、请求体,GET请求时,一般不会有,POST请求时,请求体一般包含form-data

12.Response中包含什么信息?

  • 1、响应状态:状态码 正常响应200 重定向
  • 2、响应头:如内容类型、内容长度、服务器信息、设置cookie等
  • 3、响应体信息:响应源代码、图片二进制数据等等

13.常见的http状态码

  • 200状态码 服务器请求正常
  • 301状态码:被请求的资源已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
  • 302状态码:请求的资源临时从不同的URI响应请求,但请求者应继续使用原有位置来进行以后的请求
  • 401状态码:请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 403状态码:服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。
  • 404状态码:请求失败,请求所希望得到的资源未被在服务器上发现。
  • 500状态码:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器的程序码出错时出现。
  • 503状态码:由于临时的服务器维护或者过载,服务器当前无法处理请求。

14.HTTP 的请求和响应都包含哪些内容

  • HTTP请求头
  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串
  • HTTP响应头部信息:
  • Date:表示消息发送的时间,时间的描述格式由rfc822定义
  • server:服务器名字。
  • Connection:浏览器与服务器之间连接的类型
  • content-type:表示后面的文档属于什么MIME类型
  • Cache-Control:控制HTTP缓存

15. mysql的索引在什么情况下失效

  • 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
    要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
  • 2.对于多列索引,不是使用的第一部分,则不会使用索引
  • 3.like查询以%开头
  • 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

15.MySQL 有什么引擎,各引擎之间有什么区别?

  • 主要 MyISAM 与 InnoDB 两个引擎,其主要区别如下:
  • 1、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;
  • 2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;
  • 3、InnoDB 支持外键,MyISAM 不支持;
  • 4、MyISAM 是默认引擎,InnoDB 需要指定;
  • 5、InnoDB 不支持 FULLTEXT 类型的索引;
  • 6、InnoDB 中不保存表的行数,如 select count() from table 时,InnoDB;需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表;
  • 7、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;
  • 8、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;
  • 9、InnoDB 支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

16.Scrapy优缺点:

  • 优点:
    1. scrapy 是异步的
    1. 采取可读性更强的xpath代替正则
    1. 强大的统计和log系统
    1. 同时在不同的url上爬行
    1. 支持shell方式,方便独立调试
    1. 写middleware,方便写一些统一的过滤器
    1. 通过管道的方式存入数据库
  • 缺点:基于python的爬虫框架,扩展性比较差
    1. 基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉。

17.HTTPS 是如何实现安全传输数据的

    1. 客户端(通常是浏览器)先向服务器发出加密通信的请求
    1. 服务器收到请求,然后响应
    1. 客户端收到证书之后会首先会进行验证
    1. 服务器收到使用公钥加密的内容,在服务器端使用私钥解密之后获得随机数pre-master secret,然后根据radom1、radom2、pre-master secret通过一定的算法得出session Key和MAC算法秘钥,作为后面交互过程中使用对称秘钥。同时客户端也会使用radom1、radom2、pre-master secret,和同样的算法生成session Key和MAC算法的秘钥。
    1. 然后再后续的交互中就使用session Key和MAC算法的秘钥对传输的内容进行加密和解密。

18.描述下scrapy 框架运行的机制?

start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:

  1. 如果提取出需要的数据,则交给管道文件处理;
  2. 如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342