家人们!随着跨境电商的发展,是不是越来越多的小伙伴们也开始搞海外的数据分析了?不过虽然我们已经整天爬虫、数据采集打交道了,但一到海外数据,还是有不少人掉进坑里。你们是不是也遇到过以下情况:花了一堆时间结果被网站拦截、IP被封、爬虫跑几次就挂掉……海外数据采集分析起来远没有那么轻松简单。别慌,今天就手把手教你用海外代理IP高效爬取 Zillow 房产数据,看完保准能上手!

大家都知道,像 Zillow 这样的热门房产网站,用户流量巨大,页面访问保护肯定是非常严密的。使用本地ip多爬2下,分分钟弹窗“您可能是机器人,请验证”,或者直接就刷新不出来了……
为啥呢?原因很简单:
1.你用的是本地ip;
2.你的访问都来自相同的IP地址,网站已经识别到“这段流量可能异常”。
海外代理IP具体使用哪家就个花入各眼了。这part今天不是我们的重点,感兴趣的可以评论一下,我们后续再来说这部分。
ok,接下来还是围绕我们今天的主题,如何用海外代理爬 Zillow 房产数据。
在开始爬虫之前,我们需要以下工具和环境:
Python 编程环境:Python 3,搭配基础包 requests 和 lxml。

以德国房屋租赁的搜索页面为例,想把这类页面上的房源信息“抓下来”,我们需要做以下几个步骤:



<address> 标签内;property-card-price 的 <span> 标签中;<a> 标签的 href 属性;<ul> 标签的 <li> 子标签中。这时候我们就可以确定爬取数据的路径了,比如价格的 Xpath 是:
//span[@class="property-card-price"]/text()
同理,其他数据的路径定义了提取的精准方向。
我们用 Python 搭建一个基于代理IP的爬虫程序,分三步走。
要让请求从代理IP发出,我们可以用青果生成的API信息,加载到代码中:
import requests
# 功能:发送青果网络海外代理IP的请求
def get_proxy():
proxy_url = "https://overseas.proxy.qg.net/get?key=yourkey&num=1&area=&isp=&format=txt&seq=\r\n&distinct=false" # 青果网络海外代理IP API地址"
# 请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0",
}
# 目标网址
url = 'https://www.zillow.com/Germany/'使用代理IP发起网页请求,并抓取返回的HTML源码:
def get_page(target_url):
try:
response = requests.get(target_url, proxies=proxy, headers=headers)
response.raise_for_status() # 检查是否返回错误
return response.text
except requests.RequestException as e:
print(f"请求失败:{e}")
return None有效数据藏在HTML的某些标签中,我们用 lxml.etree 解析,然后逐步提取。
from lxml import etree
def parse_page(html):
root = etree.HTML(html)
results = []
# 定位每条房源的 `<li>` 标签
houses = root.xpath('//li[contains(@class, "ListItem")]')
for house in houses:
try:
link = house.xpath('.//a[@class="property-card-link"]/@href')[0]
address = house.xpath('.//address/text()')[0]
price = house.xpath('.//span[@data-test="property-card-price"]/text()')[0]
details = ', '.join(house.xpath('.//ul/li/text()')) # 拼接房型等信息
results.append({
"link": link,
"address": address,
"price": price,
"details": details
})
except IndexError:
continue
return results最终,我们把这些步骤连起来,获取采集结果:
if __name__ == "__main__":
html = get_page(url)
if html:
data = parse_page(html)
for item in data:
print(item)运行后结果如:
{'link': '/homedetails/123-Main-St/1410000_zpid/',
'address': '123 Main St, New York, NY',
'price': '$2,500/month',
'details': '2 Beds, 1 Bath, 1200 sqft'}
... import csv
# ... 前面爬取和解析得到 property_list ...
# 存成CSV文件
filename = "zillow_ny_properties.csv"
with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile: # utf-8-sig 防止中文乱码
fieldnames = ['address', 'price', 'link', 'details', 'beds', 'baths', 'sqft'] # 定义列名
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader() # 写入标题行
for prop in property_list:
# 假设你在解析时已经把户型拆分成 beds, baths, sqft 了
writer.writerow(prop) # 写入一行数据
print(f"【数据已保存】: 共 {len(property_list)} 条记录到 {filename}")更高级点存数据库(比如SQLite)适合数据量大或者需要复杂查询的情况,稍微麻烦点,但更规范。
robots.txt: 不只是说Zillow,是看看自己的目标站点允许不允许爬虫爬你要的页面。虽然技术上能爬,但了解规则是基本要求。很多商业网站明确禁止爬取,自己权衡风险。time.sleep() 就是让你温柔点。别开多线程几百个请求同时轰炸人家服务器,你的海外IP池再大也扛不住被封。time.sleep(random.uniform(1, 5)))。data-testid),写好容错代码(if element exists),网站改版就更新选择器。robots.txt,别碰不能爬的。灵活调整策略,才能在数据的“战场”上立于不败之地好啦,从代理配置到代码落地全讲完了,剩下的就是动手实操啦~爬数据的时候遇到啥奇葩问题,再来一起探讨探讨!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。