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的“无头”浏览器,它将网站加载到内存中并在页面上执行JavaScript。因为它不显示图形界面,所以它比完整的浏览器运行效率更高。与Chrome或Firefox等传统浏览器相比,资源消耗会更少。如果我们将Selenium和PhantomJS结合起来,我们就可以运行一个非常强大的网络爬虫,它可以处理JavaScript、cookie、标头以及我们真正的用户需要做的任何事情。主程序退出后,selenium不保证phantomJS也会成功退出。最好手动关闭phantomJS进程。(可能会导致多个phantomJS进程运行,占用内存)。虽然WebDriverWait可能会减少延迟,但是目前有bug(各种报错),此时可以使用sleep。phantomJS爬取数据比较慢,可以选择多线程。如果你发现有的可以运行有的不能运行,可以尝试将phantomJS换成chrome。3、为什么请求需要携带header?原因是:模拟浏览器,欺骗服务器,获取与浏览器相同的内容。header的形式:dictionaryheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/54.0.2840.99Safari/537.36"}用法:requests.get(url,headers=headers)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的地址。这样做的结果是,虽然有多个slave,但是每个人都可以获取到url的地方只有一个,那就是服务器master上的redis数据库。并且,由于scrapy-redis自带的队列机制,slave获取的链接不会相互冲突。这样每个slave在完成爬取任务后,将得到的结果汇总到服务器(此时数据存储不再是redis,而是存储具体内容的数据库如mongodb或mysql)。这种方法还有一个好处就是程序可移植性强。只要路径问题处理好,基本上就是把slave上的程序复制粘贴到另一台机器上运行。6.python2.x中的urllib和urllib2有什么区别?相同点和不同点:都做url请求操作,但是区别很明显。urllib2可以接受Request类的实例来为URL请求设置标头,urllib只能接受URL。这意味着您不能通过urllib模块伪装您的用户代理字符串等(伪装成浏览器)。urllib提供了用于GET查询字符串生成的urlencode方法,但urllib2没有。这就是urllib经常与urllib2一起使用的原因。该模块的优点是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTPRequest的header部分。但是urllib.urlretrieve函数和urllib.quote等一系列quote和unquote函数并没有被添加到urllib2中,所以有时需要urllib的协助。7.什么是机器人协议?Robots协议(又称爬虫协议、爬虫规则、机器人协议等)是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。Robots协议是互联网网站社区中常见的道德规范。其目的是保护网站数据和敏感信息,确保用户的个人信息和隐私不受侵犯。因为不是命令,所以需要搜索引擎自觉遵守。8、什么是爬行动物?爬虫是一种请求网站并提取数据的自动化程序9.爬虫的基本过程?1、通过http库向目标站点发起请求,即发送Request。请求可以包含额外的头部和其他信息,并等待服务器响应。2、如果服务器能正常响应,就会得到一个Response。Response的内容比请求的多。页面内容3、解析内容:正则表达式、页面解析库、json4、保存数据:文本或存入数据库10、什么是Request和Response?本地向服务器发送Request,服务器根据请求返回Response,页面显示在第1页。浏览器向URL所在服务器发送消息。这个过程称为HttpRequest2。服务器收到浏览器发送的消息后,可以根据浏览器发送的消息内容做相应的处理,然后将消息返回给浏览器。此过程称为HTTPResponse3。浏览器收到服务器的Response报文后,会对信息进行相应的处理,然后显示11.Request里面有什么?1、请求方式:主要有GET和POST方式。POST请求的参数不会包含在url中。2、请求URLURL:统一的资源定位符,比如一个网页文档、一张图片、一段视频等可以用URL来唯一确定3、请求头信息,包括User-Agent(浏览器请求头)、Host、Cookies信息4.请求体,对于GET请求,一般不会,对于POST请求,请求体一般包含form-data12.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:浏览器可以处理的压缩编码Language:browse浏览器当前设置的语言Connection:浏览器和服务器之间的连接类型Cookie:当前页面设置的任何CookieHost:发出请求的页面的域名Referer:发出请求的页面的URLrequestUser-Agent:浏览器HTTP响应头信息的用户代理字符串:Date:表示发送消息的时间,时间的描述格式由rfc822定义server:服务器名。连接:浏览器和服务器之间的连接类型。content-type:表示后面的文档属于什么MIME类型。Cache-Control:控制HTTP缓存。15、mysql索引在什么情况下会失效?不会使用条件索引(这就是为什么或应该尽可能少使用的原因)。如果要使用or,并且想让索引生效,只能在or条件中对每一列添加索引。2.对于多列索引,不使用第一部分,索引将不会被使用3.像查询以%开头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不保存表的行数,比如selectcount()fromtable,InnoDB需要扫描整个表计算有多少行,而MyISAM只需要简单读取保存的行数.注意当count()语句包含where条件时,MyISAM也需要扫描全表;7、对于自增字段,InnoDB必须只包含该字段的索引,但在MyISAM表中,可以与其他字段建立联合索引;8、清空全表时,InnoDB一次删除一行,速度很慢。MyISAM将重建表;9、InnoDB支持行锁(在某些情况下,它仍然锁定整个表,比如updatetableseta=1whereuserlike'%lee%'16、Scrapy的优缺点:优点:scrapy是异步的可读性更强xpath替代常规强大??的统计和日志系统,同时在不同的url上爬取支持shell模式,方便独立调试和编写中间件,方便编写一些统一的过滤器通过管道存入数据库缺点:基于python的twisted框架,运行中出现异常不会杀死reactor,异步框架出错后不会停止其他任务,数据错误检测困难17.HTTPS如何实现安全传输的数据的客户端(通常是浏览器)首先向服务器发送加密通信的请求,服务器接收请求,然后响应,客户端收到cer后tificate,它会首先验证服务器是否收到了用公钥加密的内容,并在服务器端使用。私钥解密后得到随机数pre-mastersecret,然后根据radom1、radom2、pre-mastersecret通过一定算法得到会话密钥和MAC算法秘钥,用作后续交互过程中的对称密钥。同时client也会使用radom1,radom2,pre-mastersecret,同样的算法生成sessionKey和MAC算法的secretkey。然后在后续的交互中,使用会话密钥和MAC算法的密钥对传输的内容进行加解密。18.描述scrapy框架运行的机制?从start_urls中获取第一批url并发送请求。引擎将请求发送给调度器并将其放入请求队列。请求完成后,调度器将请求队列中的请求传递给下载器获取请求对应的响应资源,并将响应交给自己编写的解析方法进行抽取处理:如果需要的数据是提取出来,交给pipeline文件处理;如果提取到url,则继续前面的步骤(发送url请求,引擎将请求传递给调度器进入队列...),直到请求队列中没有请求,程序结束。请继续关注我
