0.前言
相关实战文章: 正则表达式、BeautifulSoup、Xpath、CSS选择器分别抓取京东网的商品信息。
网络爬虫:模拟客户端批量发送网络请求,批量接收请求对应的数据,按照一定的规则,自动抓取互联网信息的程序,进行数据采集,并进行持久化存储。其他用途:百度搜索, 12306抢票、各种抢购、投票、刷票、短信轰炸、网络攻击、Web漏洞扫描器 都是爬虫技术。
爬虫的用途
1.金融 金融新闻/数据 制定投资策略,进行量化交易
2.旅游 各类信息 优化出行策略
3.电商 商品信息 比价系统
4.游戏 游戏论坛 调整游戏运营
5.银行 个人交易信息 征信系统/贷款评级
6.招聘 职位信息 岗位信息
7.舆情 各大论坛 社会群体感知,舆论导向
只要是客户端(浏览器)能做的的事情,原则上,爬虫都能做。意思就是,只要人类能够访问的网页,能够看到的数据,爬虫在具备铜等资源的情况下就一定可以抓取。
爬取用户看不到的数据叫做黑客,是违法的,
爬虫的作用:可以爬取数据进行数据分析,往大的说可以私人订制搜索引擎。 更好地进行搜索引擎优化。
通用爬虫: 搜索引擎用的爬虫系统,搜索引擎和web服务商提供的爬虫。 目的是 尽可能的;把互联网上的所有的网页下载下来,放到本地服务器里形成备分,在对这些网页做相关处理(提取关键字、去掉广告),最后提供一个用户检索接口。
流程:
首先选取一部分URL,把这些URL放到待爬取队列。
从队列取出URL,然后解析DNS得到主机IP,然后保存这个IP对应的服务器里下载HTML页面,保存到搜索引擎的本级服务器,之后把这个爬过的url放入已爬过的队列。
分析这些网页内容,找出网页里其他的URL链接,继续执行第二步,知道爬取结束
搜索引擎如何获取一个新网站的URL:
a)主动向搜索引擎提交网站
B)在其他网站里设置外联
C)索引擎会和DNS服务商服务商进行合作,可以快速收录新的网站
DNS把域名解析成IP的一种技术。
通用爬虫并不是万物皆可爬取,他也要遵循规则:
Robots协议:协议会指明通用爬虫可以爬取网页的权限(告诉搜索引擎那些可以抓取,那些不可以抓取)
Robots.txt 并不是所有的爬虫都遵守,一般只有大型的搜索引擎爬虫才会遵守
存在位置:robots.txt文件应该放置在网站根目录下
例如:https://www.taobao.com/robots.txt
通用爬虫工作流程:
爬取网页 存储数据 内容处理 提供检索/排名服务
搜索引擎排名:
1.PageRank值:根据网站的流量(点击量/浏览量/人气)统计,流量越高,网站排名越靠前。
2.竞价排名:谁给的钱多,谁排名就高。
通用爬虫的缺点:
1.只能提供和文本相关的内容(HTML、Word、PDF)等等,但是不能提供多媒体文件(音乐、图片、视频)和二进制文件(程序、脚本)
2.提供的结果千篇一律,不等针对不同背景领域的人提供不同的搜索结果
3.不能提供人类语义上的检索
通用搜索引擎的局限性
1.通用搜索引擎所返回的网页里90%的内容无用。
2.中文搜索引擎自然语言检索理解困难
3.信息占有量和覆盖率存在局限。
4.搜索引擎最主要的还是以关键字搜索为主,对于图片、数据库、音频、视频多媒体的内容通用搜索引擎无能为力。
5.搜索引擎的社区化和个性化不好,大多数搜索引擎没有考虑人的地域,性别,年龄的差别
6.搜索引擎抓取动态网页效果不好
解决通用爬虫的缺点,聚焦爬虫出现了。
聚焦爬虫
聚焦爬虫:爬虫程序员写的针对某种内容爬虫。
面向主题爬虫、面向需求爬虫:会针对某种特定的能容去爬取信息,而且保证内容需求尽可能相关。
1.积累式爬虫:从开始到结束,不断爬取,过程中会进行重复操作。
2.增量式爬虫:已下载网页采取增量式更新和只爬取新产生的或者已经发生变化网页爬虫
3.Deep web爬虫:不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的web页面
0.1数据爬取的基本流程
指定要爬取的url
基于requests模块发起请求获得响应
获取响应对象中的数据
数据解析
进行持久化存储
在持久化存储之前需要进行指定数据解析。因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。
1.正则表达式
特点:为我们提供了抓取数据的快捷方式。虽然该正则表达式更容易适应未来变化,但又存在编写难,难以构造、可读性差、代码繁多的问题。 但是利用正则表达式实现对目标信息的精准收集
同时,网页时常会产生变更,导致网页中会发生一些微小的布局变化时,此时也会使得之前写好的正则表达式无法满足需求,需要重新编写,而且还不太好调试。当需要匹配的内容有很多的时候,使用正则表达式提取目标信息会导致程序运行的速度减慢,需要消耗更多内存。
2.BS4( BeautifulSoup )
特点: 虽然BeautifulSoup在代码的理解上比正则表达式要复杂一些,但是其更加容易构造和理解。
BeautifulSoup是一个非常流行的 Pyhon 模块。该模块可以解析网页,并提供定位内容的便捷接口。通过pip install beautifulsoup4就可以实现该模块的安装了。
第一步是将己下载的 HTML 内容解析为 soup文档。由 于大多数网页都不具备良好的HTML 格式,因此BeautifulSoup需要对实际格式进行确定。BeautifulSoup能够正确解析缺失的引号并闭合标签,此外还会添加<html >和<body>标签使其成为完整的HTML文档。通常使用find() 和find_all()方法来定位我们需要的元素。
3.Xpath
特点:
Lxml: Lxml模块使用 C语言编写,其解析速度比 BeautiflSoup更快,而且其安装过程也更为复杂,
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
使用 lxml 模块的第一步和BeautifulSoup一样,也是将有可能不合法的HTML 解析为 统一格式。 虽然Lxml可以正确解析属性两侧缺失的引号,并闭合标签,不过该模块没有额外添加<html >和<body>标签 。
在线复制Xpath表达式可以很方便的复制Xpath表达式(就是浏览器的开发者工具上找到定位的标签右键复制生成好的xpath表达式)。但是通过该方法得到的Xpath表达式放在程序中一般不能用,而且长的没法看。所以Xpath表达式一般还是要自己亲自上手。
4.CSS
CSS选择器表示选择元素所使用的模式。BeautifulSoup整合了CSS选择器的语法和自身方便使用API。在网络爬虫的开发过程中,对于熟悉CSS选择器语法的人,使用CSS选择器是个非常方便的方法。
选择所有标签: *
选择标签: a
选择所有class="link" 的元素:.link
选择 class="link" 的<a>标签: a.link
选择 id= "home” 的<a>标签: a#home
选择父元素为<a>标签的所有< span>子标签: a > span
选择<a>标签内部的所有<span>标签: a span
选择title属性为” Home ” 的所有<a>标签: a[title=Home]
5.总结
lxml 和正则表达式模块都是C语言编写的,而BeautifulSoup则是纯Python 编写的。
img
lxml在内部实现中,实际上是将CSS选择器转换为等价的Xpath选择器。 css()==>xpath()
如果你的爬虫瓶颈是下载网页,而不是抽取数据的话,那么使用较慢的方法(如BeautifulSoup) 也不成问题。如果只需抓取少量数据,并且想要避免额外依赖的话,那么正则表达式可能更加适合。
通常情况下,lxml(该模块可以实现xpath和css)是抓取数据的最好选择,这是因为该方法既快速又健壮,而正则表达式和BeautifulSoup只在某些特定场景下有用。