【一】爬虫初识
1)概念
- 爬虫是一种自动化获取互联网数据的技术,通过模拟浏览器行为,向目标网站发送请求并获取响应,然后解析响应中的数据
2)工作原理
- 发送HTTP请求,模拟浏览器行为,获取网站的响应,并解析响应中的数据
3)分类
- 通用爬虫:对整个互联网进行爬取
- 定向爬虫:只针对特定的网站进行爬取
- 基于规则的爬虫基于人工事先定义的规则提取数据
- 基于机器学习的爬虫通过机器学习算法自动提取数据
- 单机爬虫在单个计算机上运行
- 分布式爬虫通过多台计算机协同工作
4)爬虫常用库
-
requests库
- 用于发送HTTP请求,方便地发送GET、POST等请求,并获取响应
-
BeautifulSoup库
- 用于解析HTML和XML文档,方便地提取其中的数据
-
Scrapy框架
- 提供了一套完整的爬虫开发流程,包括发送请求、获取响应、解析响应、存储数据等步骤
-
Selenium库
- 用于模拟浏览器行为,模拟用户在浏览器中的操作,如点击、输入等
5)爬虫流程
-
发送请求
-
获取响应
-
解析响应
-
存储数据
6)反爬措施
- 频率限制
- 封IP和封账号
- 请求头中带加密信息
- 响应回来的数据是加密
- 验证码反扒
- JS加密
- 手机设备唯一ID号
【二】requests模块 初识
1)概念
- Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库
- 它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求
- 是一个功能强大、简洁易用的第三方Python库,用于发送HTTP请求
2)使用
1.安装
pip install requests
2.示例
import requests
# 确认网址
target_url = 'https://www.baidu.com/'
# 发起简单的get请求,并获取响应
response = requests.get(url=target_url)
# 解码(utf-8 / gbk)
response.encoding = 'utf-8'
# 获取数据
print(response.text)
【三】requests模块之get请求
1)发送get请求
import requests
target_url = 'https://www.bilibili.com/'
response = requests.get(url=target_url)
# 判断请求是否成功
if response.status_code == 200:
response.encoding = 'utf-8'
print(response.text)
else:
print(f"当前请求数据失败!错误码: {response.status_code}")
2)携带请求体
target_url = 'https://www.baidu.com/s?wd=B%E7%AB%99'
1.浏览器标识UA
- 网络
User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0
-
示例
import requests target_url = 'https://www.baidu.com/s?wd=B%E7%AB%99' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0'} response = requests.get(url=target_url, headers=headers) if response.status_code == 200: response.encoding = 'utf-8' page = response.text print(page) else: print(f"当前请求数据失败!错误码: {response.status_code}")
2.随机UA模块
# 安装
pip install fake-useragent
# 使用
from fake_useragent import UserAgent
headers = {'User-Agent': UserAgent().random}
-
示例
import requests from fake_useragent import UserAgent target_url = 'https://www.baidu.com/s?wd=B%E7%AB%99' headers = {'User-Agent': UserAgent().random} response = requests.get(url=target_url, headers=headers) if response.status_code == 200: response.encoding = 'utf-8' page = response.text print(page) else: print(f"当前请求数据失败!错误码:{response.status_code}")
3)携带 请求体参数params
# 使用urlencode对参数进行编码
from urllib.parse import urlencode
keyword={'wd':'B站'}
params = urlencode(keyword, encoding="utf8")
target_url = "https://www.baidu.com/s?"+ params
# 使用requests模块内置的方法
params={'wd':'B站'}
response = requests.get(
url=target_url,
params=params,
headers=headers)
-
示例
from fake_useragent import UserAgent params = {'wd': 'B站'} target_url = 'https://www.baidu.com/s' headers = {'User-Agent': UserAgent().random} response = requests.get(url=target_url, params=params, headers=headers) if response.status_code == 200: response.encoding = 'utf-8' page = response.text print(page) else: print(f"当前请求数据失败!错误码: {response.status_code}")
4)携带 请求头中Cookie
- Cookie作用是保存登录
# 直接携带在请求头中
...
headers = {
'Cookie':'......'
'User-Agent': UserAgent().random
}
...
# 携带在请求参数中
# 对 cookies 参数进行切分成字典格式键值对
def split_cookies(cookies):
first_data_start = cookies.split(";")
return {key: value for key, value in [item.split("=") for item in first_data_start]}
...
response = requests.get(
url=target_url,
headers=headers,
cookies=cookie
)
【四】requests模块之post请求
# 目标网站
http://www.aa7a.cn/user.php
# 网络 -> user.php -> 负载
username: 1853999155@qq.com
password: 123
captcha: 1
remember: 1
ref: http://www.aa7a.cn
act: act_login
-
示例
from fake_useragent import UserAgent target_url = 'http://www.aa7a.cn/user.php' headers = {'User-Agent': UserAgent().random} data = { 'username': '123@qq.com', 'password': '123', 'captcha': '1', 'remember': '1', 'ref': 'http://www.aa7a.cn', 'act': 'act_login', } response = requests.get( url=target_url, headers=headers, # 两种方式 data=data 或 json=data, ) if response.status_code == 200: response.encoding = 'gbk' page = response.text print(page) else: print(f"当前请求数据失败!错误码: {response.status_code}")
-
data=data
- 默认情况下,requests.post方法将会将data参数以application/x-www-form-urlencoded格式进行编码。
- 这种编码方式将字典数据转换成键值对的形式,并使用&符号进行连接。
- 然后,将生成的字符串作为请求的主体数据发送到服务器。这种方式常用于处理表单提交的场景。
-
json=data
- 当使用requests.post方法时
- 如果将data参数设置为一个字典,并同时将headers参数中的Content-Type设置为application/json,那么data字典将被自动序列化为JSON字符串,并作为请求的主体数据发送。
- 这样的请求方式常用于与服务器交互时,需要使用JSON格式进行数据传输的情况。
【五】自动携带cookie 的session对象
# 使用 session 对象保持会话状态
# 生成 session 对象发起请求 Cookie 会自动加载到session对象中
# 下一次请求直接用 session
import requests
from fake_useragent import UserAgent
# 创建session对象
session = requests.Session()
# 定义请求头
headers = {'User-Agent': UserAgent().random}
target_url = 'https://xueqiu.com/'
response = session.get(target_url, headers=headers)
response.encoding = 'utf-8'
target_url = 'https://stock.xueqiu.com/v5/stock/batch/quote.json?symbol=SH000001,SZ399001,SZ399006,SH000688,SH000016,SH000300,BJ899050,HKHSI,HKHSCEI,HKHSTECH,.DJI,.IXIC,.INX'
response = session.get(
url=target_url,
headers=headers,
)
page_text = response.text
print(page_text)
【六】requests模块之响应体
1)相关参数
响应体数据类型 | 格式 | 介绍 |
---|---|---|
字符串格式 | response.text | 将响应体转换为字符串形式。 |
二进制格式 | response.content | 获取响应体的二进制内容,适用于处理图像、视频等非文本类型的响应 |
response.json() | 会将响应 源码转换为 json 类型的数据格式 | |
响应体编码格式 | response.encoding | 获取响应的编码方式 |
响应状态码 | response.status_code | 获取响应的状态码。 |
响应头 | response.headers | 获取响应头信息,返回一个字典对象 |
响应Cookie | response.cookies | 获取服务器返回的cookie信息 |
response.cookies.get_dict() | 将cookie信息转换为字典形式 | |
response.cookies.items() | 获取cookie信息并以列表形式返回 | |
response.url | 获取当前响应的URL。这是在完成HTTP请求并接收到服务器响应后,实际返回的资源URL | |
response.request.url | 获取当前请求的URL。这是发送HTTP请求时使用的原始URL,即你在发出请求时指定的URL | |
当前请求的重定向URL | response.history | 如果有重定向,返回一个列表,包含所有经过的重定向URL |
迭代获取二进制数据 | response.iter_content() | 迭代获取响应内容(适用于处理视频、图片等二进制数据) |
【七】ssl认证
1)介绍
- HTTPS请求中 HTTP + SSL 证书
- HTTP请求是不需要认真的直接就能访问 都会提示 此网站不安全
2)示例
# 认证证书
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url)
print(response.status_code)
# certificate verify failed
# 不认证证书
import requests
url = 'https://ssr2.scrape.center/'
response = requests.get(url,verify=False)
print(response.status_code)
# 自定义证书路径
import requests
url = 'https://ssr2.scrape.center/'
cert_file = "/path/to/my_certificate.pem"
response = requests.get(url,verify=cert_file)
print(response.status_code)
【八】代理
1)概念
- 在网络爬虫和数据抓取的过程中,我们经常需要发送HTTP请求来获取网页内容或与远程服务器进行通信
- 然而,在某些情况下,直接发送请求可能会受到限制或被阻止,这时就需要借助代理来完成任务
- 代理在网络通信中起到中间人的作用,它代表我们与目标服务器建立连接并传递请求和响应
- 通过使用代理,我们可以隐藏真实的IP地址、绕过访问限制,并增加请求的匿名性
- Python中的requests库提供了便捷且强大的功能来处理HTTP请求,并且支持代理的配置
一般网站都有屏蔽的限制策略,用自己的IP去爬,被封了那该网站就访问不了,这时候就得用代理IP来解决问题了。
封吧,反正封的不是本机IP,封的代理IP。
标签:请求,url,60,headers,模块,requests,response,target From: https://www.cnblogs.com/Mist-/p/18336142