python 爬虫学习
爬虫
通过编写程序,模拟浏览器上网,抓去数据
分类
- 通用爬虫:抓取系统重要的组成部分,抓取的是整张页面的数据
- 聚焦爬虫:建立在通用爬虫的基础之上,抓取的是页面的特定局部内容
- 增量式爬虫:检测网站中数据更新的情况,只会抓取更新的数据
反爬机制
门户网站可以通过制定相关策略或者技术手段,防止爬虫程序进行网站数据的爬取
反反爬策略
爬虫程序指定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取门户网站中的相关数据
http协议
概念:服务器和客户端进行数据交互的一种形式
常见请求头
User-Agent:请求载体的身份标识
Connection:请求完毕后,是否断开还是保持连接
常见响应头
Content-type:服务器响应回客户端的数据类型
http协议:安全的超文本传输协议
加密方式
- 对称密钥加密:
双方共同持有密钥,发送方用这个密钥按照指定的算法将数据加密,再发送出去,接收方使用密钥将其解密
缺点是传输过程中密钥可能被拦截用来解密
- 非对称密钥加密:
一对密钥,分为公钥和私钥,发送方使用公钥将数据加密,发送出去,接收方使用私钥将数据进行解密,好处是就算拦截也只能截到公钥和密文,没有私钥很难解密
缺点是公钥可能被篡改劫持,且传输效率较低
- 证书密钥加密:
在非对称密钥加密基础上,在公钥传输过程中添加了证书认证机构,对传输的公钥进行审核,确认无误后才可发送给接收端,并进行解密
requests模块
python中基于网络请求的模块,功能强大,简单便捷,效率极高
模拟浏览器发送请求
使用过程
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
eg
import requests
url = 'https://cn.bing.com/'
response = requests.get(url=url)
page_text = response.text
print(page_text)
UA 伪装
门户网站的服务器会检测对应请求的载体身份标识,若检测到请求载体身份标识为浏览器,说明为正常请求服务器端很可能拒绝请求,故让爬虫伪装成一款浏览器
将User-Agent信息封装到一个字典中
eg
import requests
url = 'https://cn.bing.com/search'
# 输入参数
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
}
search = input("Please input your query:")
param = {
'q': search
}
response = requests.get(url=url, params=param, headers=headers) # 带入参数
page_text = response.text
fileName = search + '.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('success!')
post方式爬取
百度翻译页面查单词
import json
import requests
post_url = 'https://fanyi.baidu.com/sug'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 '
'Safari/537.36 Edg/96.0.1054.62'
}
query = input('Please input the word:')
data = {
'kw': query
}
response = requests.post(url=post_url, data=data, headers=headers)
dic_obj = response.json()
print(dic_obj)
fp = open('./dog.json', 'w', encoding='utf-8')
json.dump(dic_obj, fp=fp, ensure_ascii=False)
print('success!')
获取json形式的数据
import json
import jsonpath as jsonpath
import requests
url = 'https://movie.douban.com/j/chart/top_list'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 '
'Safari/537.36 Edg/96.0.1054.62'
}
params = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
response = requests.get(url=url, params=params, headers=headers)
list_data = response.json()
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False, indent=2) # ensure_ascii保证输出中文,最后1个参数设置缩进来格式化json数据
print('success!')
title_list = jsonpath.jsonpath(list_data, '$..title')
cnt = 0
for i in title_list:
cnt += 1
print(str(cnt) + '.' + i)