1. 爬虫概述
爬虫是通过编写程序,模拟浏览器上网,让后让其在互联网上抓取数据的过程
爬虫的分类:
- 通用爬虫:抓取系统的重要组成部分,抓取的是一整张页面数据
- 聚焦爬虫:是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容
- 增量式爬虫:检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据
反爬机制:门户网站,可以通过制定相应的策略或技术手段,防止爬虫程序进行网站数据的爬取
反反爬策略:爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取门户网站信息
robots.txt协议:君子协议,规定了网站中哪些数据可以被爬虫爬取,哪些数据不可以被爬取
http协议:是服务器和客户端进行数据交互的一种形式,https是安全的超文本传输协议,加密方式为证书密匙加密
常用请求头信息:
- User-Agent:请求载体的身份标识
- Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息:
- Content-Type:服务器响应回客户端的数据类型
2. requests模块
2.1 requests模块概述
requests模块是python中一款基于网络请求的模块,功能强大,简单便捷,效率极高
requests的作用是模拟浏览器发请求
如何使用:(requests模块的编码流程)
- 请求url(网址)
- 发起请求
- 获取响应数据
- 持久化存储
2.2 使用方法
案例一:爬取搜狗首页的页面数据
#需求:爬取搜狗首页的页面数据
import requests
#1.指定url
url = 'https://www.sogou.com/'
#2.发起请求
#get方法会返回一个响应对象
response = requests.get(url=url)
#3.获取响应数据,.text返回的是字符串形式的响应数据
page_text = response.text
print(page_text)
#4.持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束')
案例二:网页采集器
UA:User-Agent(请求载体的身份标识)
UA检测:门户网站的服务器会检测对应请求的载体身份标识、如果检测到请求的载体身份标识为某一款浏览,说明该请求是一个正常的请求。但是,如果检测到请求的载体身份标识不是某一款浏览器的,则表示该请求为不正常的请求(爬虫),则服务器端成很有可能拒绝该次请求。
UA伪装:为了应对UA检测,要让爬虫对应的请求载体身份标识伪装成某一款浏览器。
#案例二:网页采集器
import requests
#UA伪装:将对应的User-Agent封装到一个字典里
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
url = 'https://www.baidu.com/'
#处理url携带的参数:封装到字典里
kw = input('enter a word:')
param = {'query':kw}
#对指定的url发起请求对应的url是携带参数的,并在请求过程中处理参数
#url是指定网页位置
#params是指定搜索关键值
#headers是UA伪装
response = requests.get(url=url,params=param,headers=header)
page_text = response.text
fileName = kw + '.html'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(fileName,'保存成功!!!')
案例三:破解百度检测
#案例三:破解百度翻译
import requests
import json
#指定url
post_url = 'https://fanyi.baidu.com/langdetect'
#进行UA伪装
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
#post请求参数处理(同get请求一致)
word = input('enter a word:')
data = {'kw':word}
#请求发送
#post是请求数据,get是发送数据
response = requests.post(url=post_url,data=data,headers=headers)
#获取响应数据(json方法返回的是对象,如果确认响应数据是json类型,才可以使用json)
dic_obj = response.json()
#持久化存储
fileName = word + '.json'
fp = open(fileName,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('over!!!')
案例四:爬取豆瓣电影数据
#*案例三四:爬取豆瓣电影数据
import requests
import json
url = 'https://movie.douban.com/j/subject_abstract?subject_id=1292720'
param = {
'type':'movie',
'tag':'经典',
'sort':'recommend',
'page_limit':'0', #从库中第几部电影中去取
'page_start':'20', #一次取出的个数
}
#进行UA伪装
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
response = requests.get(url=url,params=param,headers=headers)
list_data = response.json()
fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over!!!')