爬虫在使用场景中的分类
#1、通用爬虫 抓取系统的重要部分,抓取的是一整张页面的数据 #2、聚焦爬虫 是建立在通用爬虫的基础上,抓取的似乎页面中的特定的局部内容 #3、增量式爬虫 检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据
robots.txt协议
君子协议
User-agent: Baiduspider Allow: /article Allow: /oshtml Allow: /ershou Allow: /$ Disallow: /product/ Disallow: / User-Agent: Googlebot Allow: /article Allow: /oshtml Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: / User-agent: Bingbot Allow: /article Allow: /oshtml Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: / User-Agent: 360Spider Allow: /article Allow: /oshtml Allow: /ershou Disallow: / User-Agent: Yisouspider Allow: /article Allow: /oshtml Allow: /ershou Disallow: / User-Agent: Sogouspider Allow: /article Allow: /oshtml Allow: /product Allow: /ershou Disallow: / User-Agent: Yahoo! Slurp Allow: /product Allow: /spu Allow: /dianpu Allow: /oversea Allow: /list Allow: /ershou Allow: /$ Disallow: /
两种协议与三种加密方式
http协议与https协议
#概念:都是服务器与客户端进行数据交互的一种形式 #只不过https是安全的超文本传输协议
常用的请求头信息
User-Agent:请求载体的身份标识
Connection:求情完毕后,是断开连接还是保持连接
常用的响应头信息
Content-Type:服务器响应回客户端的数据类型
https采用的是证书密钥加密
UA伪装
#UA:User-Agent(请求载体的身份标识) #UA检测: 门户网站的服务器会检测对应请求的载体标识,如果检测请求的载体身份标识为某一款浏览器,说明请求是一个正常的请求。反正为不正常请求(爬虫),服务器就很有可能拒绝该次请求 #UA伪装: 让爬虫对用的请求载体身份标识伪装成浏览器
三种加密方式
#1、对称密钥加密 #2、非对称密钥加密 #3、证书密钥加密
#对称密钥加密的基本工作流程 1、客户端制定一套加密规范,对数据进行加密, 2、在传输过程中,把加密规范(密钥)同数据一块发送给服务器 3、服务器拿到加密数据以及密钥,进行解密,进而拿到客户端传递的数据 #弊端: 在密钥和加密数据的传递过程中,很可能被第三方拦截到,第三方可直接解密,直接拿到数据
#非对称加密是使用的时候,有两把锁,公开密钥(公钥)和私有密钥(私钥) #非对称密钥加密的基本工作流程: 服务器端设置公钥,并发送给客户端, 客户端按照公钥进行加密,把加密数据发送给服务端 服务端拿到加密数据,使用自己的私钥进行解密 因为解密的密钥不会进行传输,因此,即使拿到公钥和数据,也很难解密, #但是也存在弊端, 一、非对称加密的凡是效率比较低,它处理起来更为复杂,影响通信速度 二、无法保证客户端所拿到的公钥就是服务器发过来的 如果公钥在发送过程中被拦截(例如django的中间件),然后对公钥进行篡改,把篡改之后的公钥发送给客户端, 客户端按照被篡改的公钥进行加密
证书密钥加密的基本工作原理与非对称密钥相似
只不过在公钥传输过程中,加入了第三方认证机构
公钥------->>证书认证机构(给公钥签名)----->>证书-------->>客户端
requests模块
pip install requests #requests模块: python中原生的一款基于网络请求的模块,简单便捷,效率极高,功能非常清大,(只要掌握了requests模块,就掌握了爬虫占据了爬虫领域的半壁江山) #作用: 模拟浏览器发请求 #如何使用: 指定url 发起请求 获取响应数据 持久化存储
requests实战之网页采集器
import requests # https://www.baidu.com/s?wd=%E5%8D%8E%E4%B8%BA # 问号要不要都行 if __name__ == '__main__': headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } url='https://www.baidu.com/s' kw=input('enter a word:') param={ 'wd':kw } response = requests.get(url=url,params=param,headers=headers) page_text = response.text fileName=kw+'.html' with open(fileName,'w',encoding='utf-8')as f: f.write(page_text) print('保存成功')
import json,requests if __name__ == '__main__': # 1、指定url post_url = 'https://fanyi.baidu.com/sug' # 2、进行UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } word=input('>>:') data = {'kw':word} # 发送请求 response = requests.post(url=post_url,data=data,headers=headers) # 获取响应数据,json()方法返回到是obj,(只有在确认是json数据类型才可以使用,content-type: application/json可以确认) dic_obj = response.json() fileName = word+'.json' fp=open(fileName,'w',encoding='utf-8') json.dump(dic_obj,fp,ensure_ascii=False) print('over!!!')
#有的页面并非是全局刷新,很多是通过ajax局部刷新的(动态加载出阿里的),如果指定该url,并不能拿到想要的数据, #两种方式检测是否是局部刷新 #方式一、直接用代码验证 import requests if __name__ == '__main__': url='http://125.35.6.84:81/xk/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'} page_text = requests.get(url=url,headers=headers).text with open('./huazhuang.html','w',encoding='utf-8')as f: f.write(page_text) #通过打开html文件发现,此页面与直接访问该地址的页面不同,想要拿到的数据没有加载出来,所以,想要的信息不在这个http://125.35.6.84:81/xk/地址 #方式二、直接在浏览器上判断 在浏览器上访问http://125.35.6.84:81/xk/,通过抓包工具,找到地址为http://125.35.6.84:81/xk/的数据包(Network中),找到Response对象,看是否有想要找的数据,可以通过ctrl+f快速查找