来源
Tk教主 https://weibo.com/6827625527/Ong3JyBf4?
具体实现
原理在上面这位大佬的博客其实已经说的很清楚了
我们来看看具体如何使用python实现的
原文是使用curl实现的 其中一个关键的步骤是 指定–relsove将请求固定到 IP 地址
我们来问下chatgpt: curl中–resolve的参数 python中有实现吗
以下是她的回答:
curl
中的 --resolve
选项允许你将域名解析到特定的IP地址。这个功能在调试和测试环境中非常有用,因为你可以指定域名解析而不必修改系统的DNS设置。
在Python中,可以使用http.client
库来实现类似的功能。这需要手动创建一个自定义的HTTP连接对象,并且在连接时指定自定义的主机和端口。
示例:使用http.client
实现--resolve
假设你有以下curl
命令:
curl --resolve example.com:443:1.2.3.4 https://example.com
这意味着你希望将 example.com
解析为 1.2.3.4
,并通过 HTTPS 访问它。下面是如何在Python中实现这一点:
import http.client
import ssl
# 定义目标域名和IP地址
hostname = 'example.com'
resolved_ip = '1.2.3.4'
port = 443
# 创建SSL上下文
context = ssl.create_default_context()
# 创建HTTPS连接
conn = http.client.HTTPSConnection(resolved_ip, port, context=context)
# 设置自定义的主机头
headers = {
'Host': hostname
}
# 发送GET请求
conn.request("GET", "/", headers=headers)
# 获取响应
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode('utf-8'))
# 关闭连接
conn.close()
解释
- 创建SSL上下文: 使用
ssl.create_default_context()
来创建一个默认的SSL上下文。这个上下文将用于HTTPS连接。 - 创建HTTPS连接: 使用
http.client.HTTPSConnection
来创建一个HTTPS连接对象,并指定解析后的IP地址和端口。 - 设置自定义的主机头: 为了让服务器识别请求的域名,需要在请求头中设置
Host
字段为原始域名。 - 发送请求并获取响应: 使用
conn.request
发送GET请求,并使用conn.getresponse
获取服务器响应。
其他注意事项
-
SSL证书验证: 上述代码创建的SSL上下文默认会验证服务器的SSL证书。如果你在测试环境中使用自签名证书,可能需要禁用SSL验证。这可以通过
ssl._create_unverified_context()
来实现,但不建议在生产环境中使用这种方法。 -
错误处理: 实际应用中应该添加错误处理逻辑,以应对可能的网络异常和HTTP错误。
这种方法可以实现类似curl --resolve
的功能,允许你在Python中指定域名解析到特定的IP地址,并发送HTTP/HTTPS请求。
我们随机找到一个404的微博图片:
查看对应的请求并将其复制到postman, 生成对应的http.client代码如下:
import http.client
conn = http.client.HTTPSConnection("wx3.sinaimg.cn")
payload = ''
headers = {
'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'priority': 'u=1, i',
'referer': 'https://s.weibo.com/',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'image',
'sec-fetch-mode': 'no-cors',
'sec-fetch-site': 'cross-site',
'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'
}
conn.request("GET", "/mw690/81d97f6dgy1hrg7uvj4b6j20u03w6tsr.jpg", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
如何你不会将结果保存为图片继续问她:
我请求的是个图片如何将返回的结果保存
# 检查请求是否成功
if response.status_code == 200:
# 打开文件以写入二进制数据
with open('image.jpg', 'wb') as file:
for chunk in response.iter_content(1024):
file.write(chunk)
print("图片保存成功")
else:
print(f"请求失败,状态码: {response.status_code}")
获取CDN的resolve_ip
登录阿里云的拨测挂掉的图片链接 等待10s 导出结果为xlsx
我们这里要遍历表格里的所有ip, 接着问:如何使用python遍历excel中的某列
在Python中,遍历Excel文件中的某一列可以使用`pandas`库。以下是一个示例代码,展示如何读取Excel文件并遍历其中的一列。
首先,确保你已经安装了`pandas`库和`openpyxl`库:
```bash
pip install pandas openpyxl
```
然后,你可以使用以下代码来遍历Excel文件中的某一列:
```python
import pandas as pd
# 读取Excel文件
file_path = 'your_excel_file.xlsx'
sheet_name = 'Sheet1' # 替换为你的工作表名称
column_name = 'Column1' # 替换为你要遍历的列名
# 使用pandas读取Excel文件
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 遍历指定列
for value in df[column_name]:
print(value)
```
### 解释
1. **导入`pandas`库**:`pandas`是一个强大的数据处理库,`openpyxl`是一个用于读取Excel文件的引擎。
2. **读取Excel文件**:使用`pd.read_excel`函数读取Excel文件。你需要提供文件路径和工作表名称。
3. **遍历列**:通过`df[column_name]`可以获取指定列的数据,然后使用`for`循环遍历该列。
### 示例Excel文件
假设你的Excel文件`your_excel_file.xlsx`有一个工作表`Sheet1`,其中包含以下数据:
| Column1 | Column2 |
|---------|---------|
| A | 1 |
| B | 2 |
| C | 3 |
运行上述代码后,输出将是:
```
A
B
C
```
这样你就可以遍历Excel文件中的指定列了。如果你有任何其他问题或需要进一步的帮助,请告诉我!
最终将chatgpt和postman生成的代码结合如下:
import http.client
import ssl
import pandas as pd
# 读取Excel文件
file_path = '111.xlsx'
sheet_name = 'page1' # 替换为你的工作表名称
column_name = '解析结果IP' # 替换为你要遍历的列名
# 使用pandas读取Excel文件
df = pd.read_excel(file_path, sheet_name=sheet_name)
# 遍历指定列
for resolved_ip in df[column_name]:
# 定义目标域名和IP地址
hostname = 'wx3.sinaimg.cn'
port = 443
# "orj360",
path = '/mw690/81d97f6dgy1hrg7uvj4b6j20u03w6tsr.jpg'
# 创建SSL上下文
context = ssl._create_unverified_context()
# 创建HTTPS连接
conn = http.client.HTTPSConnection(resolved_ip, port, context=context)
# 设置自定义的主机头
headers = {
'Host': hostname,
'accept': 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'priority': 'u=1, i',
'referer': 'https://s.weibo.com/',
'sec-ch-ua': '"ndNot/A)Bra";v="8", "Chromium";v="126", "Microsoft Edge";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'image',
'sec-fetch-mode': 'no-cors',
'sec-fetch-site': 'cross-site',
'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'
}
# 发送GET请求
conn.request("GET", path, headers=headers)
# 获取响应
response = conn.getresponse()
# 检查请求是否成功
if response.status == 200:
# 打开文件以写入二进制数据
with open(f'{resolved_ip}404.jpg', 'wb') as file:
file.write(response.read())
print("图片保存成功")
break
else:
print(f"请求失败,状态码: {response.status}")
# 关闭连接
conn.close()