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)
最后修改:2022 年 12 月 29 日
如果觉得我的文章对你有用,请随意赞赏