一文带你了解Python爬虫(一)——基本原理介绍
一、“大数据时代”,数据获取的方式:
1. 企业生产的用户数据: 大型互联网公司有海量用户,所以他们积累数据有天然的优势。有数据意识的中小型企业,也开始积累的数据。 2. 数据管理咨询公司: 通常这样的公司有很庞大的数据采集团队,一般会通过市场调研、问卷调查、固定的样本检测, 和各行各业的公司进行合作、专家对话(数据积累很多年了,最后得出科研结果)来采集数据。 3. 政府/机构提供的公开数据: 政府通过各地政府统计上报的数据进行合并;机构都是权威的第三方网站。 4. 第三方数据平台购买数据: 通过各个数据交易平台来购买各行各业需要的数据,根据获取难度不同,价格也会不同。 5. 爬虫爬取数据: 如果市场上没有我们需要的数据,或者价格太高不愿意买, 那么就可以招/做一个爬虫工程师,从互联网上定向采集数据。
二、什么是爬虫?
爬虫:就是抓取网页数据的程序。
- 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。 如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。 网络爬虫就是一个爬行程序,一个抓取网页的程序。 网络爬虫的基本操作是抓取网页
- 浏览网页的过程 抓取网页的过程其实和读者平时使用IE浏览器浏览网页的道理是一样的。 比如说你在浏览器的地址栏中输入 www.baidu.com 这个地址。 打开网页的过程其实就是浏览器作为一个浏览的“客户端”, 向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。 HTML 是一种标记语言,用标签标记内容并加以解析和区分。 浏览器的功能是将获取到的 HTML 代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。
三、为什么要学习爬虫?
大数据时代,要进行数据分析,首先要有数据源,
学习爬虫,可以让我们获取更多的数据源
,并且这些数据源可以按我们的目的进行采集,去掉很多无关数据。
在进行大数据分析或者进行数据挖掘的时候,数据源可以从某些提供数据统计的网站获得,也可以从某些文献或内部资料中获得,但是这些获得数据的方式,有时很难满足我们对数据的需求,而手动从互联网中去寻找这些数据,又耗费的经理过大,此时就可以利用爬虫技术,自动地从互联网中获取我们感兴趣的数据内容,并将这些数据内容爬取回来,作为我们的数据源,从而进行更生层次的数据分析,获得更多有价值的信息。 爬虫的出现,可以一定程度上代替手工访问网页,所以,原先我们需要人工取访问互联网信息的操作,现在都可以用爬虫自动化实现,这样可以更高效率地利用好互联网中的有效信息。
四、爬虫分类
1.通用网络爬虫:
- 又称为全网爬虫,爬取的目标资源在全互联网中,长应用于大型搜索引擎中。
2.聚焦网络爬虫:
- 又称为主题爬虫,按照预先定义好的主题有选择地进行网页爬取的一种爬虫,主要应用再对特定信息的抓取中。
3.增量式网络爬虫:
- 在抓取网页的时候,只爬取内容发生变化的网页或者新产生的网页,
- 对于未发生内容变化的网页,则不会抓取。保证抓取的页面为新的页面。
4.深层网路爬虫:
- 可以爬去互联网中的深层页面,深层页面指的是隐藏在表单后面,
- 不能通过静态链接直接获取,是需要提交一定的关键词之后才能够得到的页面。
五、爬虫怎么抓取网页数据:
1.网页三大特征:
- 网页都有自己唯一的URL(统一资源定位符)来进行定位
- 网页都使用HTML (超文本标记语言)来描述页面信息。
- 网页都使用HTTP/HTTPS(超文本传输协议)协议来传输HTML数据。
2.爬虫的设计思路:
- 首先确定需要爬取的网页URL地址。
- 通过HTTP/HTTP协议来获取对应的HTML页面。
- 提取HTML页面里有用的数据:
- 如果是需要的数据,就保存起来。
- 如果是页面里的其他URL,那就继续执行第二步。
六、为什么选择Python做爬虫?
可以做爬虫的语言有很多,如 PHP、Java、C/C++、Python等等…
– PHP 虽然是世界上最好的语言,但是他天生不是干这个的,而且对多线程、异步支持不够好,并发处理能力很弱。 爬虫是工具性程序,对速度和效率要求比较高。
– Java 的网络爬虫生态圈也很完善,是Python爬虫最大的对手。但是Java语言本身很笨重,代码量很大。 重构成本比较高,任何修改都会导致代码的大量变动。爬虫经常需要修改部分采集代码。
- -C/C++ 运行效率和性能几乎最强,但是学习成本很高,代码成型比较慢。 能用C/C++做爬虫,只能说是能力的表现,但是不是正确的选择。
– Python 语法优美、代码简洁、开发效率高、支持的模块多,相关的HTTP请求模块和HTML解析模块非常丰富。 还有强大的爬虫Scrapy,以及成熟高效的 scrapy-redis分布式策略。 而且,调用其他接口也非常方便(胶水语言)
七、爬虫 - 反爬虫 - 反反爬虫
1.爬虫 - 反爬虫 - 反反爬虫 之间的斗争
其实爬虫做到最后,最头疼的不是复杂的页面,也不是晦涩的数据,而是网站另一边的反爬虫人员。 User-Agent、代理、验证码、动态数据加载、加密数据。 数据价值,是否值的去费劲做反爬虫。
大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走。 然而,如果反爬机制过于严格,可能会误伤到真正的用户请求; 如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本。
简单低级的爬虫速度快,伪装度低, 如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。
而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。 所以,网站反爬的重点也是那种简单粗暴的爬虫,反爬机制也会允许伪装度高的爬虫,获得数据。 毕竟伪装度很高的爬虫与真实用户也就没有太大差别了。 -爬虫和反爬虫之间的斗争,最后一定是爬虫获胜! 为什么?只要是真实用户可以浏览的网页数据,爬虫就一定能爬下来!
2.大多数反爬机制检查的信息
- a. header检验: 最简单的反爬机制,就是检查HTTP请求的Headers信息,包括User-Agent, Referer、Cookies等。 User-Agent是检查用户所用客户端的种类和版本. User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信 息的标识
- b. Referer: Referer是检查此请求由哪里来,通常可以做图片的盗链判断。
- c. Cookies:
- Cookie,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的。 那么我们可以利用 Urllib 库保存我们登录的 Cookie,然后再抓取其他页面就达到目的了。 网站可能会检测Cookie中session_id的使用次数,如果超过限制,就触发反爬策略
- cookie工作方式: 服务器给每个Session都分配一个唯一的JSESSIONID, 并通过Cookie发送至客户端。 当客户端发起新的请求的时候,将Cookie头中携带JSESSIONID 服务器能够找到这个客户端对应的Session
- d.代理: 如果某一IP的请求速度过快,就触发反爬机制。 当然可以通过放慢爬取速度绕过,这要以爬取时间大大增长为代价。另一种方法就是添加 代理。
八、根据使用场景:分为 通用爬虫 聚焦爬虫
1.通用爬虫:搜索引擎用的爬虫系统。 目标:就是尽可能把互联网上所有的网页下载下来, 放到本地服务器里形成备份, 再对这些网页做相关处理(提取关键字、去掉广告), 最后提供一个用户检索接口。
2抓取流程: a) 首选选取一部分已有的URL,把这些URL放到待爬取队列。 b) 从队列里取出这些URL,然后解析DNS得到主机IP,然后去这个IP对应的服务器里下载HTML页面,保存到搜索引擎的本地服务器。 之后把这个爬过的URL放入已爬取队列。 c) 分析这些网页内容,找出网页里其他的URL连接,继续执行第二步,直到爬取条件结束。
3 搜索引擎如何获取一个新网站的URL: 1. 主动向搜索引擎提交网址:http://zhanzhang.baidu.com/linksubmit/url 2. 在其他网站里设置网站的外链。 3. 搜索引擎会和DNS服务商进行合作,可以快速收录新的网站。 DNS:就是把域名解析成IP的一种技术。 4 通用爬虫并不是万物皆可爬,它也需要遵守规则: Robots协议:协议会指明通用爬虫可以爬取网页的权限。 Robots.txt 只是一个建议。并不是所有爬虫都遵守,一般只有大型的搜索引擎爬虫才会遵守。 咱们个人写的爬虫,就不管了。 5 通用爬虫工作流程: 爬取网页 - 存储数据 - 内容处理 - 提供检索/排名服务
6 通用爬虫的缺点:
- 只能提供和文本相关的内容(HTML、Word、PDF)等等, 但是不能提供多媒体文件(音乐、图片、视频)和二进制文件(程序、脚本)等等。
- 提供的结果千篇一律,不能针对不同背景领域的人提供不同的搜索结果。
- 不能理解人类语义上的检索。 为了解决这个问题,聚焦爬虫出现了: 聚焦爬虫: 爬虫程序员写的针对某种内容的爬虫。 面向主题爬虫,面向需求爬虫:会针对某种特定的内容去爬取信息,而且会保证信息和需求尽可能相关。 -做爬虫最需要关注的不是页面信息,而是页面信息的数据来源。
- Laravel-博客实战+踩坑laravel-blog最终的效果踩的坑
- React项目配置3(如何管理项目API接口)
- React第三方组件3(状态管理之Flux的使用④TodoList下)
- React第三方组件3(状态管理之Flux的使用③TodoList中)
- Vue实现百度下拉提示搜索一、前期准备二、代码实现三、实现效果
- React第三方组件3(状态管理之Flux的使用②TodoList上)
- ggplot2玫瑰图案例——星巴克门店分布图
- React第三方组件3(状态管理之Flux的使用①简单使用)
- 用ggplot2画了一个我也叫不上名的炫酷图表
- React技巧8(不再手动绑定this,跟.bind(this)说88)
- 美美的商务范儿——ggplot2蝴蝶图
- 机器学习(三)使用Python和R语言从头开始理解和编写神经网络介绍目录神经网络背后的直观知识多层感知器及其基础知识什么是激活函数?前向传播,反向传播和训练次数(epochs)多层感知器全批量梯度下降
- React第三方组件2(状态管理之Refast的使用⑤LogicRender使用)
- 左右用R右手Python9——字符串合并与拆分
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- mybatis动态sql之foreach补充(三)
- mybatis动态sql之使用foreach进行批量插入的两种方式
- Shiro异常java.lang.IllegalArgumentException: Odd number of characters解决方案
- Greenplum快速上手
- mybatis文件映射之利用association进行关联查询之分步查询(三)
- 操作系统实验之多线程操作之读者优先与写者优先第二版
- Transformers Assemble(PART II)
- 剑指offer(04-06)题解
- 剑指offer(10-12)题解
- mybatis动态sql之bind标签
- mybatis映射文件之基本的增删改查
- mybatis动态sql之利用sql标签抽取可重用的sql片段
- springmvc之配置拦截器拦截相应的请求
- 剑指offer(31-40)题解
- mybatis缓存之二级缓存