写点什么

利用代理 IP 爬取 Zillow 房产数据

作者:Yan-英杰
  • 2024-11-18
    安徽
  • 本文字数:3517 字

    阅读完需:约 12 分钟

引言

最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题,使用代理 IP 来访问网站就是一种既简单又有效的解决方案。使用代理 IP 能够让访问网站的流量看起来是由多个用户发出,而不是来自同一用户,从而避免被网站识别为爬虫程序。今天就和大家分享如何使用代理 IP 爬取数据。

亮数据​www.bright.cn/use-cases/ecommerce?utm_source=brand&utm_campaign=brnd-mkt_cn_bilibili_yingjie&promo=yingjie


亮数据 ISP 代理服务

目前市面上代理 IP 服务的厂家有很多,亮数据属于比较早开始做的一批。经过多年的技术积累,不论是 IP 质量、稳定性还有一些便捷工具上都有它独到之处。这次我们就选择它作为我们代理 IP 的服务平台。

注册并登录账号之后,点击无限数据中心就可以开始购买服务了。下方的抓取浏览器、网络解锁器和搜索引擎爬虫 SERP 是亮数据为用户设计的低代码爬虫工具,大家可以按需取用。

这里我们需要填写名称和 IP 数量,其他使用默认设置即可。这次由于我们采集的是境外网站,所以 IP 区域选择大陆以外提高访问成功率。

配置好之后即可在控制台找到购买的业务,这是也会弹出一个帮助,为我们提供了预设的 API 接口和一段预置的代码。

我们把它复制下来,方便后面编写爬虫。之后我们要到代理服务的设置中添加白名单,把我们本地的 IP 地址填进白名单中,就可以正常访问了。

最后我们使用生成的样例代码测试一下服务是否通畅。可以看到运行之后回显了代理 IP 的区域信息。

实战:爬取 Zillow 房屋租赁页面

Zillow 是一个美国的在线房地产信息平台,主要提供住宅买卖、租赁和投资信息。它包含了丰富的房数据和工具帮助用户了解市场、寻找合适的房源并做出明智的决策。首先我们先来观察一下目标网页。以纽约房价为例,我们搜索“new york”可以得到搜索结果。

我们本次的目标就在右边这个区域。按 F12 观察页面结构,可以看到所有搜索结果都是 result-list-container 的 div 中的一个列表中,每个<li>代表一个信息卡片。

展开<li>标签即可看到房源的地址和页面链接对应一个 address 标签和一个 a 标签。

而价格和户型则分别位于一个 property-card-price 的 span 和另一个 ul 列表中。

这里户型信息分散在 ul 的每个 li 中,要多次取出再拼接。顺便在网络中获得一些请求的头信息,等一下制作爬虫的时候会用到。

分析完页面,我们就可以开始制作爬虫了。我们主要分两个阶段执行,首先下载网页,然后使用 xpath 提取出目标数据。我们这次的任务目标是房源的地址、价钱、页面链接和户型信息。

首先我们配置一些全局参数。包括亮数据平台的 API 接口,前面我们拿到的请求头,目标 URL。

proxy = {'http': 'http://brd-customer-hl_a0a48734-zone-zillow:1ps57ihiyeg1@brd.superproxy.io:22225',         'https': 'http://brd-customer-hl_a0a48734-zone-zillow:1ps57ihiyeg1@brd.superproxy.io:22225'}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'}url = 'http://www.zillow.com/new-york-ny/'
复制代码


之后我们通过 get_page()函数发送请求并获取页面内容。首先构建一个 opener 并将代理信息包含进去。之后通过这个 opener 和前面定义的请求头发送请求,将响应结果转换为文本并返回。

def get_page(target_url):    opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxy))    req = urllib.request.Request(target_url, headers=headers)    res = opener.open(req).read()    return res
复制代码

之后通过 parse_page()函数解析 HTML 并提取数据。首先将网页 HTML 字符串解析为一个 lxml 的 Element 对象。然后使用 XPath 查找所有<li>标签,这些标签即为每个房产的信息卡片。接下来在每个<li>中分别提取:每个房产的链接,路径为/article//a[@class="property-card-link"]/@href;房产地址,路径为/article//a[@class="property-card-link"]/address/text();房产价格,路径为/article//span[@data-test="property-card-price"]/text();房产的详细信息,包括房间数、面积等,路径为/article//div[@class="property-card-data"]/div[2]/ul/li。最后将提取的数据被放入 result 列表中,并返回。

