当前位置: 首页 > news >正文

网络爬虫设置代理服务器

      

目录

1.获取代理 IP

2.设置代理 IP

3. 检测代理 IP 的有效性

4. 处理异常


         如果希望在网络爬虫程序中使用代理服务器,就需要为网络爬虫程序设置代理服务器。
设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来,分别对获取代理 IP 和设
置代理 IP 进行详细介绍。

1.获取代理 IP

        代理 IP 主要有 3 种获取方式,它们分别是获取免费代理 IP 、获取付费代理 IP ADSL
拨号,关于它们的介绍如下。
        (1 )获取免费代理 IP 。免费代理 IP 基本没有成本,可以从免费代理网站(如快代理、全
网代理 IP 等)上找一些免费代理 IP ,测试可用后便可以收集起来备用,但使用这种方式获取
的可用代理 IP 相对较少。
        (2 )获取付费代理 IP 。互联网上存在许多代理商,用户付费后便可以获得一些高质量的
代理 IP
        (3 ADSL 拨号。 ADSL Asymmetric Digital Subscriber Line ,非对称数字用户线路)通
过拨号的方式上网,需要输入 ADSL 账号和密码。每次拨号都会更换一个新的 IP 地址,不过
ADSL 拨号操作起来比较麻烦。每切换一次 IP 地址,都要重新拨号。重拨期间还会处于短暂
断网的状态。
        综上所述,免费代理 IP 是比较容易获取的,不过这类代理 IP 的质量不高,高度匿名代理
IP 比较少,有的代理 IP 很快会失效。如果大家对代理 IP 的质量要求比较高,或者需要大量
稳定的代理 IP ,那么建议选择一些正规的代理商进行购买。

2.设置代理 IP

        在 Requests 中,设置代理 IP 的方式非常简单:只需要在调用请求函数时为 proxies 参数
传入一个字典。该字典包含了所需要的代理 IP ,其中字典的键为代理类型(如 http https ),
字典的值为“代理类型 ://IP 地址 : 端口号”格式的字符串。例如,定义一个包含两个代理 IP
字典,代码如下。
proxies = { 'http': 'http://127.0.0.1:8070', 'https': 'https://10.10.1.10:1080', 
}
        接下来,通过一个例子演示如何从 IP 地址列表中随机选择一个 IP 地址,将该 IP 地址设
置为代理 IP ,之后基于该代理 IP 请求小兔鲜儿网首页,具体代码如下。
import requests 
import random 
# 代理 IP 地址的列表
proxy_list = [ {"http" : "http://101.200.127.149:3129"}, {"http" : "http://59.55.162.4:3256"}, {"http" : "http://180.122.147.76:3000"}, {"http" : "http://114.230.107.102:3256"}, {"http" : "http://121.230.211.163:3256"} 
] 
base_url = 'http://erabbit.itheima.net/#/' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 'AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/90.0.4430.212 Safari/537.36'} 
# 发送 GET 请求,将 proxy_list 中任意一个 IP 地址设为代理
response = requests.get(base_url, headers=header, proxies= random.choice(proxy_list)) 
print(response.status_code)

        header请求头字段可以在网页按F12键,上方找到网络标识,然后点击下方有一个名称点进去,右边窗口下面就有User-Agent字段。

 

 

        上述代码中,首先创建了包含 5 IP 地址的列表 proxy_list ,定义了代表小兔鲜儿网首页
URL 的变量 base_url ,定义了表示请求头的变量 header ;然后调用 get() 函数根据 base_url 请求
小兔鲜儿网首页,同时指定该请求的请求头为 header 且代理 IP proxy_list 中的任意一个 IP
地址,以防止服务器识别出网络爬虫的身份而被禁止访问,并将服务器返回的响应赋值给变
response ;最后访问 response status_code 属性获取响应状态码。
运行代码,输出如下结果。
 200
        从输出结果可以看出,程序成功访问了小兔鲜儿网首页。
