爬虫
百度百科
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
网络爬虫(又称网络蜘蛛,机器人),就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
只要浏览器能够做的事情,原则上,爬虫都能够做到。
简单来说,爬虫就是自动从网络上收集信息的一种程序,复杂点来说,就是一整套关于数据请求、处理、存储的程序。
原理
发送请求 -> 接收响应 -> 解析网页 (-> 提取链接 -> 发送请求) -> 提取资源 -> 保存资源
发送请求
实质是模拟浏览器发送 http 请求报文的过程,实际中只需要请求服务器需要的部分报文。
请求库
模拟浏览器的请求
requests 爬虫最常用的库
比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)。
urllib
提供了一系列用于操作URL的功能。
请求报文
请求行、请求头、空行、请求体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBm9ugRo-1579768800332)(./assets/request-message.jpg#pic_center)]
一个完整的 http 请求报文
POST http://columbus.os.adc.com/api/coop/requirement/tree/query/prune/page?projectId=100001 HTTP/1.1 Host: columbus.os.adc.com Connection: keep-alive Content-Length: 483 Accept: application/json, text/plain, */* Origin: http://columbus.os.adc.com User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0 Content-Type: application/json;charset=UTF-8;multipart/form-data Referer: http://columbus.os.adc.com/requirement/list?projectId=100001 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: SESSION=1e365567-bbed-4ff8-b033-6ab21dc05bd2; user=W9005349
{"projectId":"100001","title":"","assignUsers":[],"isArchived":-1}
请求行
请求方法 + 空格 +请求URL + 空格 + HTTP协议版本 + 回车 换行
请求头
请求的配置信息,key-value 形式发送给服务器
Accept: 浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip 的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
Content-Length:表示请求消息正文的长度。
Host: 客户机通过这个头告诉服务器,想访问的主机名。Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。
If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间。只有当所请求的内容在指定的时间后又经过修改才返回它,否则返回304“Not Modified”应答。
Referer:客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)。包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:User-Agent头域的内容包含发出请求的用户信息。浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Cookie:客户机通过这个头可以向服务器带数据,这是最重要的请求头信息之一。
Cookie2:用来说明请求端支持的cookie版本。
Range:如果服务器支持范围请求,就请求资源的指定范围。
空行
通过空行告诉服务器请求头部结束。
请求体
根据不同的请求方法包含不同的内容。
get: 空
post: 表单数据
接收响应
获取特定请求返回的响应报文,提取目标数据。
响应报文
响应行、响应头、空行、响应体
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NXRBMhIU-1579768800338)(./assets/response-message.jpg#pic_center)]
一个完整的 http 响应报文
HTTP/1.1 200 Server: nginx/1.12.2 Date: Thu, 23 Jan 2020 02:03:03 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive trace-id: 15-32349ee9-8945-438c-91a6-33ff10c0c0ee-18882 X-Content-Encoding-Over-Network: gzip
77 {"status":200,"msg":null,"data":{"result":[],"pageInfo":{"totalPages":0,"totalRecords":0,"pageNumber":1,"pageSize":5}}} 0
响应行
http协议版本 + 空格 + 状态码 + 空格 + 状态码描述 + 回车 换行
http状态码
100~199:信息,服务器收到请求,需要请求者继续执行操作
200~299:成功,操作被成功接收并处理
300~399:重定向,需要进一步的操作以完成请求
400~499:客户端错误,请求包含语法错误或无法完成请求
500~599:服务器错误,服务器在处理请求的过程中发生错误
响应头
描述服务器和数据的基本信息。
Set-Cookie:设置浏览器 Cookie,以后当浏览器访问符合条件的 URL 时,会自动带上该 Cooike
Refresh:告诉浏览器隔多久刷新一次,以秒计
空行
响应头结束
响应体
网站返回的数据
解析网页
提取网页链接
提取网页资源
解析库
源码中找到并提取数据
Beautiful Soup
Beautiful Soup 是 python 的一个库,其最主要的功能是从网页中抓取数据。
pyquery
据说比beautiful 好用,语法和jquery非常像。
爬虫开源框架
scrapy:是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
nutch: 是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
商业场景
搜索引擎
百度、谷歌搜索就是一个巨大的爬虫程序。
爬取新闻 新闻门户网站的新闻共享
比如说今日头条、一点新闻、腾讯新闻等等。他们的新闻来源,一个当然是从自己的记者这里产生,另一部分呢,就是从其他网站上,爬下来他们的记者写的文章。这样才能够做到新闻的门户级别。一个网站报道了一个新闻,其他的网站马上会给你推送相同的新闻了。这中间就是爬虫在起作用,如果是人去找新闻,不仅速度慢,还可能会重复,而且不能24小时工作。这当然就很不方便了。
为机器学习,大数据做准备
机器学习基于海量的数据样本,比如人脸识别,图像识别,语音识别,只有对大量的样本数据进行分析,才能提升程序的识别准确度。至于大数据分析更是基于海量数据,所以爬虫就是获取数据的一种途径。
个人用途
分析喜欢妹子的朋友圈hh
找工作时爬取招聘网站某工种的所有招聘信息
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试