def parse_page(html):    root = etree.HTML(html)    lis = root.xpath('//div[@class="search-page-list-header"]/ul/li')    result = []    for li in lis:        link = li.xpath('/article//a[@class="property-card-link"]/@href')[0]        address = li.xpath('/article//a[@class="property-card-link"]/address/text()')[0]        price = li.xpath('/article//span[@data-test="property-card-price"]/text()')[0]        details = li.xpath('/article//div[@class="property-card-data"]/div[2]/ul/li')        detail = ""        for d in details:            detail += d.xpath('/b/text()')[0] + ';'        result.append({"link": link, "address": address, "price": price, "detail": detail})    return result
复制代码

最后调用这两个函数获取结果。完整代码如下:


#!/usr/bin/env pythonimport urllib.requestfrom lxml import etree proxy = {'http': 'http://brd-customer-hl_a0a48734-zone-zillow:1ps57ihiyeg1@brd.superproxy.io:22225',         'https': 'http://brd-customer-hl_a0a48734-zone-zillow:1ps57ihiyeg1@brd.superproxy.io:22225'}headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0'}url = 'http://www.zillow.com/new-york-ny/'  def get_page(target_url):    opener = urllib.request.build_opener(urllib.request.ProxyHandler(proxy))    req = urllib.request.Request(target_url, headers=headers)    res = opener.open(req).read()    print(res)    return res  def parse_page(html):    root = etree.HTML(html)    lis = root.xpath('//div[@class="search-page-list-header"]/ul/li')    result = []    for li in lis:        link = li.xpath('/article//a[@class="property-card-link"]/@href')[0]        address = li.xpath('/article//a[@class="property-card-link"]/address/text()')[0]        price = li.xpath('/article//span[@data-test="property-card-price"]/text()')[0]        details = li.xpath('/article//div[@class="property-card-data"]/div[2]/ul/li')        detail = ""        for d in details:            detail += d.xpath('/b/text()')[0] + ';'        result.append({"link": link, "address": address, "price": price, "detail": detail})    return result  print(parse_page(get_page(url)))
复制代码

运行之后可以看到成功抓取到了数据。

总结

通过上面的实战,我们可以看到代理服务可以大大提高爬虫的匿名性和效率。亮数据家的代理可以满足这两点需求。

对开发者而言,亮数据代理以其简单易用的特性,大幅降低了技术门槛。 开发者可以快速上手,无需深入了解代理服务的底层技术细节,即可实现高效的数据抓取。这不仅加快了开发进程,也使得开发者能够将更多精力投入到数据分析和业务逻辑的构建上。

对于采购者,亮数据代理提供的价格实惠和套餐灵活,满足了不同规模和需求的采购预算。 用户可以根据自己的实际需求选择合适的套餐,无论是初创企业还是大型机构,都能找到符合自身预算的解决方案。

促销来啦

亮数据重磅推出“免费试用优惠”及“首次充值优惠”

1)即日起,注册新用户,可以获得 2+5 共 7 美金免费试用产品的机会。

2)新客户首次充值优惠,充多少送多少,最高 500 美金。

3)数据中心代理和静态代理,最近做了大幅的价格和收费模式的调整,颇具竞争力,有兴趣的可以上公司主页了解详情。以上充值赠送活动,针对数据中心和静态代理同样有效!

智能助手,一路随行

许多新手用户,刚开始接触亮数据的产品,对于代理及相关技术不熟悉,一时不知如何操作。我们的软件研发团队在产品里内嵌了 ChatGPT,您可以直接以中文提出问题,获得相关的帮助。

您可以在初始登录界面的上方,找到这个可以输入文字的小框,开始用 AI 查询并获得帮助。

输入问题后,稍等片刻,就会弹出相应的帮助内容回答。这里我们以“如何选择代理服务”举例,可以看到系统处理后,自动弹出中英文双语的内容,并提供了相关的链接,供您进一步参考。

亮数据为此次内容提供额外优惠:现在体验,可以享受以上所有的价格优惠的同时,再送 15 美金特别试用金!

用户头像

Yan-英杰

关注

还未添加个人签名 2023-09-01 加入

还未添加个人简介

评论

发布
暂无评论
利用代理IP爬取Zillow房产数据_Python_Yan-英杰_InfoQ写作社区