爬虫是什么?
如果我们把互联网比作一张大的蜘蛛网,数据便是存放于蜘蛛网的各个节点,而爬虫就是一只小蜘蛛,
沿着网络抓取自己的猎物(数据)爬虫指的是:向网站发起请求,获取资源后分析并提取有用数据的程序;
从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频) 爬到本地,进而提取自己需要的数据,存放起来使用;
爬虫概述
简单来说,爬虫就是获取网页并提取和保存信息的自动化程序
1 获取网页
获取网页的源代码,提取想要的信息,Python 提供了许多库来帮助我们实现这个操作,如 urllib, requests等
2 提取信息
使用css 选择器或 XPath, re(正则)提取网页信息的库,如 Beautiful Soup pyquery lxml等,使用这些库,可以高效快速地从中提取网页信息,如节点的属性 文本值等, 提取信息是爬虫非常重要的部分,它可以使杂乱的数据变得条理清晰 ,以便我们后续处理和分析数据
3 保存数据
这里保存形式有多种多样,如可以简单保存为 txt 文本或 JSON 文本,也可以保存到数据库,如 MySQL, MongoDB, REDIS,也可保存至远程服务器.
4 自动化程序
爬虫就是代替我们来成这份爬取工作的自动化程序,它可以在抓取过程中进行各种异常处理、错误重试等操作 ,确保爬取持续高效地运行
爬虫能抓怎样的数据?
各种二进制数据,如图片 、视频和音频等 利用爬虫,我们可以将这些二进制数据抓取下来,然后保存成对应的文件名,上述内容其实都对应各自的 URL 是基于 HTTP或HTTPS协议的,只要是这种数据,爬虫都可以抓取。
基于JavaScript 渲染的页面怎么抓取?
在用urllib或requests抓取网页时,得到的源代码实际和浏览器中看到的不一样,现在网页越来越多地采用 Ajax 、前端模块化工具来构建,整个网页可能都是由 JavaScript 渲染出来的,也就是说原始的 HTML 代码就是一个空壳。
js怎么实现的渲染?
首先加载html内容,接着浏览器会发现其中引人了一个app.js 文件,然后便会去请求这个文件,获取到该文件后,执行其中的 JavaScript 代码,而JavaScript则会改变HTML中的节点,向其添加内容,最后得到完整的页面.
在用urllib, requests等库请求当前页面时,得到的只是这个 HTML代码,它不会去加载这个 JavaScript 文件,这样也就看不到浏览器中的内容了。
对于这样的情况,可以分析其后台 Ajax 接口,也可使用 Selenium,Splash 这样的库来实现模拟 JavaScript 渲染,继而抓取数据
会话和Cookies
在访问网站的时候,经常遇到需要登录的情况,有些页面只有登录之后才可以访问 ,而且登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录,还有一些网站,在打开浏览器时就向动登录了,而且很长时间都不会失效,这种情况又是为什么?其实这里面涉及会话Session和 Cookies 的相关知识
无状态 HTTP
HTTP的无状态是指 HTTP 协议对事务处理是没有记忆能力的,也就是说服务器不知道客户端是什么状态。向服务器发送请求,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录,如果后续需要处理之前的信息,那么就必须重传,太浪费资源.
这时两个用于保持 HTTP连接状态的技术就出现了,分别是Session和 Cookies 会话在服务端,也就是网站的服务器,用来保存用户的会话信息; Cookies 在客户端,也可以理解为浏览器端,有了Cookies ,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别 Cookies 并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应,可以理解为 Cookies 里面保存了登录的凭证,有了它,只需要在下次请求携带 Cookies 发送请求而不必重新输入用户名、密码等信息重新登录了.
在爬虫中,有时候处理需要登录才能访问的页面时,一般会直接将登录成功后获取的Cookies 放在请求头里面直接请求,而不必重新模拟登录
会话
在 Web 中,会话对象用来存储特定用户会话所需的属性及配置信息, 这样,当用户在应用程序的Web 页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去当用户请求来自应用程序的 Web页时如果该用户还没有会话, 则Web服务器将自动创建一个会话对象,当会话过期或被放弃后,服务器将终 该会话
Cookies
Cookies 指某些网站为了辨别用户身份,进行会话跟踪而存储在用户本地终端上的数据.
在成功登录某个网站时,服务器会告诉客户端设置哪些Cookies 信息,在后续访问页面时客户端会把 Cookies 发送给服务器,服务器再找到对应的会话加以判断. 如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了。
反之,如果传给服务器的 Cookies 是无效的,或者会话已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录.
Cookies 和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登陆会话控制
属性结构:
看看Cookies都有哪些内容,以知乎为例:
Name:该Cookie的名称,一旦创建,该名称便不可更改
Value:该Cookie 的值 ,如果值为 Unicode 字符,需要为字符编码 . 如果值为二进制数据,则需要使用 BASE64 编码
Domain:可以访问该Cookie的域名, 例如,如果设置为 zhihu.com ,则所有以 zhihu .com 结尾的域名都可以访问Cookie.
Max Age: 该Cookie 失效的时间, 单位为秒,也常和 Expires 一起使用,通过它可以计算出其有效时间。Max Age如果为正数 ,则该Cookie在Max Age 秒之后失效。如果为负数,则关闭浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie。
Path:该Cookie的使用路径。如果设置为/path/ ,则只有路径为/path/ 的页面可以访问该Cookie。如果设置为/,则本域名下的所有页面都可以访问该 Cookie。
Size: 此Cookie的大小
HTTP: Cookie的httponly属性。若此属性为 true ,则只有在 HTTP 头中会带有此Cookie 的信息,而不能通过 document.cookie 来访问此 Cookie。
Secure: 该Cookie 是否仅被使用安全协议传输。安全协议有 HTTPS和SSL 等,在网络上传输数据之前先将数据加密。默认为 false。
会话 Cookie 和持久 Cookie
会话 Cookie 就是把 Cookie 放在浏览器内存里,浏览器在关闭之后该 Cookie即失效; 持久 Cookie则会保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户登录状态。其实严格来说,没有会话 Cookie 和持久 Cookie之分,只是由Cookie的Max Age或Expires 字段决定了过期的时间。因此 一些持久化登录的网站其实就是把 Cookie 的有效时间和会话有效期设置得比较长, 下次再访问页面时仍然携带之前的 Cookie ,就可以直接保持登录状态。
代理的基本原理
做爬虫的过程巾经常会遇到这样的情况 最初爬虫正常运行,正常抓取数据,然而过一会可能会出现错误,比如 403 Forbidden,打开网页一看 ,可能会看到“您的 IP 访问频率太高”这样的提示。出现这种现象是因为网站采取了一些反爬虫策略,服务器会检测某个ip在单位时间内的请求次数,如果超过设定值,就会拒绝访问,也叫封ip。使用代理可以实现IP伪装。
基本原理
代理实际上指的就是代理服务器,英文叫作 proxy server,是网络信息的中转站, 如果设置了代理服务器,实际上就是在本机和服务器之间搭建了一个桥, 此时本机不是直接向Web 服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给 Web服务器,接着由代理服务器再把 Web服务器返回的响应转发给木机。这样同样可以正常访问网页,但这个过程中 Web服务器识别出的真实 IP 就不再是本机的 IP 了,就成功实现了 IP伪装,这就是代理的基本原理。
代理的作用
代理有什么作用?举例说明:
突破自身 IP 访问限制,访问一些平时不能访问的站点。
访问一些单位或团体内部资惊 :比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类 FTP 下载上传,以及各类资料查询共享等服务。
提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度
隐藏丘实 IP: 上网者也可以通过这种方法隐藏自己的IP, 免受攻击, 对于爬虫来说,我们用代理就是为了隐藏自身 IP ,防止 向身的 IP被封。
爬虫代理
对于爬虫来说,由于爬虫爬取速度过快,在爬取过程中可能遇到同一个 IP 访问过于频繁的问题,此时网站就会让我们输入验证码登录或者直接封锁IP ,这样会给爬取带来极大的不便。使用代理隐藏真实的 IP ,让服务器误以为是代理服务器在请求自己。这样在爬取过程中通过不断更换代理,就不会被封锁,可以达到很好的爬取效果。
代理分类
代理分类时,既可以根据协议区分,也可以根据其匿名程度区分
1 根据协议区分
根据代理的协议,代理可以分为如下类别:
FTP 代理服务器: 主要用于访问 FTP 服务器, 一般有上传 下载以及缓存功能,端口一般为21, 2121等。
HTTP 代理服务器: 主要用于访问网页,一般有内容过滤和缓存功能,端口 般为 80,8080,3128等。
SSL/TLS 代理: 主要用于访问加密网站,一般有 SSL或TLS 加密功能(最高支持 128 位加密强度),端口一般为 443。
RTSP 代理: 主要用于访问 Real 流媒体服务器,一般有缓存功能,端口 般为 554。
Telnet 代理: 主要用于 telnet 远程控制(黑客人侵计算机时常用于隐藏身份),端口一般为 23。
POP3/SMTP 代理: 主要用于 POP3/SMTP 方式收发邮件,一般有缓存功能,端口一般为 110, 25。
SOCKS 代理: 只是单纯传递数据包,不关心具体协议和用法,所以速度快很,一般有缓存功能,端口一般为 1080。 SOCKS 代理协议又分为 SOCKS4和SOCKS5 ,前者只支持 TCP,而后者支持 TCP和UDP ,还支持各种身份验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4不一定能做到。
2 根据匿名程度区分
高度匿名代理: 会将数据包原封不动地转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
普通匿名代理: 会在数据包上做一些改动,服务端上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实IP。代理服务器通常会加入的HTTP头有 HTTP_VIA和HTTP_X_FORWARDED_FOR。
透明代理: 不但改动了数据包 还会告诉服务器客户端的真实 IP。这种代理除了能用缓存技术提高浏览速度,能用内容过滤提高安全性之外,并无其他显著作用,最常见的例子是内网中的硬件防火墙。
间谍代理: 指组织或个人创建的用于记录用户传输的数据,然后进行研究, 监控等目的的代理服务器。
常见代理设置
使用网上的免费代理: 最好使用高匿代理,另外可用的代理不多,需要在使用前筛选一下可用代理,也可以进一步维护一个代理池。
使用付费代理服务: 互联网上存在许多代理商,可以付费使用, 质量比免费代理好很多。
ADSL 拨号 :拨一次号换一次IP,稳定性高,也是一种比较有效的解决方案。