爬虫
一、学前
1、什么是爬虫
通过编写程序,模拟浏览器上网,然后让其去互联网上爬取数据的过程。
2、爬虫的价值
实际应用、就业
3、爬虫的合法性
在法律中不被禁止,但具有违法风险
4、爬虫的分类
(1)通用爬虫
爬取系统的重要组成分,抓取的是一整张页面数据。
(2)聚焦爬虫
建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容。
(3)增量式爬虫
检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据。
5、反爬机制和反反爬策略
反爬机制:门户网站可以通过指定乡音的策略或者技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略:爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中的反爬机制,从而获取门户网站中的数据。
(1)UA检测---UA伪装
UA检测:网站的服务器会对访问行为的身份标识进行检测,如果身份标识为某一个浏览器的身份标识,则是一个正常的访问行为,即可允许访问;否则是一个非正常的访问行为(爬虫),即不允许访问。
破解策略——UA伪装:让爬虫的身份标识伪装成某一浏览器的身份标识。即将对应的身份标识封装到一个字典中。
二、robots.txt协议
君子协议,规定了网站中哪些数据可以被爬取。
可以通过在网址后加/robots.txt进行查看
三、http&https协议
1、http协议:
服务器和客户端进行数据交互的一种形式。
2、常用请求头信息
User-Agent:请求载体的身份标识
Connection:请求完毕后,是否断开连接
3、常用响应头信息
Content-Type:服务器响应回客户端的数据类型
4、https协议
https协议就是加密后的http协议,安全的超文本传输协议,属于证书秘钥加密
5、加密方式
数据在网络中传输是容易被劫持的,因此需要对传输的数据进行加密,同时接收端在对数据进行解密。从而保持数据传输的安全性。
(1)对称秘钥加密
-加密算法与解密算法相同。
-优点:效率高
-缺点:容易被劫持,使用时间稍长就会被中间劫持,根据数据规率找破解出加密算法。
(2)非对称秘钥加密
-加密和解密的算法不同。服务器生成一对公钥和私钥;将公钥传给客户端,客户端用公钥进行加密,服务端使用私钥解密。
-公钥和私钥:通过加密算法—RSA算法,得到一对密钥(就是两串字符),公钥用于对数据加密 ,私钥用于对数据解密。因为加密和解密的方式不同,因此很难被破解。就算公钥被劫持,但客户端使用公钥加密的数据只能用私钥解密。
-优点:安全性高,不容易被破解
-缺点:解密效率比较低
(3)证书秘钥加密(CA)
-进行身份验证;并且传送公钥信息,公司生成一对密钥之后,拿到权威机构处生成一个签名证书,证书包含:公钥信息,权威机构信息,公司机构信息,有效时间等。
-SSl加密过程:在通信的时候,连接建立之后,服务器先向客户端传送证书,客户端通过证书的信息进行验证:若身份验证不通过,则可以直接断开连接,若身份验证通过,然后用证书中的公钥加密对称算法的协商过程,最终利用协商好的对称加密算法对数据通信进行加密。
四、request模块
1、 概念
python中原生的一款基于网络请求的模块,功能强大,操作便捷,效率极高。
2、作用
模拟浏览器发起请求
3、如何使用&小案例
——指定url
——(UA伪装)
——发起请求
——(请求参数的处理)
——获取响应数据
——持久化存储
环境安装:pip install requests
(1)豆瓣喜剧电影排行榜的简介爬取
#对豆瓣电影中喜剧排行榜1-20的简介进行爬取 import requests import json if __name__=='__main__': #step1 指定url url='https://movie.douban.com/j/chart/top_list' param={ 'type':'24', 'interval_id':'100:90', 'action':'', 'start':'0',#从库中的第几号开始取(第一个为0号) 'limit':'20',#一次取出的个数 } #step2 进行UA伪装 headers={ 'User-Agent':'Mozilla / 5.0(WindowsNT10.0;Win64;x64;rv: 107.0) Gecko / 20100101Firefox / 107.0' } #step3 发起请求,get方法会返回一个响应对象 response=requests.get(url=url,params=param,headers=headers) #step4 获取响应数据 list_data=response.json() #step5 持久化储存 fp=open('./douban.json','w',encoding='utf-8') json.dump(list_data,fp=fp,ensure_ascii=False) print('over')
关于json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 易于人阅读和编写,同时也易于机器解析和生成。
爬取后返回的json数据是字符串形式,可以通过在线的格式化工具将其格式化展示。比如在线JSON校验格式化工具(Be JSON)
(2)破解百度翻译
#获取单词在百度翻译中的中文释义(局部) import requests import json if __name__=='__main__': #1 指定url post_url='https://fanyi.baidu.com/sug' #2 进行UA伪装 headers={ 'User-Agent':'Mozilla / 5.0(WindowsNT10.0;Win64;x64;rv: 107.0) Gecko / 20100101Firefox / 107.0' } #3 post请求参数处理(同get) word = input('enter a word:') data = { 'kw':word } #4 请求发送 response =requests.post(url=post_url,data=data,headers=headers) #5 获取响应数据:json()方法返回的是obj(已确认响应数据是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) print('over')
(3)搜狗网页采集器
#需求:爬取搜狗指定词条对应的搜索结果页面(简易的网页采集器) import requests if __name__=='__main__': #UA伪装:将爬虫对应的User-Agent封装到一个字典中 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0' } url='https://www.sogou.com/web' #处理url携带的参数:封装到字典中 kw=input('enter a word:') param={ 'query':kw } #对指定的url发起的请求是携带参数的,并且请求过程中处理了参数 response=requests.get(url=url,params=param,headers=headers) page_text=response.text fileName=kw+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'保存成功')
五、数据解析
数据解析原理概述:
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储 1、进行指定标签的定位 2、·标签或者标签对应的属性中存储的数据值进行提取(解析)
1、编码流程:
指定urL 发起请求 获取响应数据 数据解析 持久化存储
2、数据解析分类
正则 bs4 xpath
(1)