Scrapy
爬取数据的时候遇到了什么反爬虫情况?你了解有哪些反爬虫机制?
初级:
网络基础:cookie, session, https, headers常用的字段,代理使用
Python基础:异步,多进程,多线程
爬虫:xpath, requests如何处理https,常见的反爬措施,最难的爬虫过程
scrapy使用中的细节,如代理,cookie,传参
数据库:数据库操作,并表
中级:
网络:几层网络层的细节,说说udp/tcp/smtp的区别,
DNS,路由和交换机的区别
Python: 多重继承,多台,单例装饰器的实现,数组/生成器/列表解析效率等
爬虫:分布式爬虫的实现,合理的架构,验证码的处理,数据部分更新的处理,写爬虫时有没有些辅助工具(scrapy shell 普通操作数据库的脚本)
数据库:sql nosql的细节,性能上的
1, 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?
Python自带:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功能。
urllib2.:urllib2.urlopen可以接受一个Request对象或者url,(在接受Request对象时候,并以此可以来设置一个URL 的headers),urllib.urlopen只接收一个url
urllib 有urlencode,urllib2没有,因此总是urllib,urllib2常会一起使用的原因
scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100个网站,并发及分布式处理方面,不够灵活,不便调整与括展。
request 是一个HTTP库, 它只是用来,进行请求,对于HTTP请求,他是一个强大的库,下载,解析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现.
2,scrapy和scrapy-redis的区别?
scrapy是一个爬虫通用框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫,而提供了一些以redis为基础的组件
为什么会选择redis数据库?
因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高
什么是主从同步?
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态
3,scrapy的优缺点?为什么要选择scrapy框架?
优点:采取可读性更强的xpath代替正则
强大的统计和log系统
同时在不同的url上爬行
支持shell方式,方便独立调试
写middleware,方便写一些统一的过滤器
通过管道的方式存入数据库
缺点:基于python爬虫框架,扩展性比较差,基于twisted框架,运行中exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉
4,scrapy和requests的使用情况?
requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据
scapy 底层是异步框架 twisted ,并发是最大优势
5,描述一下scrapy框架的运行机制?
从start_urls里面获取第一批url发送请求,请求由请求引擎给调度器入请求对列,获取完毕后,调度器将请求对列交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理,如果提取出需要的数据,则交给管道处理,如果提取出url,则继续执行之前的步骤,直到多列里没有请求,程序结束。
6,写爬虫使用多进程好,还是用多线程好?
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程
7,常见的反爬虫和应对方法?
\1. 基于用户行为,同一个ip段时间多次访问同一页面** **
利用代理ip,构建ip池
\2. 请求头里的user-agent
构建user-agent池(操作系统、浏览器不同,模拟不同用户)
\3. 动态加载(抓到的数据和浏览器显示的不一样),js渲染
模拟ajax请求,返回json形式的数据
4,selenium / webdriver 模拟浏览器加载
5,对抓到的数据进行分析
6,加密参数字段
会话跟踪【cookie】
防盗链设置【Referer
8,分布式爬虫主要解决什么问题?
面对海量待抓取网页,只有采用分布式架构,才有可能在较短时间内完成一轮抓取工作。
它的开发效率是比较快而且简单的。
9,爬取时弹出对话框让验证,又该怎么处理?
HTTP请求的basic认证** **
客户端将输入的用户名密码用Base64进行编码后,采用非加密的明文方式传送给服务器。
Authorization: Basic xxxxxxxxxx.
10,你在爬虫过程中,都是怎么解决反爬的,爬取多少数据,用了多长时间?
11,爬取这些数据都用来做什么的?怎么交付给公司?客户是谁?爬取数据的影响因素?
当时我们公司核心业务是网站开发,还有数据的采集,会经常需要一些数据,采集的数据一 是为了满足公司需求,二是我们有合作的公司,负责给他们提供他们所需要的数据,(根据客户需求做好 相应格式的数据文件,交付给项目组长)(数据库导出)** **
影响因素:机器的性能及带宽,代码质量,爬取时的反爬机制
12,什么是爬虫,为什么要用爬虫?
用于在网络上采集数据的程序,可以用任何语言开发,python更加方便快捷高效一些。
爬虫的目的:采集一些需要的数据。
为什么python更适合写爬虫程序?python中封装了很多爬虫库,如urllib ,re,bs,scrapy等,开发效率更高
13,爬虫的基本流程?
1,浏览器发起请求,可能包含请求头等信息,等待服务器相应
2,获取服务器响应内容,可能是网页文本(html、json代码),图片二进制、视频二进制等
3,解析内容(正则、xpath、json解析等 )
4, 保存数据(本地文件、数据库等)
14,如何提高爬取效率?
爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回** **
1,采用异步与多线程,扩大电脑的cpu利用率;
2,采用消息队列模式
3,提高带宽
15,request请求方式中的post、get有什么区别
GET一般用于获取/查询资源信息,而POST一般用于更新资源信息** **
get是在url中传递数据,数据放在请求头中,post是在请求体中传递数据
get安全性非常低,post安全性较高,但是get执行效率却比Post方法好
16,模拟登陆原理?
因为http请求是无状态的,网站为了识别用户身份,需要通过cookie记录用户信息(用户、密码),这些信息都会在手动登陆时记录在post请求的form-data里,那么在爬虫时候只需要将这些信息添加到请求头里即可。** **
17,分布式原理?
多台机器多个spider 对多个 url 同时进行处理
分布式如何判断爬虫已经停止了?
18,下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
**爬虫中间件(Spider Middlewares)**介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
**调度中间件(Scheduler Middewares)**介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应
19,爬虫协议?
Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
20,爬虫的底层原理?
21,scrapy中间件有几种类,你用过那些中间件?
scrapy的中间件理论上有三种(Schduler Middleware,Spider Middleware,Downloader Middleware)** **
DownloaderMiddleware主要处理请求Request发出去和结果Response返回的一些回调,
比如说你要加UserAgent,使用代理,修改refferer(防盗链),添加cookie,或者请求异常超时处理啥的
常用: 1.爬虫中间件Spider Middleware
主要功能是在爬虫运行过程中进行一些处理.
2.下载器中间件Downloader Middleware
主要功能在请求到网页后,页面被下载时进行一些处理.
22,代理问题
1.为什么会用到代理
将真是IP隐藏起来(请求过于太频繁的话,ip可能会被禁止)
2.代理怎么使用(具体代码,请求在什么时候添加的代理)
proxy_handler = ProxyHandler({‘http’: ‘http://183.159.89.204:18118’})
# 构建一个Opener对象
proxy_opener = build_opener(proxy_handler)
# 使用自定义opener访问服务器数据,得到相应
response = proxy_opener.open(request)
3.代理失效了怎么处理
23,验证码处理
1.登陆验证码处理
2.爬取速度过快出现的验证码处理
3.如何用机器识别验证码
24,模拟登陆问题
1.模拟登陆流程
因为http请求是无状态的,网站为了识别用户身份,需要通过cookie记录用户信息(用户、密码),这些信息都会在手动登陆时记录在post请求的form-data里,那么在爬虫时候只需要将这些信息添加到请求头里即可
2.cookie如何处理
同上
3.如何处理网站传参加密的情况
对抓包数据进行分析,这要 在具体的项目中去说明
25,数据存储和数据库问题
1.关系型数据库和非关系型数据库的区别
1.关系型数据库通过外键关联来建立表与表之间的关系,
2.非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定
2.爬下来数据你会选择什么存储方式,为什么
3.各种数据库支持的数据类型,和特点,比如:redis如何实现持久化,mongodb
是否支持事物等。。
26,协议问题
# 爬虫从网页上拿数据肯定需要模拟网络通信的协议
1.http协议,请求由什么组成,每个字段分别有什么用,https和http有什么差距
2.证书问题
3.TCP,UDP各种相关问题
27,数据提取问题
1.主要使用什么样的结构化数据提取方式
xpath 正则 bs4等
2.动态加载的数据如何提取
模拟ajax请求,返回json形式的数据
3.json数据如何提取
python中内置了json模块,提供了dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。然后再对数据用递归,正则,或者一层一层获取的方法得到数据** **
28,redis数据库有哪几种数据结构?
5种数据结构:
String字符串
List列表
Set集合
Hash散列
Zset有序集合
29,使用redis搭建分布式系统时如何处理网络延迟和网络异常?
由于网络异常的存在,分布式系统中请求结果存在“三态”的概念,即三种状态:“成功”、“失败”、“超时(未知)”
当出现“超时”时可以通过发起读取数据的操作以验证 RPC 是否成功(例如银行系统的做法)
另一种简单的做法是,设计分布式协议时将执行步骤设计为可重试的,即具有所谓的“幂等性”
也可设置一个超时时间,如果超过该时间,可以try出去。
30,如果对方网站反爬取,封IP了怎么办?
1,放慢抓取熟速度,减小对目标网站造成的压力,但是这样会减少单位时间内的数据抓取量
2,使用代理IP(免费的可能不稳定,收费的可能不划算)
31,爬虫过程中验证码怎么处理?
32,关于防盗链?
**部分服务器会检查 http 请求头的 Referer 字段来判断你是否是从指定页面跳转而来的,以达到防盗链的作用。因此在伪装请求头部的时候,该字段也是不容忽视的。 **
last:爬虫中遇到的错误,是怎么解决的?
1,获取json数据之后,把Json格式字符串解码转换成Python对象时,在json.loads的时候出错?
**要注意被解码的Json字符的编码,如果传入的字符串的编码不是UTF-8的话,需要指定字符编码的参数encoding **
2,使用urllib2时,经常遇到编码问题
3,有时会遇到503错误
主要是指服务器判断出你是爬虫程序,所以需要改变一下请求头,设置一下时间的间隔
4,bs4库解析时遇到的问题?
**html 页面的数据经过Beautiful Soup库的解析后,部分html源码丢失,找不到想要的数据了 **
**查看官方文档,bs 库支持的解析库有 lxml, html5lib 和 html.parser。用的最多的是 lxml,因为它的解析速度快,并且容错能力强,默认也是使用该解析器。 **
出现解析后源码丢失的可能原因有 2 个:
BeautifulSoup 有时候会遇到非法的,不支持的 html 源码而导致无法解析或无法正常解析 html;
处理的文档太大,而处理的解析器缓存不够造成的信息丢失。
这里换一个解析器,换成 html.parser 就可以了。
5,动态加载问题?
1、对__if__name__ == ‘main’的理解陈述
name__是当前模块名,当模块被直接运行时模块名为_main,也就是当前的模块,当模块被导入时,模块名就不是__main_,即代码将不会执行。
2、python是如何进行内存管理的?
a、对象的引用计数机制 python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。 b、垃圾回收 1>当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。 2>当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象 的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。 c、内存池机制 Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。 1>Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理 对小块内存的申请和释放。 2>Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用 系统的malloc。 3>对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
3、请写出一段Python代码实现删除一个list里面的重复元素
|
|
4、Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。 **浅拷贝:**创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数} **深拷贝:**创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
5、介绍一下except的用法和作用?
try…except…except…else… 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。 try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行如果存在finally语句,最后总是会执行。
6、Python中__new__与__init方法的区别
new:它是创建对象时调用,会返回当前对象的一个实例,可以用_new_来实现单例
init:它是创建对象后调用,对当前对象的一些实例初始化,无返回值
7、常用的网络数据爬取方法
- 正则表达式
- Beautiful Soup
- Lxml
8、遇到过得反爬虫策略以及解决方法
1.通过headers反爬虫 2.基于用户行为的发爬虫:(同一IP短时间内访问的频率) 3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生成) 4.对部分数据进行加密处理的(数据是乱码) 解决方法: 对于基本网页的抓取可以自定义headers,添加headers的数据 使用多个代理ip进行抓取或者设置抓取的频率降低一些, 动态网页的可以使用selenium + phantomjs 进行抓取 对部分数据进行加密的,可以使用selenium进行截图,使用python自带的pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
9、urllib 和 urllib2 的区别
urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。urllib不可以伪装你的User-Agent字符串。 urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
10、设计一个基于session登录验证的爬虫方案
11、列举网络爬虫所用到的网络数据包,解析包
- 网络数据包 urllib、urllib2、requests
- 解析包 re、xpath、beautiful soup、lxml
12、熟悉的爬虫框架
Scrapy框架 根据自己的实际情况回答
13、Python在服务器的部署流程,以及环境隔离
14、Django 和 Flask 的相同点与不同点,如何进行选择?
15、写一个Python中的单例模式
|
|
16、Linux部署服务脚本命令(包括启动和停止的shell脚本)
17、你用过多线程和异步嘛?除此之外你还用过什么方法来提高爬虫效率?
- scrapy-redis 分布式爬取
- 对于定向爬取可以用正则取代xpath
18、POST与 GET的区别
- GET数据传输安全性低,POST传输数据安全性高,因为参数不会被保存在浏览器历史或web服务器日志中;
- 在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用POST方式;
- GET在url中传递数据,数据信息放在请求头中;而POST请求信息放在请求体中进行传递数据;
- GET传输数据的数据量较小,只能在请求头中发送数据,而POST传输数据信息比较大,一般不受限制;
- 在执行效率来说,GET比POST好
19、什么是lambda函数?它有什么好处?
lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数 lambda函数:首要用途是指点短小的回调函数
|
|
1. 为什么 requests 请求需要带上 header?
原因是:模拟浏览器,欺骗服务器,获取和浏览器一致的内容
header 的形式:字典
|
|
用法: 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. 写一个邮箱地址的正则表达式?
|
|
4. 你遇到的反爬虫策略有哪些?及应对策略有什么?
- 通过headers反爬虫
- 基于用户行为的发爬虫:例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作
- 动态网页反爬虫,例如:我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的
- 对部分数据进行加密处理的,例如:我们要抓的数据部分能够抓到,另外的部分加密处理了,是乱码
- 应对策略:
|
|
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的区别?
|
|
7.robots协议是什么?
Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
8.什么是爬虫?
爬虫是请求网站并提取数据的自动化程序
9.爬虫的基本流程?
|
|
10.什么是Request和Response?
本地 向 服务器 发送Request,服务器根据请求返回一个Response,页面就显示在页面上了
1、浏览器就发送消息给该网址所在的服务器,这个过程叫做Http Request
2、服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应处
理,然后把消息回传给浏览器,这个过程叫做HTTP Response
3、浏览器收到服务器的Response消息后,会对信息进行相应处理,然后显示
github和gitlab的区别?
先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。
GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。
而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。
GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:
允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。
从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。
如何为github上牛逼的开源项目贡献代码?
对一个开源项目有足够了解的情况下,如果你发现问题或者更好的解决方案的话,可以开个issue先。
一般情况下维护这个项目的人或者其他使用这个项目的人会参与讨论的,然后基于这些讨论你可以发一些pull requests。
如果你的方案得到很多人赞同的话,项目维护人员会把他们merge,你也就成了这个项目的contributor了。
当然很多情况下,你开的这个issue已经有人提过了,或者说是你自己误解了,但是相信在和其他开发人员交流的过程中,你也能学到许多。
git中 .gitignore文件的作用?
一般来说每个Git项目中都需要一个“.gitignore”文件,这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。
实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。
什么是敏捷开发?
敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
简述 requests模块的作用及基本使用?
- 使用requests可以模拟浏览器发送的请求
- 发送get请求:requests.get()
- 发送post请求:requests.post()
- 读取请求返回内容:requests.text()
- 保存cookie:requests.cookie()
简述 beautifulsoup模块的作用及基本使用?
查找xml/html文本中查找指定信息的三方库
* 获取title信息 soup.title
* 获取title的属性 soup.title.attrs
简述 seleninu模块的作用及基本使用?
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器
scrapy框架中各组件的工作流程?
- Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
- Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
- Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
- Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
- Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
- Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
- Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
在scrapy框架中如何设置代理(两种方法)?
|
|
scrapy框架中如何实现大文件的下载?
- FilesPipeline
- ImagesPipeline
scrapy中如何实现限速?
修改setting文件的AUTOTHROTTLE_START_DELAY 打开后默认限速为5秒
scrapy中如何实现暂定爬虫?
在cmd上cd 进入项目
然后在项目目录下创建 记录文件:remain/001
然后输入:scrapy crawl zhihu -s JOBDIR=remain/001
回车运行就行了
按ctrl+c 暂停
继续运行只要再次输入:scrapy crawl zhihu -s JOBDIR=remain/001就行了
需要重新爬取就换个文件 002就行了
scrapy中如何进行自定制命令?
在spiders同级创建任意目录,如:commands 在其中创建 crawlall.py 文件 (此处文件名就是自定义的命令)
|
|
在settings.py 中添加配置 COMMANDS_MODULE = ‘项目名称.目录名称’
在项目目录执行命令:scrapy crawlall
scrapy中如何实现的记录爬虫的深度?
class scrapy.contrib.spidermiddleware.depth.DepthMiddleware
DepthMiddleware是一个用于追踪每个Request在被爬取的网站的深度的中间件。 其可以用来限制爬取深度的最大深度或类似的事情。
DepthMiddleware 可以通过下列设置进行配置(更多内容请参考设置文档):
DEPTH_LIMIT - 爬取所允许的最大深度,如果为0,则没有限制。
DEPTH_STATS - 是否收集爬取状态。
DEPTH_PRIORITY - 是否根据其深度对requet安排优先级
scrapy中的pipelines工作原理?
Scrapy 提供了 pipeline 模块来执行保存数据的操作。在创建的 Scrapy 项目中自动创建了一个 pipeline.py 文件,同时创建了一个默认的 Pipeline 类。我们可以根据需要自定义 Pipeline 类,然后在 settings.py 文件中进行配置即可
scrapy的pipelines如何丢弃一个item对象?
到pipelines的时候不执行持久化保存就会什么也不执行也就是丢弃
简述scrapy中爬虫中间件和下载中间件的作用?
下载器中间件(Downloader Middlewares)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
爬虫中间件(Spider Middlewares)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
scrapy-redis组件的作用?
scheduler - 调度器 dupefilter - URL去重规则(被调度器使用) pipeline - 数据持久化
scrapy-redis组件中如何实现的任务的去重?
定义去重规则(被调度器调用并应用)
爬虫相关
138.在 requests 模块中,requests.content 和 requests.text 什么区别 139.简要写一下 lxml 模块的使用方法框架 140.说一说 scrapy 的工作流程 141.scrapy 的去重原理 142.scrapy 中间件有几种类,你用过哪些中间件 143.你写爬虫的时候都遇到过什么?反爬虫措施,你是怎么解决的? 144.为什么会用到代理? 145.代理失效了怎么处理? 146.列出你知道 header 的内容以及信息 147.说一说打开浏览器访问 www.baidu.com 获取到结果,整个流程。 148.爬取速度过快出现了验证码怎么处理 149.scrapy 和 scrapy-redis 有什么区别?为什么选择 redis 数据库? 150.分布式爬虫主要解决什么问题 151.写爬虫是用多进程好?还是多线程好?为什么? 152.解析网页的解析器使用最多的是哪几个 153.需要登录的网页,如何解决同时限制 ip,cookie,session(其中有一些是动态生成的)在不使用动态爬取的情况下? 154.验证码的解决(简单的:对图像做处理后可以得到的,困难的:验证码是点击,拖动等动态进行的?) 155.使用最多的数据库(mysql,mongodb,redis 等),对他的理解?