爬虫
Anaconda
可视化工具
- 启动:jupyter notebook
- 测试安装是否成功:打开cmd窗口,录入jupyter notebook指令,如果没有显示找不到命令且没有报错即可表示安装成功!
- 介绍:
- anaconda是一个集成环境(数据分析+机器学习)
- 提供了一个叫jupyter的可视化工具(基于浏览器)
jupyter的基本使用
快捷键
- 快捷键
- 插入cell:a,b
- 删除:x
— 执行:shift+enter
— 切换cell的模式:y,m
- cell分为两种模式
- code:编码
- markdown:编写文本(必须)
- tab:自动补全
— 打开帮助文档:shift+tab
爬虫
- 爬虫:
- 就是通过编写程序模拟浏览器上网,然后让其去互联网中爬取数据的过程
- 爬虫的分类
- 通用爬虫:爬取一整张页面源码数据。搜索引擎(抓取系统==》内部封装的一套爬虫程序)重点使用的是该种形式的爬虫。
- 聚焦爬虫:抓取的是页面中指定的局部数据。
- 增量式爬虫:监测网站数据更新的情况。抓取的是网站最新更新出来的数据。
-
爬虫安全性的探究
- 风险所在
- 爬虫干扰了被访问网站的正常运营;
- 爬虫抓取了受到法律保护的特定类型的数据或信息
-
如何规避风险
-
严格遵守网站设置的robots协议;
-
在规避反爬虫措施的同时,需要优化自己的代码,避免干扰被访问网站的正常运行;
-
在使用、传播抓取到的信息时,应审查所抓取的内容,如发现属于用户的个人信息、隐私或者他人的商业秘密的,应及时停止并删除
-
- 风险所在
-
反爬机制:应用在网站中
-
反反爬策略:应用在爬虫程序中
-
第一个反爬机制:
- robots协议:纯文本的协议
- 特点:防君子不防小人
- robots协议:纯文本的协议
反爬机制和其对应的反反爬策略分别是
- robots协议
- UA监测
http和https
- http&https
- 什么是http协议
- 就是服务器端和客户端进行数据交互的某种形式
- https就是安全(数据加密)的http协议
- 常用的头信息
- user-agent:请求载体的身份标识
- Connection:‘close’ # close建立链接之后马上断开
- content-type
- https的加密方式
- 对称秘钥加密
- 非对称秘钥加密
- 证书秘钥加密(https)
requests模块
- requests模块
- 概念:基于网络请求的模块
- 作用:用来模拟浏览器发请求,从而实现爬虫
- 环境安装:pip install requests
- 编码流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
- 爬取搜狗首页的页面源码数据
获取数据(通用爬虫)
import requests
#1.指定url
url = 'https://www.sogou.com/'
#2.请求发送:get返回的是一个响应对象
response = requests.get(url=url)
#3.获取响应数据:text返回的是字符串形式的响应数据
page_text = response.text
#4.持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
简易网页采集器(聚焦爬虫)
请求动态参数
- 乱码问题
- response.encoding = 'xxx'
- 数据丢失
- 反爬机制:UA检测
- 反反爬策略:UA伪装
有问题版
url = 'https://www.sogou.com/web' #请求参数的动态化 wd = input('enter a key word:') params = { 'query':wd } response = requests.get(url=url,params=params) page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'爬取成功!')
完整版
#UA伪装操作 url = 'https://www.sogou.com/web' #请求参数的动态化 wd = input('enter a key word:') params = { 'query':wd } #UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } response = requests.get(url=url,params=params,headers=headers) #将响应数据的编码格式手动进行指定 response.encoding = 'utf-8' page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'爬取成功!')
动态加载数据(增量式爬虫)
动态加载的数据
- 通过另一个网络请求请求到的数据
- 爬取豆瓣电影中动态加载出的电影详情数据
import requests url = 'https://movie.douban.com/j/chart/top_list' #参数动态化 params = { 'type': '5', 'interval_id': '100:90', 'action': '', 'start': '0', 'limit': '200', } #UA伪装 headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36' } response = requests.get(url=url,params=params,headers=headers) #json()返回的是序列化好的对象 movie_list = response.json() for movie in movie_list: print(movie['title'],movie['score'])
总结:对一个陌生的网站进行数据爬取的时候,首先要确定的一点就是爬取的数据是否为动态加载出来的
- 是:需要通过抓包工具捕获到动态加载数据对应的数据包,从中提取出url和请求参数。
- 不是:直接对浏览器地址栏的url发起请求即可
如何检测爬取的数据是不是动态加载出来的?
- 通过抓包工具进行局部搜索就可以验证数据是否为动态加载
- 搜索到:不是动态加载
- 搜索不到:是动态加载
- 如何定位动态加载的数据在哪呢?
- 通过抓包工具进行全局搜索进行定位
- 如何定位动态加载的数据在哪呢?
post 和get
get默认数据: params
post默认数据:data
爬取肯德基的餐厅位置信息http://www.kfc.com.cn/kfccda/storelist/index.aspx
import requests url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword' data = { 'cname': '', 'pid': '', 'keyword': '上海', 'pageIndex': '1', 'pageSize': '10', } headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } a=requests.post(url=url,data=data,headers=headers).json() for dic in a['Table1']: print(dic['addressDetail'])
- 需求 https://www.fjggfw.gov.cn/Website/JYXXNew.aspx 福建省公共资源交易中心
提取内容:
工程建设中的中标结果信息/中标候选人信息
-
完整的html中标信息
-
第一中标候选人
-
中标金额
-
中标时间
-
其它参与投标的公司
实现思路
- 确认爬取的数据都是动态加载出来的
- 在首页中捕获到ajax请求对应的数据包,从该数据包中提取出请求的url和请求参数
- 对提取到的url进行请求发送,获取响应数据(json)
- 从json串中提取到每一个公告对应的id值
- 将id值和中标信息对应的url进行整合,进行请求发送捕获到每一个公告对应的中标信息数据
post_url = 'https://www.fjggfw.gov.cn/Website/AjaxHandler/BuilderHandler.ashx' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36', 'Cookie': '_qddac=4-3-1.4euvh3.x4wulp.k1hj8mnw; ASP.NET_SessionId=o4xkycpib3ry5rzkvfcamxzk; Hm_lvt_94bfa5b89a33cebfead2f88d38657023=1570520304; __root_domain_v=.fjggfw.gov.cn; _qddaz=QD.89mfu7.7kgq8w.k1hj8mhg; _qdda=4-1.4euvh3; _qddab=4-x4wulp.k1hj8mnw; _qddamta_2852155767=4-0; _qddagsx_02095bad0b=2882f90558bd014d97adf2d81c54875229141367446ccfed2b0c8913707c606ccf30ec99a338fed545821a5ff0476fd6332b8721c380e9dfb75dcc00600350b31d85d17d284bb5d6713a887ee73fa35c32b7350c9909379a8d9f728ac0c902e470cb5894c901c4176ada8a81e2ae1a7348ae5da6ff97dfb43a23c6c46ec8ec10; Hm_lpvt_94bfa5b89a33cebfead2f88d38657023=1570520973' } data = { 'OPtype': 'GetListNew', 'pageNo': '1', 'pageSize': '10', 'proArea': '-1', 'category': 'GCJS', 'announcementType': '-1', 'ProType': '-1', 'xmlx': '-1', 'projectName': '', 'TopTime': '2019-07-10 00:00:00', 'EndTime': '2019-10-08 23:59:59', 'rrr': '0.7293828344656237', } post_data = requests.post(url=post_url,headers=headers,data=data).json() for dic in post_data['data']: _id = int(dic['M_ID']) detail_url = 'https://www.fjggfw.gov.cn/Website/AjaxHandler/BuilderHandler.ashx?OPtype=GetGGInfoPC&ID={}&GGTYPE=5&url=AjaxHandler%2FBuilderHandler.ashx'.format(_id) company_data = requests.get(url=detail_url,headers=headers).json()['data'] company_str = ''.join(company_data) print(company_str)
小结:
- 1.爬虫在使用场景中的分类,且每种分类的特性分别是什么?
- 通用爬虫
- 聚焦爬虫
- 增量式爬虫:监测
- 2.列举你目前所知的反爬机制和其对应的反反爬策略分别是什么?
- robots协议
- UA监测
- 3.如何判定爬取的数据是否为动态加载的数据?如何捕获到动态加载的数据?
- 通过抓包工具进行局部搜索就可以验证数据是否为动态加载
- 搜索到:不是动态加载
- 搜索不到:是动态加载
- 如何定位动态加载的数据在哪呢?
- 通过抓包工具进行全局搜索进行定位
- 如何定位动态加载的数据在哪呢?
- 4.在requests中如何实现参数动态化和UA伪装?
- params/data
- headers
- 5.get和post方法的常用参数分别是什么,各自的作用是什么?
- url
- headers
- params/data
- 6.简述https的加密方式?
- 证书秘钥加密