什么是爬虫
就是编写程序,模拟浏览器上网,让其去互联网中抓取数据的过程。
模拟:浏览器本身就是一个爬虫工具,爬虫相关模块都是基于浏览器为基础开发出来的。只要模拟力度够大,可以爬取任何数据(必须遵守robots协议)。
robots协议:
Disallow后面说明带相关路径的不允许爬取
抓取:获取页面全部数据和局部数据
爬虫分类
1.通用爬虫:获取页面中所有数据
2.聚焦爬虫:获取页面中局部数据,建立在通用爬虫基础上实现的
3.功能爬虫:通过浏览器或者应用自动化操作,实现相关网页或者应用自动化的操作(刷单)
4.增量式爬虫:检测网站数据更新情况,获取网站最新的数据
5.分布式爬虫:可以同时运行多个爬虫程序的爬虫
requests基本操作
基本介绍
requests就是爬虫中基于网络请求的模块
作用:模拟浏览器上网
环境安装
pip install requests
编码流程
1.指定url(网址)2.发起请求(按下回车)3.获取响应数据(获取网址爬取到的数据)4.持久化储存
先简单获取一个网站页面
import requests
url='https://www.sogou.com/'#指定网址
#发起请求(只要在浏览器地址栏输入网址按下回车,发起的一定是get请求)
response =requests.get(url=url)#第二个url是指定参数(上面的网址),response是服务端返回给客户端的响应对象
page_text =response.text#text属性使用来返回字符串形式的响应数据
#print(page_text)
#持久化储存
with open('./sogou.html','w',encoding='utf-8')as fp:
fp.write(page_text)
print('数据爬取储存成功')
简单网页采集器
注意:在浏览器地址栏中的网址,网址?后面的内容就是请求参数
query=c罗就是请求的参数(客户端发送给服务端的数据)
新增两个概念:反爬机制和反爬策略,意思顾名思义
要学会分析反爬机制:
异常的访问请求:通过程序发起的请求
正常的请求:通过浏览器发起的请求
网址如何检测是不是浏览器发起的请求
是通过请求的一个头信息:user-agent(请求载体(浏览器,程序)的身份信息)
可以看见请求头里面有useragent ,里面包含了各种身份标识信息。
所以我们要伪装请求载体的身份标识(UA伪装)
import requests
#请求参数动态化
keyword = input('请输入关键字:')
#稍后想要把该字典作为请求参数
pram = {
'query':keyword, #只存在一个键值对(存在一组请求参数)
}
#1.指定url
url = 'https://www.sogou.com/web' #需要将请求参数去除
#2.发起请求
head = { #存放需要伪装的头信息
'User-Agent':'存放的useragent'
}
#通过headers参数进行了头信息的伪装
response = requests.get(url=url,params=pram,headers=head)
#3.获取响应数据
page_text = response.text
#4.持久化存储
fileName = keyword + '.html'
with open(fileName,'w',encoding='Utf-8') as fp:
fp.write(page_text)
print('爬取成功')
豆瓣电影榜单排名
对网站进行分析:
在抓包工具定位到和浏览器地址栏相同的数据包,查看开发者工具中的响应如何检测是否存在我们想要爬取的数据呢?局部搜索:将你想要爬取的局部数据,在响应进行搜索,查看是否可以搜索到。搜索到了,可以直接对该数据包的url发起请求获取你想要的数据即可搜索不到,说明是动态加载数据。
什么是动态加载数据?
特不是通过浏览器地址栏的请求请求到的数据,就是动态加载数据。同理,动态加载数据一定是通过其他的请求请求到的。
如何获取动态加载数据?
基于抓包工具进行全局搜索,点击任意的数据包,然后按下ctrl+f打开全局搜索框,搜索局部你想要的数据,即可定位到包含搜索数据的指定数据包。然后定位到请求方式和请求参数(可以在负载中查看)
import requests
head = { #存放需要伪装的头信息
}
pram = {
存放的请求参数
}
url = 'https://movie.douban.com/j/chart/top_list'
response = requests.get(url=url,headers=head,params=pram)
#获取响应数据
#json()可以将获取到的json格式的字符串进行反序列化
page_text = response.json()
fp = open('./douban.txt','w',encoding='Utf-8')
for dic in page_text:
title = dic['title']
score = dic['score']
fp.write(title+':'+score+'\n')
print(title,'爬虫保存成功!')