5.2.媒体文件取得

本文介绍了如何使用Python的urllib3库中的urlretrieve函数从URL下载媒体文件,并演示了如何添加回调函数来跟踪下载进度。同时,还展示了如何结合requests和lxml库进行网页抓取获取图片URL进行下载。

媒体文件取得,有两种方式:

(1)只获取文件的url链接

(2)直接将媒体文件下载到本地

5.2.1.urllib3的urlretrieve

  urllib3 库中的 urlretrieve 函数用于从指定的 URL 中检索文件并将其保存到本地文件系统中。以下是关于 urllib3.urlretrieve 函数的详细讲解:

        1.功能:从指定的 URL 中检索文件,并将其保存到本地文件系统中。

        2.语法

urllib3.urlretrieve(url, filename, reporthook=None, data=None)
  • url:要检索文件的 URL。
  • filename:要保存到的本地文件路径。
  • reporthook:可选参数,用于指定一个回调函数,在下载过程中会被多次调用,用于显示下载进度或其他信息。
  • data:可选参数,用于指定要发送到服务器的附加数据(例如 POST 请求的数据)。

        3.返回值:函数会返回一个包含 (filename, headers) 的元组,其中 filename 是本地文件路径,headers 是一个类似于字典的对象,包含了响应的 HTTP 头信息。

例:

import urllib.request
from lxml import etree
import requests

def Schedule(blocknum, blocksize, totalsize):
    '''
    blocknum:已经下载的数据块
    blocksize:数据块的大小
    totalsize:远程文件的大小
    '''
    per = 100 * blocknum * blocksize / totalsize
    if per > 100 :
        per = 100
    print("当前下载进度:%d"%per)

user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36'
headers = { 'User-Agent' : user_agent }
r =  requests.get(r'https://www.baidu.com', headers = headers)
html = etree.HTML(r.content)
img_urls = html.xpath('.//img/@src')
i = 0
for img_url in img_urls:
    urllib.request.urlretrieve(img_url, r'xxxx\xxx\test\img'+str(i)+'.jpg', Schedule)
    i += 1

这条命令是使用 `iptables` 配置防火墙规则,允许特定 IP 地址范围的 UDP 流量通过指定端口(5060)。以下是详细解析和优化建议: --- ### **命令解析** 1. **规则功能**: - 允许来自以下 IP 范围的 UDP 流量(端口 5060)通过网卡 `eth1`: - `5.2.15.9` 到 `5.2.15.10` - `5.2.15.57` 到 `5.2.15.58` - `5.2.160.65` 到 `5.2.160.66` 2. **关键参数**: - `-A INPUT`:追加规则到 `INPUT` 链(处理入站流量)。 - `-i eth1`:仅匹配从网卡 `eth1` 进入的流量。 - `-p udp`:协议为 UDP。 - `--dport 5060`:目标端口为 5060(常用于 SIP 协议)。 - `-m iprange --src-range`:匹配源 IP 范围。 - `-j ACCEPT`:允许匹配的流量。 --- ### **潜在问题与优化建议** #### 1. **规则冗余与维护性** - **问题**:多个分散的 IP 范围规则会增加管理复杂度,尤其是需要新增或删除 IP 时。 - **优化**: - 使用 **IP 集合(ipset)** 动态管理 IP 列表: ```bash ipset create sip_allow hash:ip ipset add sip_allow 5.2.15.9-5.2.15.10 ipset add sip_allow 5.2.15.57-5.2.15.58 ipset add sip_allow 5.2.160.65-5.2.160.66 iptables -A INPUT -i eth1 -p udp --dport 5060 -m set --match-set sip_allow src -j ACCEPT ``` - 优势:IP 集合可通过文件或脚本批量更新,无需修改 `iptables` 规则。 #### 2. **默认策略与安全性** - **问题**:如果默认策略是 `DROP`,需确保规则顺序正确(`iptables` 按顺序匹配)。 - **建议**: - 显式拒绝其他流量(放在规则末尾): ```bash iptables -A INPUT -i eth1 -p udp --dport 5060 -j DROP ``` - 或设置默认策略为 `DROP`,仅允许白名单: ```bash iptables -P INPUT DROP ``` #### 3. **日志记录与调试** - **建议**:添加日志规则以监控被拒绝的流量: ```bash iptables -A INPUT -i eth1 -p udp --dport 5060 -j LOG --log-prefix "UDP_5060_DENIED: " ``` - 查看日志: ```bash tail -f /var/log/kern.log | grep "UDP_5060_DENIED" ``` #### 4. **性能优化** - **问题**:`iprange` 模块在大量规则时可能影响性能。 - **优化**: - 合并连续的 IP 范围(如 `5.2.15.9-5.2.15.10` 和 `5.2.15.57-5.2.15.58` 无法合并,但可评估是否需要拆分)。 - 使用 `-m comment` 添加注释便于维护: ```bash iptables -A INPUT -i eth1 -p udp --dport 5060 -m iprange --src-range 5.2.15.9-5.2.15.10 -m comment --comment "Allow SIP Provider A" -j ACCEPT ``` #### 5. **持久化规则** - **问题**:重启后规则丢失。 - **解决**: - 保存规则到文件(根据发行版选择): ```bash iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu service iptables save # CentOS/RHEL ``` - 或使用 `netfilter-persistent`: ```bash apt install iptables-persistent # Debian/Ubuntu netfilter-persistent save ``` --- ### **完整优化示例** ```bash # 创建IP集合并添加允许的IP范围 ipset create sip_allow hash:ip ipset add sip_allow 5.2.15.9-5.2.15.10 ipset add sip_allow 5.2.15.57-5.2.15.58 ipset add sip_allow 5.2.160.65-5.2.160.66 # 应用iptables规则 iptables -F INPUT # 清空INPUT链(谨慎操作,确保有默认策略) iptables -A INPUT -i eth1 -p udp --dport 5060 -m set --match-set sip_allow src -j ACCEPT iptables -A INPUT -i eth1 -p udp --dport 5060 -j LOG --log-prefix "UDP_5060_DENIED: " iptables -A INPUT -i eth1 -p udp --dport 5060 -j DROP # 持久化规则 iptables-save > /etc/iptables/rules.v4 ``` --- ### **验证规则** 1. **查看规则**: ```bash iptables -L INPUT -nv --line-numbers ipset list sip_allow ``` 2. **测试连通性**: ```bash nc -uv 5.2.15.9 5060 # 从允许的IP测试 nc -uv 1.1.1.1 5060 # 从未允许的IP测试(应被拒绝) ``` --- ### **总结** - **当前规则**:明确允许特定 UDP 流量,但存在维护性和扩展性问题。 - **优化方向**: - 使用 `ipset` 简化 IP 管理。 - 添加日志和显式拒绝规则提升安全性。 - 持久化配置防止重启丢失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值