1、爬虫概述
1.1、什么是爬虫
网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
通俗的讲,就是一种能够自动获取网页内容并可以按照指定规则提取相应内容的程序。
1.2、爬虫原理
那么网络爬虫是从哪抓取,又是按照怎么样的规则呢? 首先,我们需要了解URL。URL在日常网络中无处不在,如www.baidu.com, www.taobao.com,简单来说,网络地址就是URL。网络爬虫就是从URL进行爬取。即爬虫的内容就是具体地址下的内容,如淘宝下的销售信息。 那么,是如何通过URL进行爬取内容的呢?我们首先了解,按下URL地址后,会发生什么。 1.前端(我们看到的页面)向后端发送请求。 2.后端处理请求,对网页进行渲染,返回渲染的页面。 3.前端展示渲染后的页面。 而渲染的页面实际上是以html的格式返回回来。我们所需要抓取的内容,就是返回的html页面中的内容。 当我们按下f12,就能看到渲染后的html,下面的百度首页返回的html内容, 可以看到,在我们看到的页面的内容,无论是文本或者图片,在html中都有对应。网络爬虫就是从对应的页面(html)中获取我们所需要的数据。
概括下网络爬虫系统的工作流程
Web网络爬虫系统首先将种子URL放入下载队列,然后简单地从队首取出一个URL下载其对应的网页。得到网页的内容将其存储后,再经过解析网页中的链接信息可以得到一些新的URL,将这些URL加入下载队列。然后再取出一个URL,对其对应的网页进行下载,然后再解析,如此反复进行,直到遍历了整个网络或者满足某种条件后才会停止下来。
2、爬虫技术与框架
不同的语言都有自己的爬虫技术与框架,这里我们只介绍Python相关的。
2.1、request+BeautifulSoup
requset库能够帮助我们模拟请求,然后获取响应,我们就能够从响应的html中获取我们想要的数据了。 下面我们使用request库,向百度发送请求,然后获取对应的html。
import requests
rsp = requests.get('http://www.baidu.com/')
rsp.encoding = 'utf-8'
print(rsp.text)
返回的数据如下
<html>
<head>
<meta http-equiv=content-type content=text/html;charset=utf-8>
<meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer>
<link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css>
<title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head>
<div class=head_wrapper>
<div class=s_form> <div class=s_form_wrapper>
<div id=lg>
<img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129>
</div>
<form id=form name=f action=//www.baidu.com/s class=fm>
<input type=hidden name=bdorz_come value=1>
<input type=hidden name=ie value=utf-8>
<input type=hidden name=f value=8>
<input type=hidden name=rsv_bp value=1>
<input type=hidden name=rsv_idx value=1>
<input type=hidden name=tn value=baidu>
<span class="bg s_ipt_wr">
<input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr">
<input type=submit id=su value=百度一下 class="bg s_btn">
</span>
</form>
</div>
</div>
<div id=u1>
<a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a>
<a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a>
<a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a>
<a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a>
<a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a>
<noscript>
<a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a>
</noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a>
</div>
</div>
</div>
<div id=ftCon>
<div id=ftConw>
<p id=lh>
<a href=http://home.baidu.com>关于百度</a>
<a href=http://ir.baidu.com>About Baidu</a>
</p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a>
<a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a> 京ICP证030173号
<img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div>
</body>
</html>
通过rsp.text,我们以字符串的形式获取了html的内容,接下来,我们就能通过操作字符串,来获取对应的数据。比如说获取标题。
import requests
rsp = requests.get('http://www.baidu.com/')
rsp.encoding = 'utf-8'
text = rsp.text
start = text.index("<title>")
end = text.index("</title>")
title = text[start + 7 : end]
print(title)
百度一下,你就知道
这里我们截取了标签中的内容。从而获取到了标题的信息。 这是最简单的爬虫,我们爬取了百度首页的标题信息,但是实际中的html页面会复杂上百倍,如淘宝页面。我们想要从大量的html中获取有用的数据,让我们自己写代码来截取,是十分繁琐的。因此,我们需要利用封装好的库,快速获取我们想要的内容,BeautifulSoup框架就应运而生了。 Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 如下,通过bs我们能够快速获取对应标签中的内容
import requests
from bs4 import BeautifulSoup
rsp = requests.get('http://www.baidu.com/')
rsp.encoding = 'utf-8'
soup = BeautifulSoup(rsp.text,'lxml')
print(soup.title)
结果如下
<title>百度一下,你就知道</title>
这样,我们就快速获取到了title标签和其内容。相关我们自己来处理,要方便很多。
2.2、scrapy
为什么使用scrapy?
1.更全面,更强大的功能。 scrapy不仅集成了数据抓取与处理的功能,另外还包含了监控,日志,自动化测试等功能。 2.异步抓取,更高的效率。 我们使用request爬取数据,都是同步进行的,这样效率是十分低下的,不能够利用现代多核CPU的功能。当然我们也能够自己编写多线程来进行抓取,但是多线程模型较为复杂,用之不当可能会出现死锁等情况,造成整个程序崩溃。
scrapy工作原理
1、Scrapy Engine(引擎): 引擎负责控制数据流在系统的所有组件中流动,并在相应动作发生时触发事件。
2、Scheduler(调度器): 调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
3、Downloader(下载器): 下载器负责获取页面数据并提供给引擎,而后提供给spider。
4、Spider(爬虫): Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。
5、Item Pipeline(管道): Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存储到数据库中)。
6、Downloader Middlewares(下载中间件): 下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。 7、Spider Middlewares(Spider中间件): Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。
scrapy的一个小例子
3、爬虫技术难点
3.1、反爬虫
3.2、数据获取
3.3、数据清洗
4、爬虫学习计划
python,html,http协议,正则表达式,scrapy。
|