需要说明的是,上述程序中使用的代理 IP 是免费的。由于使用时间不固定,这些代理 IP
一旦超出使用时间范围就会失效,此时再运行上述程序则会出现 ProxyError 异常,所以我们
在这里建议大家换用自己查找的代理 IP

3. 检测代理 IP 的有效性

        互联网上有很多免费的代理 IP ,但这些 IP 地址并不都是有效的。因此需要对获取的免费
IP 地址进行检测,确定 IP 地址是否有效。检测代理 IP 有效性的过程比较简单,需要先遍历
收集的所有代理 IP ,将获取的每个代理 IP 依次设为代理,再通过该 IP 地址向网站发送请求。
如果请求成功,则说明该 IP 地址是有效的;如果请求失败,则说明该 IP 地址是无效的,需要
被剔除。
        下面以 3.4.2 节的代理 IP 为例,为大家演示如何检测代理 IP 的有效性,具体代码如下

 

import requests 
proxy_list = [ {"http" : "http://101.200.127.149:3129"}, {"http" : "http://59.55.162.4:3256"}, {"http" : "http://180.122.147.76:3000"}, {"http" : "http://114.230.107.102:3256"}, {"http" : "http://121.230.211.163:3256"} 
] 
base_url = 'http://erabbit.itheima.net/#/' 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64' 'AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/90.0.4430.212 Safari/537.36'} 
# 遍历代理 IP 
for per_ip in proxy_list.copy(): try: # 发送 GET 请求,将获取的每个 IP 地址设置为代理response = requests.get(base_url, headers=header, proxies=per_ip, timeout=3) except: # 失败则输出 IP 地址无效,并将该 IP 地址从 proxy_list 列表中移除print(f'IP 地址:{per_ip.get("http")}无效') proxy_list.remove(per_ip) else: # 成功则输出 IP 地址有效print(f'IP 地址:{per_ip.get("http")}有效')
        上述加粗部分的代码中,首先从 proxy_list 列表的副本遍历了每个 IP 地址 per_ip ;然后在 try
子句中调用 get() 函数发送了一个 GET 请求,并在发送该请求时将 per_ip 依次设置为代理,由代
理服务器代替程序向服务器转发请求;接着在 except 子句中处理了请求失败的情况,输出“ IP
地址: ××× 无效”,并将该 IP 地址从 proxy_list 列表中移除,确保 proxy_list 列表中只保留有效
IP 地址;最后在 else 子句中处理了请求成功的情况,输出“ IP 地址: ××× 有效”。
运行代码,输出如下结果。
IP 地址:http://101.200.127.149:3129 有效
IP 地址:http://59.55.162.4:3256 无效
IP 地址:http://180.122.147.76:3000 无效
IP 地址:http://114.230.107.102:3256 无效
IP 地址:http://121.230.211.163:3256 有效
        从输出结果可以看出,这 5 个代理 IP 中有两个是有效的,其余 3 个都是无效的。

4. 处理异常

        每个程序在运行过程中可能会遇到各种各样的问题,网络爬虫自然也不例外。
        访问网站离不开网络的支撑。由于网络环境十分复杂,具有一定的不可控性,所以网络爬虫
每次访问网站后不一定能够成功地获得从服务器返回的数据。网络爬虫一旦在访问过程中遇
到一些网络问题(如 DNS 故障、拒绝连接等),就会导致程序引发异常并停止运行。
requests.exceptions 模块中定义了很多异常类型,常见的异常类型如表 3-2 所示。

         表 3-2 中罗列了一些常见的异常类型。其中,Timeout 继承自 RequestExceptionConnect Timeout 和 ReadTimeout 继承自 Timeout。 为保证程序能够正常终止,我们可以使用 try-except 语句捕获相应的异常,并对异常进行 相应的处理。 由于谷歌网站服务器的原因,访问该网站必定会出现连接超时的问题。下面以访问谷歌 网站为例,为大家演示如何使用 try-except 语句捕获 RequestException 异常,具体代码如下。

