python应用之爬虫实战1 爬虫基本原理
知识内容:
1.爬虫是什么
2.爬虫的基本流程
3.request和response
4.python爬虫工具
参考:http://www.cnblogs.com/linhaifeng/articles/7773496.html
一、爬虫是什么
1.爬虫定义
爬虫:把互联网比作一张大的蜘蛛网,那一台计算机上的数据便是蜘蛛网上的一个猎物,而爬虫程序就是一只小蜘蛛,沿着蜘蛛网抓取自己想要的猎物/数据, 爬虫实质是向网站发起请求,获取资源后分析并提取有用数据的程序
世界上80%的爬虫是基于Python开发的,学好爬虫技能,可为后续的大数据分析、挖掘、机器学习等提供重要的数据源
爬虫是是一种按照一定的规则,自动地抓取web信息(网页信息)的程序或者脚本。为什么程序可以抓取网页的信息呢?这就要从我们如何得到一个网页说起,我们获取网页其实是通过浏览器访问网站获取网页信息,在本质上,是通过浏览器向网页后台的服务器发出请求(请求获取某个网页),网页后台的服务器处理请求,返回相应响应(返回页面的代码,比如说HTML代码和CSS代码),然后由浏览器对返回的这些信息进行解析,进而生成我们所看到的网页。爬虫其实在一定程度上就是模拟了浏览器,向服务器发送请求,获取响应,然后解析这些信息获取想得到的信息
爬虫通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据
2.爬虫分类
- 定向:爬取特定领域的信息
- 非定向:爬取不确定领域的信息,比如百度搜索、谷歌搜索
3.爬虫价值
互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能,你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据
4.爬虫应用领域
爬虫应用比较多的地方:
- 搜索引擎
- 数据分析
- 比价网站
- 门户网站(新闻、资讯)
5.爬虫的本质
模拟浏览器打开网页,获取网页中想要的数据
浏览器打开网页的过程:
当你在浏览器中输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器经过解析后发送给用户浏览器结果,包括html,js,css等文件内容,浏览器解析出来最后呈现给用户在浏览器上看到的结果
所以用户看到的浏览器的结果就是由HTML代码构成的,爬虫就是为了获取这些内容,通过分析和过滤html代码,从中获取我们想要的资源(文本,图片,视频.....)
二、爬虫的基本流程
基本流程:
- 发起请求:使用http库向目标站点发起请求,即发送一个Request(请求头、请求体等)
- 获取响应内容: Response(html,json,图片,视频等)
- 解析内容: 解析html数据\解析json数据\解析二进制数据
- 保存数据: 数据库\文件
三、Request和Response
关于http协议:http://www.cnblogs.com/wyb666/p/9014857.html
1.Request与Response
- Request:请求
- Response:响应
- Request:用户将自己的信息通过浏览器发送给服务器
- Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)
注:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
2.Request
(1)请求方式
- 常用的请求方式:GET,POST
- 其他请求方式:HEAD,PUT,DELETE,OPTHONS
- post与get请求最终都会拼接成这种形式:k1=xxx&k2=yyy&k3=zzz
- post请求的参数放在请求体内:可用浏览器查看,存放于form data内
- get请求的参数直接放在url后
GET示例:
POST中的form data示例:
关于请求方式:
- GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问
- POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有
- HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)
- PUT:向指定资源位置上传其最新内容
- OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作
- DELETE:请求服务器删除Request-URI所标识的资源
(2)请求URL
URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
URL的格式由三个部分组成:
- 第一部分是协议(或称为服务方式)
- 第二部分是存有该资源的主机IP地址(有时也包括端口号)
- 第三部分是主机资源的具体地址,如目录和文件名等
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,它是爬虫获取数据的基本依据
(3)请求头
- User-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户
- cookies:cookie用来保存登录信息
- 一般做爬虫都会加上请求头(部分信息)
(4)请求体
- 如果是get方式,请求体没有内容
- 如果是post方式,请求体是format data
- 登录窗口,文件上传等,信息都会被附加到请求体内
- 登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post
3.Response
(1)响应状态
常见响应状态:200代表成功,301跳转,404找不到页面,502服务器错误
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
常见代码:
- 200 OK 请求成功
- 400 Bad Request 客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
- 403 Forbidden 服务器收到请求,但是拒绝提供服务
- 404 Not Found 请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error 服务器发生不可预期的错误
- 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
- 301 目标永久性转移
- 302 目标暂时性转移
(2)响应头
如内容类型,类型的长度,服务器信息,设置Cookie,如下图
(3)响应体
最主要的部分,包含请求资源的内容,如网页HTMl,图片,二进制数据等
可以爬取到的内容:
- 网页文本:如HTML文档,Json格式化文本等
- 图片:获取到的是二进制文件,保存为图片格式
- 视频:同样是二进制文件
- 其他:只要请求到的,都可以获取
四、python爬虫工具
1.请求库
urllib模块:python内置模块,主要包含urllib.request、urllib.response、urllib.parse和urllib.error三部分
requests库:第三方模块,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。比 urllib 更方便,可节约大量的工作
selenium库:第三方模块,最初是一个自动化测试工具,在爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
2.解析库
re模块:python内置模块, 提供了正则表达式操作所需要的功能,能对HTML进行解析
BeautifulSoup4库:第三方模块,是一个可以从HTML或XML文件中提取数据的Python库
lxml库:第三方模块,lxml是基于xpath语法的python解析库, 是Python中与XML及HTML相关功能中最丰富和最容易使用的库
3.爬虫框架
Scrapy框架:一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫
4.存储工具
- 文本:纯文本,Json,Xml,csv等
- 关系型数据库:如mysql,oracle,sql server等结构化数据库
- 非关系型数据库:MongoDB,Redis等key-value形式存储