利用代理IP爬取Zillow房产数据用于数据分析
引言
最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题,使用代理IP来访问网站就是一种既简单又有效的解决方案。使用代理IP能够让访问网站的流量看起来是由多个用户发出,而不是来自同一用户,从而避免被网站识别为爬虫程序。今天就和大家分享如何使用代理IP爬取数据。
亮数据最佳商用代理IP网络服务商,极易配置,高级代理包括:机房代理、动态住宅、静态住宅ISP以及移动IP代理。https://www.bright.cn/proxy-types/?utm_source=brand&utm_campaign=brnd-mkt_cn_csdn_yingjie6&promo=yingjie6
亮数据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 python
import urllib.request
from lxml import etreeproxy = {'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 resdef 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 resultprint(parse_page(get_page(url)))
运行之后可以看到成功抓取到了数据。
总结
通过上面的实战,我们可以看到代理服务可以大大提高爬虫的匿名性和效率。亮数据家的代理可以满足这两点需求。
对开发者而言,亮数据代理以其简单易用的特性,大幅降低了技术门槛。 开发者可以快速上手,无需深入了解代理服务的底层技术细节,即可实现高效的数据抓取。这不仅加快了开发进程,也使得开发者能够将更多精力投入到数据分析和业务逻辑的构建上。
对于采购者,亮数据代理提供的价格实惠和套餐灵活,满足了不同规模和需求的采购预算。 用户可以根据自己的实际需求选择合适的套餐,无论是初创企业还是大型机构,都能找到符合自身预算的解决方案。
促销来啦
亮数据重磅推出“免费试用优惠”及“首次充值优惠”
1)即日起,注册新用户,可以获得2+5共7美金免费试用产品的机会。
2)新客户首次充值优惠,充多少送多少,最高500美金。
3)数据中心代理和静态代理,最近做了大幅的价格和收费模式的调整,颇具竞争力,有兴趣的可以上公司主页了解详情。以上充值赠送活动,针对数据中心和静态代理同样有效!
智能助手,一路随行
许多新手用户,刚开始接触亮数据的产品,对于代理及相关技术不熟悉,一时不知如何操作。我们的软件研发团队在产品里内嵌了ChatGPT,您可以直接以中文提出问题,获得相关的帮助。
您可以在初始登录界面的上方,找到这个可以输入文字的小框,开始用AI查询并获得帮助。
输入问题后,稍等片刻,就会弹出相应的帮助内容回答。这里我们以“如何选择代理服务”举例,可以看到系统处理后,自动弹出中英文双语的内容,并提供了相关的链接,供您进一步参考。
亮数据为此次内容提供额外优惠:现在体验,可以享受以上所有的价格优惠的同时,再送15美金特别试用金!
相关文章:

利用代理IP爬取Zillow房产数据用于数据分析
引言 最近数据分析的热度在编程社区不断攀升,有很多小伙伴都开始学习或从事数据采集相关的工作。然而,网站数据已经成为网站的核心资产,许多网站都会设置一系列很复杂的防范措施,阻止外部人员随意采集其数据。为了解决这个问题&a…...

大屏开源项目go-view二次开发1----环境搭建(C#)
最近公司要求做一个大屏的程序用于展示公司的产品,我以前也没有相关的经验,最糟糕的是公司没有UI设计的人员,领导就一句话要展示公司的产品,具体展示的内容细节也不知道,全凭借自己发挥。刚开始做时是用wpf做的&#x…...

【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现
开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升,外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统,它无缝整合了餐饮商户资源与广大消费者的…...

k8s中用filebeat文件如何收集不同service的日志
以下是一个详细的从在 Kubernetes 集群中部署 Filebeat,到实现按web-oper、web-api微服务分离日志并存储到不同索引的完整方案: 理解需求:按服务分离日志索引 在 Kubernetes 集群中,有web-oper和web-api两种微服务,希…...
Mysql数据库中,什么情况下设置了索引但无法使用?
在MySQL数据库中,即使已经正确设置了索引,但在某些情况下索引可能无法被使用。 以下是一些常见的情况: 1. 数据分布不均匀 当某个列的数据分布非常不均匀时,索引可能无法有效地过滤掉大部分的数据,导致索引失效。 …...

QT6学习第十一天 Qt Quick控件 Control
QT6学习第十一天 Qt Quick控件控件基类 Control按钮类控件指示器类控件输入类控件日期类控件 Qt Quick控件 Qt Quick本身是为了移动触摸界面而生的,但Qt的跨平台性也决定了它需要支持多种系统。为了支持桌面平台开发,从Qt 5.1开始,增加了新的…...
【唐叔学算法】第16天:枚举-探索所有可能性的艺术
大家好,我是唐叔。今天我们要探讨的是一个看似简单却非常实用的概念——枚举(Enumeration)。它不仅仅是一种数据类型,在算法设计中也是一种解决问题的策略。通过系统地遍历所有可能的情况,我们可以找到满足特定条件的答…...

【OpenCV】基于GrabCut算法的交互式前景提取
介绍 GrabCut 算法是一种用于图像分割的交互式前景提取技术,它结合了图割(Graph Cut)方法和迭代优化过程。该算法最初由 Rother, Kolmogorov 和 Blake 在 2004 年提出,并因其高效性和准确性而被广泛应用于计算机视觉领域。OpenCV…...

【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)
文章目录 前言环境准备安装必要的库 生成OpenAI API代码实现详解导入必要的模块创建Flask应用实例配置OpenAI API完整代码如下(demo源码)代码解析 利用Postman调用接口 了解更多AI内容结尾 前言 Flask作为一个轻量级的Python Web框架,凭借其…...