1 import time 
2 import requests 
3 # 记录请求的发起时间
4 print(time.strftime('开始时间:%Y-%m-%d %H:%M:%S')) 
5 # 捕获 RequestException 异常
6 try: 
7 html_str = requests.get('http://www.google.com').text 
8 print('访问成功') 
9 except requests.exceptions.RequestException as error: 
10 print(error) 
11 # 记录请求的终止时间
12 print(time.strftime('结束时间:%Y-%m-%d %H:%M:%S'))
        上述代码中,第 4 行代码记录了发送请求之后的时间。第 6 10 行代码使用 try-except
句尝试捕获与处理 RequestException 异常。其中,第 6 8 行代码在 try 子句中调用 get() 函数
访问谷歌网站,并在访问成功后输出“访问成功”。第 9 10 行代码在 except 子句中指定了捕
获的异常类型为 RequestException 。程序监测到 try 子句中的代码抛出 RequestException 异常
时,会捕获 RequestException 和所有继承自 RequestException 的异常,并在捕获异常后输出详
细的异常信息。第 12 行代码记录了终止请求之后的时间。
运行代码,输出如下结果。
开始时间:2021-06-16 13:50:53 
HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: 
/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 
0x00000000034D6790>: Failed to establish a new connection: [WinError 10060] 由于连接方
在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。')) 
结束时间:2021-06-16 13:51:14
        通过对比结束时间与开始时间可知,我们等待了约 20 秒,这个时间相对来说有些长,这
种长时间的等待是没有任何意义的。
        为了减少无意义的等待,我们在发送 HTTP 请求时可以设置超时时长,即调用 get() 函数
时传入 timeout 参数,并给该参数指定代表超时时长的值。如果超过该时长,服务器仍然没有
返回任何响应内容,就让程序立即引发一个超时异常。在以上示例中,为请求设置超时时长
5 秒,具体代码如下。
# 发送 GET 请求,设置超时时长
html_str = requests.get('http://www.google.com', timeout=5).text

        再次运行代码,输出如下结果。 

开始时间:2021-06-16 14:30:01 
HTTPConnectionPool(host='www.google.com', port=80): Max retries exceeded with url: 
/ (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 
0x00000000033E23D0>, 'Connection to www.google.com timed out. (connect timeout=5)')) 
结束时间:2021-06-16 14:30:06
        通过对比结果中的结束时间和开始时间可知,程序执行了 5 秒后便直接结束,并抛出
ConnectTimeoutError 异常及提示信息“ Connection to www.google.com timed out ”。这说明连接
谷歌网站时超过了预设的等待时长而导致访问失败。

 

 

 

 

 

 

 

相关文章:

网络爬虫设置代理服务器

目录 1&#xff0e;获取代理 IP 2&#xff0e;设置代理 IP 3. 检测代理 IP 的有效性 4. 处理异常 如果希望在网络爬虫程序中使用代理服务器&#xff0c;就需要为网络爬虫程序设置代理服务器。 设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来&#xff0c;分…...

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…...

【gdb 如何生成并查看core dump】

生成core dump 使用ulimit命令来设置core dump文件的大小。 ulimit -c unlimitedcore dump位置 如果程序崩溃&#xff0c;系统会生成一个名为core的文件。可以通过以下命令查看core文件位置&#xff0c; cat /proc/sys/kernel/core_pattern查看core dump gdb /path/to/you…...

极简短视频查看、删除应用

本地短视频服务器 背景&#xff1a;我的NAS中存放了很多短视频&#xff0c;多到很多没看过&#xff0c;于是写了这个程序来随机查看并删除短视频 运行&#xff1a; 安装依赖后运行main.py 直接使用docker&#xff1a; docker pull realwang/short_video docker run -d -p 3000:…...

【秋招刷题打卡】Day01-自定义排序

Day01-自定排序 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;acwin…...

API低代码平台介绍6-数据库记录删除功能

