python爬虫基础-requests库
通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
注意:浏览器抓取的数据对应的页面是一个完整的页面。
我们日常使用百度进行搜索时,在浏览器输入了指定关键词,之后浏览器就会显示某一张完整的页面数据。
可以理解为浏览器是一个天然的爬虫工具。这个过程可以抽象理解为百度浏览器根据关键词检索指定页面数据之后,将对应的数据显示出来。
模拟浏览器上网是爬取数据的一个重要步骤,只有进行模拟浏览器上网的一个流程,才能将指定数据显示出来。
浏览器抓取数据所对应的页面是一个完整的页面
根据抓取数据对象分为两种选择:
(1)互联网中某一张完整的页面数据进行抓取
(2)互联网中某一张页面的局部数据进行抓取
可以利用浏览器进行爬取,也可以通过编写一段代码程序爬取。
可以抓取互联网上的数据,为我们所用,有了大量的数据,就如同有了一个数据银行一样,下一步做的就是如何将这些爬取的数据产品化、商业化。
(1)爬虫在法律中是不被禁止的
(2)具有违法风险
(3)爬虫一般而言是获取网页展示的信息,即前端信息,若利用爬虫程序+相关黑客技术用来攻击网站后台来获取网站的后台数据,这个行为是法律禁止的。
(4)根据爬虫所带来的后果,可将其分为善意爬虫和恶意爬虫。例如,谷歌、360、百度等浏览器都会有一个爬虫程序,每隔一定时间就会爬取网站信息,爬取到的网站信息将会被用户搜索并显示,提高了浏览量,被爬取的这些网站会很开心,故称为善意爬虫。而例如逢年过节需要回家时,利用爬虫对着12306进行爬虫抢票,对于12306而言会提升网站的用户量,使其网站可能无法承受这些大流量数据,最终可能会导致网站崩溃(例如双十一付尾款),这种爬虫程序可称为恶意爬虫。
(1)爬虫干扰了被访问网站的正常运营,这种爬虫也被定义为恶意爬虫,需要承担相关法律责任。
(2)爬虫抓取了受到法律保护的特定类型的数据或信息,也需要承担相关的法律责任。
(1)时常的优化自己的程序,避免干扰被访问网站的正常运营
(2)在使用、传播爬取到的数据时,审查抓取到的内容,如果发现了涉及到用户隐私、商业机密等敏感内容需要及时停止这类数据的爬取或传播
爬虫开发者的道德自持以及企业经营者的良知,才是避免我们触碰法律底线的根本所在(技术本身是无罪的。趋利避害)。
它是搜索引擎抓取系统的重要组成部分。
常见的搜索引擎有百度、谷歌、雅虎等,抓取系统可以理解为这些搜索引擎自己封装的一套爬虫程序。这套抓取系统可以在互联网中爬取所有的网站中的移民数据。
特性:抓取的是一整张页面数据。
是建立在通用爬虫的基础之上的一个爬虫。
特性:抓取的是页面中特定的局部内容。
使用方法:先使用通用爬虫抓取到网站中一整张的页面数据,之后再使用聚焦爬虫对这些数据进行指定数据爬取。
使用场景举例:想爬取某个用户微博下的所有评论信息。获取的数据不是这个微博用户对应的一整张页面信息,而是这个页面下的所有评论信息。
检测网站中数据更新的情况。
特性:只会抓取网站中最新更新出来的数据。
当网页中有数据更新,增量式爬虫会对更新出来的数据进行爬取,并对其进行排序。
以电商网站举例,很多电商网站是希望一些比价网站对自己的电商网站的商品信息进行爬取,这让会增加这个电商网站商品的流量,但是电商网站又不希望被自己的同行(竞争对手)对自己商品信息进行爬取,一方面是为了避免各个网站之间同一商品的恶意比价,另一方面是不希望自家商品描述被其他网站同一商品进行恶意抄袭,两者之间尤为矛盾。
门户网站(即互联网中的网站,如淘宝、京东等),可以通过制定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
与反爬机制对立,爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中的数据。
一些搜索引擎的开发人员和网站的站长通过邮件讨论定制出来的一项君子协议(robots.txt协议)。
规定了网站中哪些数据可以被爬虫爬取,哪些数据不可以被爬取。
并未采用强硬的技术手段或者语法格式强制要求,也因此被称为君子协议。
查看方式:在域名后加"/robots.txt"即可。如: “https://www.taobao.com/robots.txt”,其中的allow为可允许爬虫的数据,disallow后为不允许爬虫的数据,若爬取了robots.txt协议中明令禁止爬取的数据,需要承担相应的法律责任。
概念:就是服务器和客户端进行数据交互的一种形式。(可简单理解为两个人(服务器和客户端)如何沟通)
举例:天王盖地虎,宝塔镇河妖。只有双方都遵从了某种协议(商定了暗号),在根据协议发出信号(对暗号)且匹配成功(成功对上暗号),双方才知道对方下一步想做什么(协议内容)。以此类推,http协议可简单理解为服务器和客户端都遵从了http协议,才能进行数据交互。
爬虫中常用请求头信息:
User-Agent: 请求载体的身份标识。此类信息一般会包含当前的操作系统版本,当前浏览器的版本等。
如:在谷歌浏览器中发送了查询B站的请求,此时请求载体就是谷歌浏览器;在火狐浏览器中发送了查询粉笔网的请求,此时请求载体就是火狐浏览器;在IE浏览器中发送了查询虎牙网的请求,此时请求载体就是IE浏览器。
注意:如果使用浏览器发送请求对网站进行爬取,则user-agent为对应的浏览器的身份标识;若通过编写的爬虫程序对某个url进行爬取,则user-agent为爬取这个url所对应的代码的身份标识(可简单理解为user-agent表示的是爬取代码(或浏览器)的身份证)
Connection :请求完毕后是断开连接(close)释放连接资源还是保持连接(keep alive)。
爬虫中常用响应头信息:
Content-Type : 服务器响应回客户端的数据类型
概念:安全的超文本传输协议(s意味着security,安全)。
这意味着使用HTTPS协议进行数据交互会涉及到数据加密。
注意:HTTPS协议与http协议的区别就是在使用HTTPS协议进行数据传输时,发送方会对数据进行加密,而使用http协议进行数据传输不会对数据进行加密。
基于数据的加密方式:对称秘钥加密、非对称秘钥加密和证书密钥加密(HTTPS协议使用的加密方式)。
(1)对称秘钥加密
当客户端向服务器发送请求时,客户端可以向服务器端传递一些数据(这些数据通过参数形式传递给服务器端),此时客户端可对即将发送给服务器端的数据进行对称秘钥加密处理,将加密后的数据发送给服务器端。
加密流程:
客户端制定加密方式----->客户端采用自己制定的某一种加密方式对即将要传递给服务器端的数据进行加密----->客户端将加密成功后的密文和解密的方式(密钥)一并发送给服务器端---->服务器端接收到解密的秘钥和密文----->服务器端使用客户端发送的密钥对密文进行解密,获得客户端发送过来的数据内容
简单来说,就是:客户端加密---->客户端发送密文(数据)以及密钥----->服务器端接收---->服务端解密,获得原文数据
缺点:密钥和密文传输过程中,容易被第三方机构拦截,导致数据泄露,存在安全隐患
(2)非对称密钥加密
为了解决对称秘钥加密时存在的安全隐患,推出了非对称密钥加密方法,涉及到两把钥匙(公钥以及私钥)。
解决原理:从源头上根治密钥和密文被拦截的情况
加密流程:服务器端先制定数据加密的某种方式(公钥)---->服务器端向客户端传递自己制定的加密方式(公钥)---->客户端根据服务器端制定的加密方式(公钥),对需要传递给服务器端的数据进行加密处理---->客户端将加密之后的数据(密文)发送给服务器端---->服务器端**根据自己私有的解密方式(私钥)**对获取的数据进行解密,获得原文数据
两把钥匙的好处:避免了密文以及密钥同时进行传输,即使传输的密文被第三方机构截取,但因没有解密方式,也在一定程度上保障了数据安全。
缺点:①效率低,处理更为复杂,对通信速度有一定影响。
②没有办法保证客户端接收到的公钥一定是由服务器端所创建的。不能保证服务器端向客户端传输公钥时的数据安全,若此时公钥被第三方机构拦截并篡改,之后第三方机构再将篡改后的公钥发送给客户端,那么也会引发客户端发送数据的安全隐患。
(3)证书密钥加密
为了解决非对称密钥加密存在的安全隐患(无法保证客户端接收到的公钥一定是由服务器端所创建的),推出了证书密钥加密方法。
解决方式:加入了证书认证机构(第三方机构),是客户端以及服务器端完全信任的第三方机构。
加密流程:服务器端制定加密方式(公钥)-----> 服务器端将制定的加密方式(公钥)发送给证书认证机构(中间机构)进行审核 -----> 审核通过后该机构(证书认证机构)会对该公钥进行数字签名(主要用来防伪)-----> 该机构会将已经携带了数字签名的公钥封装在证书中 -----> 将处理好的证书一并发送给客户端 -----> 客户端接收到公钥以及证书后,确认公钥是由服务器端制定并发送的,将需发送的数据使用该公钥进行加密传输给服务器端 -----> 服务器端根据已有私钥对获取的密文进行解密,获得原文数据
注意:只有客户端接收到的公钥有数字签名,客户端才会使用公钥对数据进行加密传输。
与爬虫相关的模块有urllib模块以及requests模块,但由于urllib模块有些古老,处理过程相对复杂,requests模块逐渐被大众所接受。
概念:requests模块是python中原生的一款基于网络请求的模块
特点:功能非常强大,简单便捷,效率极高
作用:模拟浏览器发送请求
使用流程(requests的编码流程):
① 指定URL ② 发起请求 ③ 获取响应数据 ④ 持久化存储(将获取的互联网数据保存至本地)
注意环境安装(需安装requests库): pip install requests
实战编码:
---- 需求:爬取搜狗首页的页面数据
# 需求:爬取搜狗首页的页面数据
import requests
if __name__ == "__main__":
# step_1 : 指定url
url = "https://www.sogou.com/"
# step_2 : 发起请求
# get方法会返回一个响应对象
response = requests.get(url=url)
# step_3 : 获取响应数据,text返回的是字符串形式的响应数据
page_text = response.text
print(page_text)
# step_4 : 持久化存储
with open("./sogou.html",'w',encoding="utf-8") as f:
f.write(page_text)
print("爬取数据结束!!!")
案例:网页采集器(处理单参数的网页请求)
此案例中可能会涉及到的反爬机制:UA伪装
UA:即User-Agent(请求载体的身份标识),当使用requests库进行爬取时,请求对象为代码,而不是浏览器,此时User-Agent的身份标识并不是浏览器,服务器可根据这个信息对爬取的程序进行拦截。
UA检测:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份表示为某一款浏览器,说明该请求是一个正常的请求。但是,若检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),则服务器端很可能会拒绝该次请求。
UA伪装:让爬虫的请求载体身份标识伪装成某一款浏览器
import requests
if __name__ == "__main__":
url = "https://www.sogou.com/web"
# 处理url携带的参数:封装到字典中
kw = input("请输入关键字:")
param = {
'query':kw
}
# 对指定的url发起请求,该url是携带参数的,且请求过程中处理了参数
response = requests.get(url=url,params=param)
# 获取响应数据
page_text = response.text
fileName = kw + '.html'
# 将获取的数据保存至对应HTML文件中
with open(fileName,'w',encoding="utf-8") as fp:
fp.write(page_text)
print(fileName,'保存成功!!!')
爬虫程序编写思路:
① 确定需爬取的url
② 分析爬取url所需的数据(是否需要参数),请求类型(get or post等),响应数据类型(html or json or string等),是否需要UA伪装,数据保存位置(文件路径等)
③ 编写爬虫程序(发送请求,获取数据,分析数据,保存数据,完成爬虫)
案例:爬取异步数据-百度翻译
# 需求:破解百度翻译
# 分析:① post请求(携带了参数)
# ② 响应数据是一组json数据
import requests
import json
# 将获取的json数据持久化保存
if __name__ == '__main__':
# 1.指定url
post_url = 'https://fanyi.baidu.com/sug'
# 2.进行UA伪装
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0'
}
# 3.post请求参数处理(同get请求一致)
word = input('请输入需查询单词:')
data = {
'kw':word # 注意,此时的kw是经过百度翻译抓包获取的
}
# 4.请求发送
response = requests.post(url=post_url,data=data,headers=header)
# 5.获取响应数据:json()方法返回的是对象(obj)(如果确认响应数据是json类型的,才可以使用json())
dic_obj = response.json()
# 6.持久化存储
fileName = word + '.json'
fp = open(fileName,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False) # 注意,因获取的数据包含中文,中文不可使用ASCII码编码,会导致乱码,故ensure_ascii设为False
# 关闭文件
fp.close()
print('over!!!')