




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Python实现爬取房源信息的示例详解目录前言分析页面,寻找切入点爬取数据整理数据,导出文件
前言
最近由于工作突然变动,新的办公地点离现在的住处很远,必须要换房子租了。
我坐上中介的小电驴,开始探索城市各处的陌生角落。
在各个租房app之间周转的过程中,我属实有些焦头烂额,因为效率真的很低下:
首先,因为跟女友住在一起,需要同时考虑两人的上班路程,但各平台按通勤时长找房的功能都比较鸡肋,有的平台不支持同时选择多个地点,有的平台只能机械的取到离各个地点通勤时长相同的点,满足不了使用需求。
其次,站在一个租房人的立场,租房平台实在太多了,并且各平台筛选和排序逻辑都不太一致,导致很难将相似房源的信息进行横向比较。
但是没有关系,作为一名程序员,当然要用程序员的方法来解决问题了。于是,昨晚我用一个python脚本,获取了某租房平台上海地区的所有房源信息,一共2w多条:
下面就把本次爬数据的整个过程分享给大家。
分析页面,寻找切入点
首先进入该平台的租房页面,可以看到,主页上的房源列表里已经包括了我们所需要的大部分信息,并且这些信息都能直接从dom中获取到,因此考虑直接通过模拟请求来收集网页数据。
因此接下来就要考虑怎么获取url了。通过观察我们发现,该地区一共有2w套以上的房源,而通过网页只能访问到前100页的数据,每页显示数量上限是30条,算下来就是一共3k条,无法获取到全部信息。
不过我们可以通过添加筛选条件来解决这个问题。在筛选项中选择静安,进入到如下的url:
/zufang/jingan/
可以看到该地区一共有2k多套房源,数据页数为75,每页30条,理论上可以访问到所有的数据。所以可以通过分别获取各区房源数据的方法,得到该市所有的数据。
/zufang/jingan/pg2/
点击第二页按钮后,进入到了上面的url,可以发现只要修改pg后面的数字,就能进入到对应的页数。
不过这里发现一个问题,相同的页数每次访问得到的数据是不一样的,这样会导致收集到的数据出现重复。所以我们点击排序条件中的最新上架,进入到如下链接:
/zufang/jingan/pg2rco11/
用这种排序方式获得的数据次序是稳定的,至此我们的思路便有了:首先分别访问每个小地区的第一页,然后通过第一页获取当前地区的最大页数,然后访问模拟请求访问每一页获取所有数据。
爬取数据
有了思路之后就要动手写代码了,首先我们要收集包含所有的链接,代码如下:
#
所有小地区对应的标识
list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']
#
存放所有链接
urls
=
[]
for
a
in
list:
urls.append('/zufang/{}/pg1rco11/'.format(a))
#
设置请求头,避免ip被ban
headers
=
{'User-Agent':
'Mozilla/5.0
(Windows
NT
10.0;
WOW64)
AppleWebKit/537.36
(KHTML,
like
Gecko)
Chrome/81.0.4044.9
Safari/537.36'}
#
获取当前小地区第1页的dom信息
res
=
requests.get('/zufang/{}/pg1rco11/'.format(a),
headers=headers)
content
=
res.text
soup
=
BeautifulSoup(content,
'html.parser')
#
获取当前页面的最大页数
page_num
=
int(soup.find('div',
attrs={'class':
'content__pg'}).attrs['data-totalpage'])
for
i
in
range(2,page_num+1):
#
将所有链接保存到urls中
urls.append('/zufang/{}/pg{}rco11/'.format(a,i))
之后,我们要逐一处理上一步得到的urls,获取链接内的数据,代码如下:
num=1
for
url
in
urls:
print("正在处理第{}页数据...".format(str(num)))
res1
=
requests.get(url,
headers=headers)
content1
=
res1.text
soup1
=
BeautifulSoup(content1,
'html.parser')
infos
=
soup1.find('div',
{'class':
'content__list'}).find_all('div',
{'class':
'content__list--item'})
整理数据,导出文件
通过对页面结构的观察,我们能得到每个元素存储的位置,找到对应的页面元素,就能获取到我们需要的信息了。
这里附上完整的代码,感兴趣的朋友可以根据自己的需要,替换掉链接中的地区标识和小地区的标识,就能够获取到自己所在地区的信息了。其他租房平台的爬取方式大都类似,就不再赘述了。
import
time,
re,
csv,
requests
import
codecs
from
bs4
import
BeautifulSoup
print("****处理开始****")
with
open(r'..\sh.csv',
'wb+')as
fp:
fp.write(codecs.BOM_UTF8)
f
=
open(r'..\sh.csv','w+',newline='',
encoding='utf-8')
writer
=
csv.writer(f)
urls
=
[]
#
所有小地区对应的标识
list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']
#
存放所有链接
urls
=
[]
for
a
in
list:
urls.append('/zufang/{}/pg1rco11/'.format(a))
#
设置请求头,避免ip被ban
headers
=
{'User-Agent':
'Mozilla/5.0
(Windows
NT
10.0;
WOW64)
AppleWebKit/537.36
(KHTML,
like
Gecko)
Chrome/81.0.4044.9
Safari/537.36'}
#
获取当前小地区第1页的dom信息
res
=
requests.get('/zufang/{}/pg1rco11/'.format(a),
headers=headers)
content
=
res.text
soup
=
BeautifulSoup(content,
'html.parser')
#
获取当前页面的最大页数
page_num
=
int(soup.find('div',
attrs={'class':
'content__pg'}).attrs['data-totalpage'])
for
i
in
range(2,page_num+1):
#
将所有链接保存到urls中
urls.append('/zufang/{}/pg{}rco11/'.format(a,i))
num=1
for
url
in
urls:
#
模拟请求
print("正在处理第{}页数据...".format(str(num)))
res1
=
requests.get(url,
headers=headers)
content1
=
res1.text
soup1
=
BeautifulSoup(content1,
'html.parser')
#
读取页面中数据
infos
=
soup1.find('div',
{'class':
'content__list'}).find_all('div',
{'class':
'content__list--item'})
#
数据处理
for
info
in
infos:
house_url
=
''
+
info.a['href']
title
=
info.find('p',
{'class':
'content__list--item--title'}).find('a').get_text().strip()
group
=
title.split()[0][3:]
price
=
info.find('span',
{'class':
'content__list--item-price'}).get_text()
tag
=
info.find('p',
{'class':
'content__list--item--bottom
oneline'}).get_text()
mixed
=
info.find('p',
{'class':
'content__list--item--des'}).get_text()
mix
=
re.split(r'/',
mixed)
address
=
mix[0].strip()
area
=
mix[1].strip()
door_orientation
=
mix[2].strip()
style
=
mix[-1].strip()
region
=
re.split(r'-',
address)[0]
writer.writerow((house_url,
title,
group,
price,
ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年护士临床技能测试试题及答案
- 精准备考2025年文化概论试题及答案
- 提升记忆力的学习策略执业医师考试试题及答案
- 行政管理中中华文化的核心价值试题及答案
- 中国文化概论与环境保护的关系试题及答案
- 药品管理法对药师考试的影响试题及答案
- 行政管理2025年研究方法试题及答案
- 2025年自考行政管理社会服务创新试题答案
- 正确认识执业药师的考试试题及答案
- 2025年执业药师的综合素质培养试题及答案
- T∕ZZB 2733-2022 贯流式蒸汽发生器
- 战略管理教学ppt课件(完整版)
- 艾滋病感染孕产妇所生儿童艾滋病早期诊断与抗体检测流程图
- 统筹监管金融基础设施工作方案
- 云南锂电池项目可行性研究报告
- 博物馆学概论:第十讲 数字博物馆
- 危险化学品企业安全标准化规范课件
- 客户退货处理流程图
- 中国民主同盟入盟申请表(样表)
- 毕业设计(论文)-轴向柱塞泵设计(含全套CAD图纸)
- 公安机关通用告知书模板
评论
0/150
提交评论