数据库记录删除功能 在前续文章中我们介绍了如何插入和修改数据库记录&#xff0c;本篇文章会沿用之前的测试数据&#xff0c;介绍如何使用ADI平台定义一个删除目标数据库记录的接口&#xff0c;包括 单主键单表删除、复合主键单表删除、多表删除&#xff08;整合前两者&#x…...

计算机基础之:硬件系统的性能评估标准

服务器时钟的性能通常涉及多个方面&#xff0c;主要包括准确性、稳定性、以及对系统性能的影响。以下是一些关键指标和衡量方法&#xff1a; 准确性&#xff1a; 时间偏移&#xff1a;测量服务器时钟与一个可靠时间源&#xff08;如GPS时间、原子钟或NTP服务器&#xff09;之间…...

高互动UI设计揭秘:动画效果如何提升用户体验

动画&#xff0c;由于其酷的视觉冲击&#xff0c;往往会产生极好的用户体验。UI设计中的动态效果可以使用户界面看起来更酷&#xff0c;特别是界面的功能动画&#xff0c;是UX设计的重要组成部分&#xff0c;不容忽视。为什么UI设计的动态效果如此重要&#xff1f;接下来&#…...

探索Java异常处理的奥秘:源码解析与高级实践

1. 引言 在Java编程的广阔天地中,异常处理是确保程序健壮性、稳定性和可维护性的重要基石。对于Java工程师而言,深入理解Java异常处理的机制,并能够在实践中灵活运用,是迈向卓越的重要一步。 2. 基本概念 在Java中,异常(Exception)是程序执行期间出现的不正常或错误情况…...

深入了解python函数与函数内存使用

函数的定义 函数作为代码复用的基本单元&#xff0c;可以帮助我们组织代码、减少重复、提高可读性和可维护性。 在 Python 中&#xff0c;函数本质上是对象&#xff0c;可以赋值给变量、存储在数据结构中、作为参数传递和返回。 函数与内存 函数的加载和调用过程中&#xff…...

Java面试----MySQL面试题

1.索引有哪些优缺点&#xff1f; MySQL索引作为一种提升数据库查询效率的重要机制&#xff0c;具有以下主要优点和缺点&#xff1a; 优点&#xff1a; 提高查询速度&#xff1a; 索引能够显著加速数据的检索过程&#xff0c;类似于书籍的目录&#xff0c;让数据库引擎能够快速…...

python从入门到精通2:缩进

在Python中&#xff0c;缩进&#xff08;Indentation&#xff09;是一个非常重要的语法元素&#xff0c;它用于表示代码块的结构。与其他许多编程语言使用大括号 {} 来定义代码块不同&#xff0c;Python使用缩进来确定代码块的开始和结束。这种简洁的语法使得Python代码更加清晰…...

了解CDN:提升网络性能和安全性的利器

在当今的数字时代&#xff0c;网站性能和安全性是每一个网站管理员必须关注的核心问题。内容分发网络&#xff08;CDN&#xff0c;Content Delivery Network&#xff09;作为解决这一问题的重要工具&#xff0c;逐渐成为主流。本文将详细介绍CDN的定义、作用及其工作原理&#…...

ChatGPT的工作原理

ChatGPT的工作原理可以详细分为以下几个步骤&#xff0c;下面将结合相关信息进行清晰、详细的介绍&#xff1a; 数据收集&#xff1a; ChatGPT首先会从大量的文本数据中收集信息&#xff0c;这些数据可能包括网页、新闻、书籍等多样化的来源。它还会特别关注和分析网络上的热点…...

基于DPU的云原生裸金属服务快速部署及存储解决方案

1. 背景介绍 1.1. 业务背景 在云原生技术迅速发展的当下&#xff0c;容器技术因其轻量级、可移植性和快速部署的特性而成为应用部署的主流选择&#xff0c;但裸金属服务器依然有其独特的价值和应用场景&#xff0c;是云原生架构中不可或缺的一部分。 裸金属服务器是一种高级…...

论文学习_Large Language Models Based Fuzzing Techniques: A Survey

