网络爬虫技术概述

1、爬虫概述

1.1、什么是爬虫

在这里插入图片描述

网络爬虫,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

网络爬虫的英文即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

1.2、爬虫原理

那么网络爬虫是从哪抓取,又是按照怎么样的规则呢?
首先,我们需要了解URL。URL在日常网络中无处不在,如www.baidu.com, www.taobao.com,简单来说,网络地址就是URL。网络爬虫就是从URL进行爬取。即爬虫的内容就是具体地址下的内容,如淘宝下的销售信息。
那么,是如何通过URL进行爬取内容的呢?我们首先了解,按下URL地址后,会发生什么。
在这里插入图片描述

1.前端(我们看到的页面)向后端发送请求(request)。
2.后端处理请求,对网页进行渲染,返回渲染的页面(response)。
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&amp;tpl=mn&amp;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>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; 
 	<a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp;
 	 <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的功能。当然我们也能够自己编写多线程来进行抓取,但是多线程模型较为复杂,用之不当可能会出现死锁等情况,造成整个程序崩溃。
3.自动生成架构
通过scrapy的命令,能够自动生成的架构,将我们的代码模块化,分层,解耦,从而我们的代码更加优雅。

scrapy工作原理

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的一个小例子

4、爬虫学习计划

python,html,http协议,正则表达式,scrapy。

Q&A

图片和视频如何获取?

大部分的图片和视频,可以从爬取的html中获取,获取下来为一个图片或者视频链接,然后我们通过发送http请求就能直接下载图片或者视频。
爬虫下载图片
在这里插入图片描述
但是部分网站并不能直接看到图片或者视频地址,如百度百科,就需要通过一些特殊的手段进行爬取。

有哪些反爬虫技术?

1.登录时对用户名和密码进行加密。
2.登录时不仅只是用户名和密码。
3.对访问信息进行统计予以封锁。
4.User-Agent反爬和Referer反爬。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值