最短路----Dijkstra算法详解
简介 迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格迪科斯彻(Edsger Dijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉…...

ORB-SLAM3源码学习:G2oTypes.cc: void EdgeInertial::computeError 计算预积分残差
前言 这部分函数涉及了g2o的内容以及IMU相关的推导内容,需要你先去进行这部分的学习。 1.函数声明 void EdgeInertial::computeError() 2.函数定义 涉及到的IMU的公式: {// TODO Maybe Reintegrate inertial measurments when difference between …...
Unity协程机制详解
Unity的协程(Coroutine)是一种异步编程的机制,允许在多个帧之间分割代码的执行,而不阻塞主线程。与传统的多线程不同,Unity的协程在主线程中运行,并不会开启新的线程。 什么是协程? 协程是一种…...
2024年【高压电工】最新解析及高压电工考试总结
高压电工考试是电力行业从业人员必须通过的资格考试之一,它不仅检验了考生对高压电技术的掌握程度,还考验了考生在实际操作中的安全意识和应急处理能力。为了帮助广大考生更好地备考,本文整理了10道2024年高压电工考试的最新解析及总结试题&a…...
OELOVE 6.0城市列表模板
研究了好久OELOVE6.0源码,一直想将城市列表给单独整出来,做地区排名,但是PHP程序都是加密的,非常难搞,做二开都是要命的处理不了,在这里有一个简单方法可以处理城市列表,并且可以自定义TDK&…...

如何将你的 Ruby 应用程序从 OpenSearch 迁移到 Elasticsearch
作者:来自 Elastic Fernando Briano 将 Ruby 代码库从 OpenSearch 客户端迁移到 Elasticsearch 客户端的指南。 OpenSearch Ruby 客户端是从 7.x 版 Elasticsearch Ruby 客户端分叉而来的,因此代码库相对相似。这意味着当将 Ruby 代码库从 OpenSearch 迁…...

day1数据结构,关键字,内存空间存储与动态分区,释放
小练习 在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成(两种排序方法࿰…...

1_linux系统网络性能如何优化——几种开源网络协议栈比较
之前合集《计算机网络从入门到放弃》第一阶段算是已经完成了。都是理论,没有实操,让“程序猿”很难受,操作性不如 Modbus发送的报文何时等到应答和 tcp通信测试报告单1——connect和send。开始是想看linux内核网络协议栈的源码,然…...

【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功
项目场景: 使用MAC电脑,以子账号(非root)的形式登录,连接堡垒机CLB(传统型负载均衡),使用FileZilla(SFTP)进行FTP文件传输。 问题描述: MAC电脑…...

前端报错npm ERR cb() never called问题
环境使用node版本v14.21.3,npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…...

康谋方案 | 多源相机数据采集与算法集成测试方案
目录 一、相机组成 二、多源相机采集与测试方案 三、应用案例分享 四、结语 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进…...
从零开始制作小程序简单概述
以下是结合案例的“从零制作小红书风格小程序”的全流程指南,采用小红书爆款笔记的结构呈现,并附CSDN参考资源👇: 一、核心开发步骤(附工具推荐) 账号与定位 ✅ 注册类型选择:个人店(…...

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法
目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection 步骤3:DoIP模块为Gateway新增LA/TA/SA 步骤4:PDUR模…...

基于51单片机的红外防盗及万年历仿真
目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能: (1)实时显示年、月、日、时、分、秒、星期信息; (2)红外传感器(仿真中用按键模拟)检测是否有…...

机器学习基础相关问题
机器学习相关的基础问题 K-means是否一定会收敛 K-means是否一定会收敛 K-means算法在有限步数内一定会收敛,但收敛到的可能是局部最优解而非全局最优解。以下是详细分析: K-means 的优化目标是最小化 样本到其所归属簇中心的距离平方和(SSE…...

嵌入式SDK技术EasyRTC音视频实时通话助力即时通信社交/教育等多场景创新应用
一、引言 在数字化时代,即时通信已成为人们生活和工作中不可或缺的部分。音视频功能作为即时通信的核心,能实现更加直观、高效的信息传递。EasyRTC作为一款强大的实时通信框架,具备诸多优势,为即时通信的音视频应用提供了优质解…...

1-3 Linux-虚拟机(2025.6.7学习篇- mac版本)
1、VMware Fusion下载 在windows系统中使用的VMwareWorkStation未提供Mac版,Mac系统可以使用VMwareFusionPro FusionPro和WorkstationPro均是VMware公司出品,完全兼容,体验基本是一致的。 下载地址:https://www.vmware.com/cn/pro…...

【优选算法】C++滑动窗口
1、长度最小的子数组 思路: class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口// 1.left0,right0// 2.进窗口( nums[right])// 3.判断// 出窗口// (4.更新结果)// 总和大于等于 target 的长度最小的 子数组…...

使用MinIO搭建自己的分布式文件存储
目录 引言: 一.什么是 MinIO ? 二.MinIO 的安装与部署: 三.Spring Cloud 集成 MinIO: 1.前提准备: (1)安装依赖: (2)配置MinIO连接: &…...

调用.net DLL让CANoe自动识别串口号
1.前言 CANoe9.0用CAPL控制数控电源_canoe读取程控电源电流值-CSDN博客 之前做CAPL通过串口控制数控电源,存在一个缺点:更换电脑需要改串口号 CSDN上有类似的博客,不过要收费,本文根据VID和PID来自动获取串口号,代码…...
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
对于工作一般都设置在内网网段中,而同时由于需求需要连接外网,一般只能通过内网和外网的不断切换进行设置,如果可以同时连接内网和外网会更加便利,同时连接内网和外网方法具体如下。 一、电脑怎么弄可以同时连接内网和外网&#…...