论文名称发表时间发表期刊期刊等级研究单位Large Language Models Based Fuzzing Techniques: A Survey 2024年arXiv-悉尼大学 0.摘要 研究背景在软件发挥举足轻重作用的现代社会,软件安全和漏洞分析对软件开发至关重要,模糊测试作为一种高效的软件测试方法,并广泛应用于各个…...

响应式德米拉数字内容交易系统素材下载站模板

★模板说明★ 该数字交易系统设计非常完美&#xff0c;两种响应式模式&#xff0c;可打开边栏模式和盒子模式&#xff1b;八种网站颜色&#xff0c;四种风格颜色可供用户自行选择&#xff0c;还可在网站选背景图片&#xff1b;完美的分成系统、充值功能、个人中心等等都以html…...

数据库开发-MySQL

前言 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音类的app…...

香港大带宽服务器高性能配置选择灵活

香港大带宽服务器是指在香港数据中心托管的&#xff0c;配备了高速网络连接的服务器。这些服务器通常用于需要大量数据传输和快速响应时间的应用&#xff0c;如视频流媒体、在线游戏、远程工作和大规模数据处理任务。具体分析如下&#xff0c;rak部落为您整理发布。 1. **内存配…...

Oracle中生僻汉字的解决办法

在Oracle数据库中处理生僻汉字时&#xff0c;主要面临的问题是某些字符集可能无法完全支持所有的汉字&#xff0c;特别是生僻字。以下是一些解决Oracle中生僻汉字问题的办法&#xff1a; 检查当前字符集&#xff1a; 使用SELECT USERENV(language) FROM dual;命令来查看当前数…...

在Kotlin中,`field`关键字是一个特殊的标识符,用于在属性的自定义getter和setter中访问backing field(存储属性值的实际字段)

在Kotlin中&#xff0c;field关键字是一个特殊的标识符&#xff0c;用于在属性的自定义getter和setter中访问backing field&#xff08;存储属性值的实际字段&#xff09;。Kotlin属性默认提供getter和setter方法&#xff0c;但当你需要自定义它们的行为时&#xff0c;可以使用…...

如何在 MySQL 中创建和使用事务?

目录 1. 环境准备 2. 创建事务 3. 事务执行 4. 事务撤消 5. 总结 事务是数据库区别于文件系统的重要特征之一&#xff0c;当我们有了事务就会让数据库始终保持一致&#xff0c;同时我们还能通过事务机制恢复到某个时间点&#xff0c;这样可以保证已提交到数据库的修改不会…...

Python数据分析-对驾驶安全数据进行了预测

一、研究背景和意义 随着汽车保有量的不断增加&#xff0c;交通事故已成为全球范围内的重大公共安全问题。每年因交通事故造成的人员伤亡和财产损失给社会带来了巨大的负担。为了提高驾驶安全&#xff0c;减少交通事故的发生&#xff0c;许多研究致力于探索影响驾驶安全的因素…...

全志 Android 11:实现响应全局按键

一、篇头 最近实现热键想功能&#xff0c;简单总结了下全志平台Android 11 的响应全局热键的方法。 二、需求 实现全局热键&#xff0c;响应F-、AF、F三个按键&#xff0c;AF只用于启动调焦界面&#xff0c;F-和F除了可以启动调焦界面外&#xff0c;还用于调整镜头的焦距&…...

DVWA 靶场 Open HTTP Redirect 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…...

Blender:渲染输出

一、渲染设置 渲染设置界面&#xff1a; 渲染器选择切换 Cycles渲染器 【文档】 Cycles渲染目标&#xff1a; Cycles是Blender用于产品级渲染&#xff0c;基于物理的路径跟踪器。主要关注于影视质量&#xff0c;更高质量的外观它旨在提供易于使用以及准确的物理渲染结果具有艺术…...

NTFS和exFAT哪个性能好 U盘格式化NTFS好还是exFAT好 mac不能读取移动硬盘怎么解决

