
Python HTML采集基础
用Python抓网页数据是很多人的刚需,但直接上手容易遇到IP被封的麻烦。比如你连续访问某个网站,对方服务器会发现这个IP行为异常,轻则限制访问,重则直接封禁。这时候就需要代理IP来帮忙——它相当于一个中间人,帮你转发请求,隐藏真实IP。
Python里最常用的抓数据库是demandess'adapterBeautifulSoup解析HTML。下面是个最简单的例子:
import requests
from bs4 import BeautifulSoup
url = 'http://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.title.text)
这个代码能跑通,但很脆弱。如果目标网站有反爬机制,可能几分钟后你的IP就被限了。接下来我们看怎么用代理IP让采集更稳定。
代理IP为什么能解决封IP问题
简单说,代理IP就是让别人替你发送请求。比如你要访问A网站,不是直接连过去,而是先连到代理服务器,再由代理服务器去访问A。这样A网站看到的是代理服务器的IP,不是你本机的IP。
用好代理IP有两个关键点:
- Rotation de la période d'enquête:每次请求用不同的IP,避免单一IP频繁访问
- Qualité de la propriété intellectuelle:尽量用住宅IP,因为数据中心IP容易被识别
比如你每分钟抓10次数据,如果用10个不同的代理IP轮着用,每个IP每分钟只访问1次,看起来就像正常用户行为了。
实战:给Python代码加上代理IP
给requests加上代理很简单,只需要在get或post方法里传入proxies参数:
import requests
proxies = {
'http': 'http://用户名:密码@代理服务器IP:端口',
'https': 'https://用户名:密码@代理服务器IP:端口'
}
response = requests.get('http://example.com', proxies=proxies)
实际项目中,你可能需要管理多个代理IP。下面是个更实用的例子,实现自动轮换IP:
import requests
import random
假设你有一组代理IP
proxy_list = [
'http://user1:pass1@ip1:port1',
'http://user2:pass2@ip2:port2',
'http://user3:pass3@ip3:port3'
]
def get_with_proxy(url):
proxy = random.choice(proxy_list)
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(url, proxies=proxies, timeout=10)
return response
except:
print(f"代理 {proxy} 失败,尝试下一个")
return None
使用示例
response = get_with_proxy('http://example.com')
if response:
print("采集成功")
选择靠谱的代理IP服务:为什么推荐ipipgo
自己维护代理IP池很麻烦,IP来源不稳定,速度也没保障。专业的事交给专业的服务商更省心。这里推荐ipipgo,它在这方面有几个明显优势:
Des ressources IP riches:ipipgo的动态住宅代理IP总量超过9000万,覆盖220多个国家和地区。这意味着你基本不用担心IP不够用的问题,特别是需要大量采集的时候。
IP质量高:所有IP都来自真实家庭网络,比数据中心IP更难被识别和封锁。对于需要长期稳定采集的项目,ipipgo还提供静态住宅代理,50万+纯净住宅IP,99.9%的可用性保证业务不中断。
Facturation flexible:按流量计费很合理,用多少算多少。支持轮换和粘性会话两种模式,可以根据业务需要选择。比如采集需要保持登录状态的网站时,用粘性会话就很合适。
具体到套餐,ipipgo提供动态住宅(标准)和动态住宅(企业)两种选择,满足不同规模的需求。小项目用标准版就够了,企业级大规模采集可以用企业版,稳定性更有保障。
完整案例:用ipipgo代理采集网站数据
假设我们要采集某个网站的商品信息,下面是结合ipipgo的完整代码:
import requests
from bs4 import BeautifulSoup
import time
import random
ipipgo代理配置(以动态住宅代理为例)
IPIPGO_PROXY = "http://你的用户名:你的密码@gateway.ipipgo.com:端口"
def scrape_with_ipipgo(url):
proxies = {
'http': IPIPGO_PROXY,
'https': IPIPGO_PROXY
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, proxies=proxies, headers=headers, timeout=15)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
这里根据实际网页结构解析数据
items = soup.find_all('div', class_='product-item')
data = []
for item in items:
name = item.find('h3').text.strip()
price = item.find('.price').text.strip()
data.append({'name': name, 'price': price})
return data
else:
print(f"请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"采集出错:{e}")
return None
使用示例
if __name__ == "__main__":
urls = [
'http://target-site.com/page1',
'http://target-site.com/page2',
'http://target-site.com/page3'
]
for url in urls:
data = scrape_with_ipipgo(url)
if data:
print(f"成功采集 {len(data)} 条数据")
time.sleep(random.uniform(1, 3)) 随机延时,模拟人工操作
这个例子展示了几个重要技巧:添加随机User-Agent、设置合理的超时时间、在请求间加入随机延时。配合ipipgo的优质代理IP,能大幅降低被反爬的风险。
Foire aux questions QA
Q : Pourquoi suis-je toujours bloqué même si j'utilise une adresse IP proxy ?
A:可能原因有几个:代理IP质量不行(比如透明代理)、请求频率太高、没有模拟正常浏览器行为。建议检查代理类型(要用高匿代理),并加入随机延时和更换User-Agent。
Q:动态住宅和静态住宅代理有什么区别?
A:动态IP每次请求都可能变化,适合大规模采集;静态IP在一定时间内固定不变,适合需要维持会话的场景。ipipgo两种都提供,可以根据业务需要选择。
Q : Que dois-je faire si je rencontre un CAPTCHA lors de la collecte ?
A:首先尝试降低采集频率,模拟人类操作节奏。如果还不行,可以考虑使用打码服务,或者换用ipipgo的更高品质IP,因为住宅IP触发验证码的概率相对较低。
Q : Comment vérifier si l'adresse IP du proxy est valide ?
A:可以用这个简单方法测试:
def test_proxy(proxy):
try:
response = requests.get('http://httpbin.org/ip',
proxies={'http': proxy, 'https': proxy},
timeout=10)
return response.json()['origin'] in proxy
except:
return False
résumés
Python HTML采集本身不难,难点在于如何稳定持续地跑下去。代理IP是解决这个问题的关键工具,而选择像ipipgo这样靠谱的服务商能省去很多麻烦。记住几个要点:用高匿住宅IP、控制请求频率、模拟人类行为、做好异常处理。这样你的采集项目才能长期稳定运行。

