0 遇到过得反爬虫策略以及解决方法?
1.通过headers反爬虫 2.基于用户行为的发爬虫:(同一IP短时间内访问的频率) 3.动态网页反爬虫(通过ajax请求数据,或者通过JavaScript生成) 4.对部分数据进行加密处理的(数据是乱码)
解决方法:
对于基本网页的抓取可以自定义headers,添加headers的数据 使用多个代理ip进行抓取或者设置抓取的频率降低一些, 动态网页的可以使用selenium + phantomjs 进行抓取 对部分数据进行加密的,可以使用selenium进行截图,使用python自带的pytesseract库进行识别,但是比较慢最直接的方法是找到加密的方法进行逆向推理。
1 urllib 和 urllib2 的区别?
- urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。urllib不可以伪装你的User-Agent字符串。
- urllib提供urlencode()方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
2 列举网络爬虫所用到的网络数据包,解析包?
- 网络数据包 urllib、urllib2、requests
- 解析包 re、xpath、beautiful soup、lxml
3 简述一下爬虫的步骤?
- 确定需求;
- 确定资源;
- 通过url获取网站的返回数据;
- 定位数据;
- 存储数据。
4 遇到反爬机制怎么处理?
反爬机制:
headers方向 判断User-Agent、判断Referer、判断Cookie。 将浏览器的headers信息全部添加进去 注意:Accept-Encoding;gzip,deflate需要注释掉
5 常见的HTTP方法有哪些?
- GET:请求指定的页面信息,返回实体主体;
- HEAD:类似于get请求,只不过返回的响应中没有具体的内容,用于捕获报头;
- POST:向指定资源提交数据进行处理请求(比如表单提交或者上传文件),。数据被包含在请求体中。
- PUT:从客户端向服务端传送数据取代指定的文档的内容;
- DELETE:请求删除指定的页面;
- CONNNECT:HTTP1.1协议中预留给能够将连接方式改为管道方式的代理服务器;
- OPTIONS:允许客户端查看服务器的性能; TRACE:回显服务器的请求,主要用于测试或者诊断。
6 说一说redis-scrapy中redis的作用?
它是将scrapy框架中Scheduler替换为redis数据库,实现队列管理共享。
优点:
- 可以充分利用多台机器的带宽;
- 可以充分利用多台机器的IP地址。
7 遇到的反爬虫策略以及解决方法?
- 通过headers反爬虫:自定义headers,添加网页中的headers数据。
- 基于用户行为的反爬虫(封IP):可以使用多个代理IP爬取或者将爬取的频率降低。
- 动态网页反爬虫(JS或者Ajax请求数据):动态网页可以使用 selenium + phantomjs 抓取。
- 对部分数据加密处理(数据乱码):找到加密方法进行逆向推理。
8 如果让你来防范网站爬虫,你应该怎么来提高爬取的难度 ?
- 判断headers的User-Agent;
- 检测同一个IP的访问频率;
- 数据通过Ajax获取;
- 爬取行为是对页面的源文件爬取,如果要爬取静态网页的html代码,可以使用jquery去模仿写html。
9 scrapy分为几个组成部分?分别有什么作用?
分为5个部分;Spiders(爬虫类),Scrapy Engine(引擎),Scheduler(调度器),Downloader(下载器),Item Pipeline(处理管道)。
- Spiders:开发者自定义的一个类,用来解析网页并抓取指定url返回的内容。
- Scrapy Engine:控制整个系统的数据处理流程,并进行事务处理的触发。
- Scheduler:接收Engine发出的requests,并将这些requests放入到处理列队中,以便之后engine需要时再提供。
- Download:抓取网页信息提供给engine,进而转发至Spiders。
- Item Pipeline:负责处理Spiders类提取之后的数据。 比如清理HTML数据、验证爬取的数据(检查item包含某些字段)、查重(并丢弃)、将爬取结果保存到数据库中
10 简述一下scrapy的基本流程?
scrapy分为9个步骤:
- Spiders需要初始的start_url或则函数stsrt_requests,会在内部生成Requests给Engine;
- Engine将requests发送给Scheduler;
- Engine从Scheduler那获取requests,交给Download下载;
- 在交给Dowmload过程中会经过Downloader Middlewares(经过process_request函数);
- Dowmloader下载页面后生成一个response,这个response会传给Engine,这个过程中又经过了Downloader Middlerwares(经过process_request函数),在传送中出错的话经过process_exception函数;
- Engine将从Downloader那传送过来的response发送给Spiders处理,这个过程经过Spiders Middlerwares(经过process_spider_input函数);
- Spiders处理这个response,返回Requests或者Item两个类型,传给Engine,这个过程又经过Spiders Middlewares(经过porcess_spider_output函数);
- Engine接收返回的信息,如果使Item,将它传给Items Pipeline中;如果是Requests,将它传给Scheduler,继续爬虫;
- 重复第三步,直至没有任何需要爬取的数据
11 python3.5语言中enumerate的意思是
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 enumerate多用于在for循环中得到计数
12 你是否了解谷歌的无头浏览器?
无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。
Python中selenium模块中的PhantomJS即为无界面浏览器(无头浏览器):是基于QtWebkit的无头浏览器。
13 scrapy和scrapy-redis的区别?
scrapy是一个爬虫通用框架,但不支持分布式,scrapy-redis是为了更方便的实现scrapy分布式爬虫,而提供了一些以redis为基础的组件
为什么会选择redis数据库?
因为redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高
什么是主从同步?
在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),当客户端向从服务器发送SLAVEOF命令,要求从服务器复制主服务器时,从服务器首先需要执行同步操作,也即是,将从服务器的数据库状态更新至主服务器当前所处的数据库状态Python学习扣qun:784758214,这里是python学习者聚集地!!同时,自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理
14 scrapy的优缺点?为什么要选择scrapy框架?
优点:
采取可读性更强的xpath代替正则 强大的统计和log系统 同时在不同的url上爬行 支持shell方式,方便独立调试 写middleware,方便写一些统一的过滤器 通过管道的方式存入数据库
缺点:
基于python爬虫框架,扩展性比较差,基于twisted框架,运行中exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉
15 scrapy和requests的使用情况?
requests 是 polling 方式的,会被网络阻塞,不适合爬取大量数据
scapy 底层是异步框架 twisted ,并发是最大优势
16 描述一下scrapy框架的运行机制?
从start_urls里面获取第一批url发送请求,请求由请求引擎给调度器入请求对列,获取完毕后,调度器将请求对列交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理,如果提取出需要的数据,则交给管道处理,如果提取出url,则继续执行之前的步骤,直到多列里没有请求,程序结束。
17 写爬虫使用多进程好,还是用多线程好?
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多进程或多线程
18 常见的反爬虫和应对方法?
- 基于用户行为,同一个ip段时间多次访问同一页面 利用代理ip,构建ip池
- 请求头里的user-agent 构建user-agent池(操作系统、浏览器不同,模拟不同用户)
- 动态加载(抓到的数据和浏览器显示的不一样),js渲染 模拟ajax请求,返回json形式的数据
- selenium / webdriver 模拟浏览器加载
- 对抓到的数据进行分析
- 加密参数字段 会话跟踪【cookie】 防盗链设置【Referer
19 分布式爬虫主要解决什么问题?
面对海量待抓取网页,只有采用分布式架构,才有可能在较短时间内完成一轮抓取工作。
它的开发效率是比较快而且简单的。
20 如何提高爬取效率?
爬虫下载慢主要原因是阻塞等待发往网站的请求和网站返回
1,采用异步与多线程,扩大电脑的cpu利用率;
2,采用消息队列模式
3,提高带宽
21 说说什么是爬虫协议?
Robots协议(也称为爬虫协议、爬虫规则、机器人协议等)也就是robots.txt,网站通过robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
Robots协议是网站国际互联网界通行的道德规范,其目的是保护网站数据和敏感信息、确保用户个人信息和隐私不被侵犯。因其不是命令,故需要搜索引擎自觉遵守。
22 如果对方网站反爬取,封IP了怎么办?
- 放慢抓取熟速度,减小对目标网站造成的压力,但是这样会减少单位时间内的数据抓取量
- 使用代理IP(免费的可能不稳定,收费的可能不划算)
23 有一个jsonline格式的文件file
def get_lines():
with open('file.txt','rb') as f:
return f.readlines()
if __name__ == '__main__':
for e in get_lines():
process(e) # 处理每一行数据
现在要处理一个大小为10G的文件,但是内存只有4G,如果在只修改get_lines 函数而其他代码保持不变的情况下,应该如何实现?需要考虑的问题都有那些?
def get_lines():
with open('file.txt','rb') as f:
for i in f:
yield i
Pandaaaa906提供的方法