文件系统的选择对存储设备的性能和兼容性有着重要影响。而NTFS和EXFAT作为两种常见的文件系统&#xff0c;它们各有特点&#xff0c;适用于不同的使用场景。我们将深入探讨NTFS和EXFAT的区别&#xff0c;帮助大家选择最适合自己需求的文件系统。 NTFS&#xff1a;稳定与性能的平…...

kafka的基本模型

kafka官网 线程和线程之间的数据交互 在jvm里不同的线程有自己的栈内存&#xff0c;但彼此之间交互可以在共享的内存中进行&#xff0c;即堆内存&#xff0c;堆内存会将这些消息放到队列中&#xff0c;具体实现jvm见&#xff0c;栈内存各自维护&#xff0c;堆内存大家共享 进…...

npm语义化版本和版本运算符

版本号组成 一个完整的版本号&#xff0c;由三部分组成&#xff1a;主版本号&#xff08;major&#xff09;、次版本号(minor)、修订版本号(patch)&#xff0c;简称X.Y.Z&#xff0c;具体含义&#xff1a; 主版本号&#xff08;major&#xff09;&#xff1a;项目&#xff08…...

孩子到了叛逆期,家长应该怎么教育孩子?

到了一定的年龄后&#xff0c;有些孩子会变得叛逆起来&#xff0c;那么对于家长来说&#xff0c;如何教育叛逆的孩子&#xff1f;孩子叛逆期教育方法有哪些呢&#xff1f;   叛逆期教育孩子用什么方法   一。要摒除父母对孩子居高临下的心态&#xff0c;放下身叚&#xff0…...

什么网站可以做线上小游戏/如何用模板建站

[sizexx-large][colororange][b]Rose框架[/b][/color][/size]官网&#xff1a;[url]https://code.google.com/p/paoding-rose/[/url]1 .对rose框架的整体认识1.1B/S web开发 我们所做的web开发是基于HTTP的应用服务开发&#xff0c;主要由两部分组成&#xff1a;浏览器服务端 大…...

做网站的故意给中病毒/网络销售怎么找客户

文章目录MyBatis-Plus特性快速开始项目整体目录结构数据库准备配置文件简单CRUD通用service源码下载MyBatis-Plus 官网 个人白话解释&#xff1a;简单的CRUD直接通过方法调用&#xff0c;无需多写接口和xml&#xff0c;像jpa那样调用 愿景 我们的愿景是成为 MyBatis 最好的搭档…...

企业内部门户网站建设方案/百度关键词优化的意思

VMware 虚拟化 的四大特点1.封装&#xff1a;虚拟机都保存在文件中&#xff0c;且可通过移动跟复制这些文件的方式来移动跟复制该虚拟机。2.相对于硬件独立&#xff1a;无需修改即可在任何服务器上运行虚拟机。3.隔离&#xff1a;在同一服务器上的虚拟机之间互相隔离&#xff0…...

手机网站开发者模式/制作自己的网站

华为在近年来的发展一直朝着更好的方向前进&#xff0c;作为一个中国自主研发比较出色的一个企业&#xff0c;华为掌握了全球最多的5G专利技术&#xff0c;还自己研发了处理器芯片&#xff0c;就手机行业上来说&#xff0c;现在华为的位置已经可以坐到全球出货量前二的位置。种…...

wordpress 一键排版/网站搭建教程

count统计数组里元素的个数&#xff1b;strlen是统计数组中元素的长度&#xff1b;你如果想统计数组中所有元素的长度&#xff0c;那就用循环统计吧tqeb代码:$a array(‘0‘ > ‘123‘, ‘1‘ > ‘asdf‘);$count count($a);$a_length 0;for ($i0; $i$a_…...

外贸相关岗位人才招聘启事/浙江seo

说在前面屋主夫妻俩是爱猫控&#xff0c;同时也是宠物医生&#xff0c;家里有两只猫&#xff0c;他们希望能在这套房子里陪着猫咪一起变老。平时住的人不多&#xff0c;小俩口没事的时候&#xff0c;喜欢窝在家里打打游戏、做做饭。经过与屋主交流之后&#xff0c;设计师将原来…...