随笔 - 74  文章 - 0  评论 - 1  阅读 - 1221

60.requests模块

【一】爬虫初识

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。

posted on   晓雾-Mist  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示