
搞图片抓取总被封IP?试试这招灵的很!
搞网络爬虫的兄弟都懂,批量下图片最头疼的就是IP被封。上午还跑得好好的脚本,下午就给你来个403 Forbidden,这时候就得掏出代理IP这个保命符了。今天咱们就用Python搞个带防护盾的图片下载器,用ipipgo的代理服务来保驾护航。
为什么不用代理IP就凉凉?
网站防爬虫主要看三点:请求频率、IP轨迹、用户特征。普通爬虫用固定IP狂发请求,就像同一个人每分钟砸100次门,保安不封你封谁?用代理IP相当于每次换不同马甲敲门,保安根本认不出来。
代理IP的核心配置示例
proxies = {
'http': 'http://用户名:密码@gateway.ipipgo.com:9020',
'https': 'http://用户名:密码@gateway.ipipgo.com:9020'
}
手把手搭环境
先装这几个必备库(记得用清华源装更快):
pip install requests pillow retrying -i https://pypi.tuna.tsinghua.edu.cn/simple
重点说下ipipgo的配置门道:在他们家后台拿到API提取链接,建议选长效静态IP套餐,这种IP存活时间长,特别适合需要连续工作的爬虫任务。
代码这样写才抗封
直接上硬菜,看这个带三重防护的代码:
from retrying import retry
import requests
from urllib.parse import urlparse
def download_img(url, save_path):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
从ipipgo接口动态获取代理IP
proxy = requests.get("https://ipipgo.com/fetchproxy?type=json").json()
@retry(stop_max_attempt_number=3)
def _download():
resp = requests.get(url, headers=headers,
proxies={"http": proxy['proxy']},
timeout=15)
resp.raise_for_status()
with open(save_path, 'wb') as f:
f.write(resp.content)
try:
_download()
except Exception as e:
print(f"下载失败:{str(e)},正在更换ipipgo的IP...")
return False
return True
老司机QA时间
Q:代理IP突然不能用咋整?
A:ipipgo家的IP池有5秒自动切换机制,在代码里加个重试循环就行。要是遇到死IP,他们家后台还能手动刷新节点。
Q:怎么知道代理有没有生效?
A:在代码里加个检测逻辑,下载前先访问http://ip.ipipgo.com/checkip,看看返回的IP是不是代理IP。
Q:要开多线程下载怎么办?
A:ipipgo的企业版套餐支持同时500个IP并发,每个线程配独立代理,记得把超时时间设到30秒以上。
避坑指南表格
| 坑点 | 解决办法 |
|---|---|
| IP被封太快 | 在ipipgo后台调高IP更换频率 |
| 图片加载不全 | 加上selenium渲染后再下载 |
| 被网站人机验证 | 开启ipipgo的机房IP过滤功能 |
说点大实话
别信那些免费代理,速度慢不说,搞不好还夹带木马。ipipgo我用了大半年,最大的好处是IP归属地能自选,要抓哪个地区的图片就选哪的节点。最近他们搞活动,新用户送10G流量,注册时填优惠码IMG2024还能多送5G,够下几万张图了。
最后唠叨一句:别把延迟设太低!有些网站故意拖慢响应速度,设10秒以下的超时就容易误判。用ipipgo的话,建议把超时时间放到15-20秒,成功率能涨三成。

