网络爬虫
引言
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP、JAVA、C#、C++、Python。
什么是网络爬虫
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。通俗来讲,网络爬虫就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
爬虫技术与反爬虫技术
爬虫目前能造成的技术上影响在于野蛮爬取,即多线程爬取
,从而导致网站瘫痪
或不能访问,这也是大多数网络攻击所使用的方法之一。
由于爬虫会批量访问网站,因此许多网站会采取反爬措施。例如:1.IP频率、流量限制;2.请求时间窗口过滤统计;3.识别爬虫等。
但这些手段都无法阻止爬虫开发人员优化代码、使用多IP池等方式规避反爬措施,实现大批量的数据抓取。由于网络爬虫会根据特定的条件访问页面,因而爬虫的使用将占用被访问网站的网络带宽并增加网络服务器的处理开销,甚至无法正常提供服务。
Robots协议
robots(也称为爬虫协议、机器人协议等)称是“网络爬虫排除标准”是网站跟爬虫间的一种协议(国际互联网界通行的道德规范),用简单直接的txt格式文本方式告诉对应的爬虫被允许的权限,也就是说robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。
参考地址:https://www.zhihu.com/robots.txt
-
以Allow开头的URL地址:允许某爬虫引擎访问
-
以Disallow开头的URL地址:不允许某爬虫引擎访问
总之,盗亦有道,君子之约。
网络爬虫步骤及相关技术
抓包
-
浏览器抓包(仅能抓取浏览器的数据包)
-
抓包工具fiddler(基本用于抓取HTTP)
cookie与session的区别与连系?
User-Agent: 浏览器信息
HTTP与HTTPS
-
HTTP 与 HTTPS 有哪些区别?
(1)HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
(2)HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
(3) HTTP 的端口号是 80,HTTPS 的端口号是 443。
(4)HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。
-
HTTPS 解决了 HTTP 的哪些问题?
HTTP 由于是明文传输,所以安全上存在以下三个风险:
窃听风险,比如通信链路上可以获取通信内容,用户号容易没。
篡改风险,比如强制植入垃圾广告,视觉污染,用户眼容易瞎。
冒充风险,比如冒充淘宝网站,用户钱容易没。
HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了上述的风险:
信息加密:交互信息无法被窃取,但你的号会因为「自身忘记」账号而没。
校验机制:无法篡改通信内容,篡改了就不能正常显示,但百度「竞价排名」依然可以搜索垃圾
广告。
身份证书:证明淘宝是真的淘宝网,但你的钱还是会因为「剁手」而没。
可见,只要自身不做「恶」,SSL/TLS 协议是能保证通信是安全的。
-
HTTPS 是如何解决上面的三个风险的?
混合加密的方式实现信息的机密性,解决了窃听的风险。
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完
整性,解决了篡改的风险。
将服务器公钥放入到数字证书中,解决了冒充的风险。
快速入门
安装requests
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装和卸载的功能,现在大家用到的所有包不是自带的就是通过pip安装的。Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具。
-
显示版本和路径
pip --version
-
安装指定版本的requests
pip install requests # 最新版本 pip install requests==2.11.0 # 指定版本 pip install requests>=2.11.0 # 最小版本
由于所有请求都需要经过fiddler这个抓包软件进出。所以如果requests与fiddler一起使用,请不要使用requests最新版本,不然直接会卡死,降版本使用即可。
也可以直接通过PyCharm来安装requests模块,点击File -> Settings -> 项目: python10
,选择Python解释器,点击 +
号,输入选择requests模块并指定安装版本号(例如:2.11.0),最后点击 安装包(I)
按钮即可。
案例演示
创建纯python项目,新建demo.py并导入requests模块
# 导入模块 import requests # 通过requests模块模拟发送get请求,并得到响应对象response resp = requests.get(url)
response响应对象属性介绍:
属性 | 说明 |
---|---|
encoding | 文本编码。例如:resp.encoding="utf-8" |
status_code | 响应状态码。 200 -- 请求成功 4XX -- 客户端错误 5XX -- 服务端响应错误 |
text | 响应体。 |
content | 字节方式响应体,会自动解码gzip和deflate编码的响应数据 |
url | 响应的URL地址。 |
-
案例一:快速入门,爬取百度官网并保存到本地
请结合fiddler抓包工具进行以下代码测试。
resp = requests.get("http://www.baidu.com/")
定制请求头headers,请结合知乎网的Robots协议进行设置。伪装User-Agent
resp = requests.get("http://www.zhihu.com/signin?next=%2F", headers={ "User-agent": "bingbot" })
定制请求头headers,模拟使用浏览器的User-Agent值。
resp = requests.get("http://www.baidu.com/", headers={ "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" })
保存文件的方式可使用pathlib和open等两种方式。
-
案例二:传递URL参数
POST和GET请求方式在传递URL参数时,稍有不同。
GET方式 | POST方式 |
---|---|
params={"key1":"value1","key2":"value2"} | data={"key1":"value1","key2":"value2"} |
response=requests.get(url,params=params) | response=requests.post(url,data=data) |
爬取必应搜索“中国”之后的网页,保存为“中国.html”
resp = requests.get("https://cn.bing.com/search", headers={ "User-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" }, params={ "q":"中国" })
requests缺点:不能爬取ajax动态加载的数据