什么是网络爬虫
通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫的价值
- 实际应用
- 价值
爬虫带来的风险
- 爬虫干扰了被访问网站的正常运营
- 爬虫抓取了受法律保护的数据或信息
爬虫在使用场景中的分类:
-
通用爬虫:
抓取系统重要组成部分,抓取的是一整张页面的数据 -
聚焦爬虫
是建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容 -
增量式爬虫
检测网站中数据更新情况。只会抓取网站中最新更新出来的数据。
反爬机制
门户网站可以制定相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。
反反爬策略
爬虫程序可以制定相应的策略或者技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关数据。
robots.txt协议
君子协议。规定网站中的哪些数据可以被爬取,哪些不可以。
requests模块
定义python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用 模拟浏览器,发送请求
如何使用(requests的编码流程)
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
环境安装
pip install requests
开始实战:
get请求
import requests
if __name__ == '__main__':
#step1:指定url
url = 'https://www.taobao.com/'
#step2:发起请求
#get方法会返回一个响应对象
response = requests.get(url=url)
#step3:获取响应数据,page_text响应的是字符串式的数据
page_text = response.text
print(page_text)
#step4:持久化数据,存到当前目录的sogou.html文件中
with open('./taobao.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取成功')
运行结果:
打开生成的taobao.html
爬取成功了
处理携带参数的url
import requests
if __name__ == '__main__':
#step1:指定url
url = 'https://www.sogou.com/web'
#step2:处理url携带的参数:封装到字典里 发起请求
kw = input("enter word:")
parm ={
'query': kw
}
#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,params=parm)
#step3:获取响应数据,page_text响应的是字符串式的数据
page_text = response.text
firename = kw+'.html'
print(page_text)
#step4:持久化数据,存到当前目录的sogou.html文件中
with open(firename,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(firename,'爬取成功')
运行结果:
UA检测
门户网站的服务器会检测对应请求的载体身份标识,如果检测请求的载体身份标识为某一浏览器的请求,则是一个正常的请求。但是,如果检测到请求的载体身份标识不是基于某一浏览器的,则表示该请求是不正常请求(爬虫),则服务器就很可能拒绝这次请求。
UA伪装
让爬虫对应的请求载体身份标识伪装成某一款浏览器
import requests
if __name__ == '__main__':
#step1:指定url
url = 'https://www.sogou.com/web'
#从任何一款浏览器中复制他的User-Agent,用来进行伪装
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63',
}
#step2:处理url携带的参数:封装到字典里 发起请求
kw = input("enter word:")
parm ={
'query': kw
}
#对指定的url发起的请求对应的url是携带参数的,并且请求过程中处理了参数
response = requests.get(url=url,params=parm,headers=headers)
#step3:获取响应数据,page_text响应的是字符串式的数据
page_text = response.text
firename = kw+'.html'
print(page_text)
#step4:持久化数据,存到当前目录的sogou.html文件中
with open(firename,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(firename,'爬取成功')
爬取结果:
== 现在大部分网站都会有反爬虫机制和策略,所以在爬虫前要进行ua伪装 。
进行UA伪装,解决反爬虫机制 ==
post请求
import requests
import json
if __name__ == '__main__':
#指定url
post_url = 'https://fanyi.baidu.com/sug'
# 从任何一款浏览器中复制他的User-Agent,用来进行伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63',
}
word = input("输入数据:")
#post请求参数处理(同get请求一致)
data = {
'kw' : word
}
response = requests.post(url = post_url,data=data,headers = headers)
#获取响应数据,直接获取json对象(如果确定响应的数据时json类型的,才可以用json方法)
dic_obj = response.json()
print(dic_obj)
#持久话存储
file_name = word+'.json'
fp = open(file_name,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('爬取成功')
运行结果: