1.网络爬虫
1.1.引言
我们平时都说Python爬虫,其实这里可能有个误解,爬虫并不是Python独有的,可以做爬虫的语言有很多例如:PHP、JAVA、C#、C++、Python。
为什么Python的爬虫技术会异军突起呢?
Python火并不是因为爬虫技术,而是AI人工智能、数据分析(GoogleAlphaGo)等等功能;这些Java其实也能做,而选择Python做爬虫是因为Python相对来说比较简单,而且功能比较齐全。
1.2.什么是网络爬虫
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。通俗来讲,网络爬虫就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
原则上,只要是浏览器(客户端)能做的事情,爬虫都能够做。
1.3.为什么要学习网络爬虫
互联网大数据时代,给予我们的是生活的便利以及海量数据爆炸式的出现在网络中。过去,我们通过书籍、报纸、电视、广播或许信息,这些信息数量有限,且是经过一定的筛选,信息相对而言比较有效,但是缺点则是信息面太过于狭窄了。不对称的信息传导,以致于我们视野受限,无法了解到更多的信息和知识。 互联网大数据时代,我们突然间,信息获取自由了,我们得到了海量的信息,但是大多数都是无效的垃圾信息。 例如新浪微博,一天产生数亿条的状态更新,而在百度搜索引擎中,随意搜一条就有成千上百万条信息。 在如此海量的信息碎片中,我们如何获取对自己有用的信息呢? 答案是筛选! 通过某项技术将相关的内容收集起来,在分析删选才能得到我们真正需要的信息。 这个信息收集分析整合的工作,可应用的范畴非常的广泛,无论是生活服务、出行旅行、金融投资、各类制造业的产品市场需求等等……都能够借助这个技术获取更精准有效的信息加以利用。 网络爬虫技术,虽说有个诡异的名字,让能第一反应是那种软软的蠕动的生物,但它却是一个可以在虚拟世界里,无往不前的利器。
浏览网站时所能看见的数据都可以通过爬虫程序保存下来,例如:文字、图片、音频和视频。
1.4.应用场景
-
数据展示:将爬取的数据展示到网页或者APP上,比如:百度新闻、今日头条
-
数据分析:从数据中寻找一些规律,比如:慢慢买(价格对比)、TIOBE排行等
-
自动化测试:比如想要测试一个前端页面的兼容性、前端页面UI是否有bug,只需要模拟执行表单提交、键盘输入等页面操作
1.5.网络爬虫是否合法
爬虫作为一种计算机技术就决定了它的中立性,因此爬虫本身在法律上并不被禁止,但是利用爬虫技术获取数据这一行为是具有违法甚至是犯罪的风险的。所谓具体问题具体分析,正如水果刀本身在法律上并不被禁止使用,但是用来捅人,就不被法律所容忍了。
1.5.1.爬虫技术与反爬虫技术
爬虫目前能造成的技术上影响在于野蛮爬取,即多线程爬取
,从而导致网站瘫痪
或不能访问,这也是大多数网络攻击所使用的方法之一。
由于爬虫会批量访问网站,因此许多网站会采取反爬措施。例如:1.IP频率、流量限制;2.请求时间窗口过滤统计;3.识别爬虫等。
但这些手段都无法阻止爬虫开发人员优化代码、使用多IP池等方式规避反爬措施,实现大批量的数据抓取。由于网络爬虫会根据特定的条件访问页面,因而爬虫的使用将占用被访问网站的网络带宽并增加网络服务器的处理开销,甚至无法正常提供服务。
1.5.2.Robots协议
robots(也称为爬虫协议、机器人协议等)称是“网络爬虫排除标准”是网站跟爬虫间的一种协议(国际互联网界通行的道德规范),用简单直接的txt格式文本方式告诉对应的爬虫被允许的权限,也就是说robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。
参考地址:https://www.zhihu.com/robots.txt
-
以Allow开头的URL地址:允许某爬虫引擎访问
-
以Disallow开头的URL地址:不允许某爬虫引擎访问
总之,盗亦有道,君子之约。
1.6.网络爬虫步骤及相关技术
2.抓包
-
浏览器抓包(仅能抓取浏览器的数据包)
-
抓包工具fiddler(基本用于抓取HTTP)
3.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 是如何解决上面的三个风险的?
混合加密的方式实现信息的机密性,解决了窃听的风险。
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完
整性,解决了篡改的风险。
将服务器公钥放入到数字证书中,解决了冒充的风险。
4.快速入门
4.1.安装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)
按钮即可。
4.2.案例演示
创建纯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动态加载的数据
-
案例三:爬取豆瓣电影TOP250,并分页保存文件中
豆瓣TOP250地址:豆瓣电影 Top 250
import time
from pathlib import Path
import requests
url ='https://movie.douban.com/top25'
start=0
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}
params = {
'start':start
}
for i in range(3):
resp=requests.get(url,headers=headers,params=headers)
start+=25
resp.encoding="utf-8"
with open(f"top{start}.html","w",encoding='utf-8') as fp:
fp.write(resp.text)
print(f"正在爬取中,目前第{i+1}页")
time.sleep(2)