Python爬虫之九:用正则表达式爬取赶集网租房信息

该博客主要介绍了如何使用Python和正则表达式抓取赶集网上的租房信息,包括房源标题、户型、面积、走向等。作者首先分析了主页和详情页面的关系,然后确定了数据的正则匹配规则,并在代码实现中处理了缺失装修信息的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、项目分析

1、查询主页和详情页面的关系

在这里插入图片描述
得出数据关系:每一个 class 属性为 f-list-item ershoufang-list 的 div 包含着整个需要爬取数据的信息,且查询 ershoufang-list 为 42 个,说明这个属性没有重复,与一个页面42个房源信息对应。

2、需要爬取的数据的正则特征

1、房源信息

在这里插入图片描述
结论:需要查找的房源信息在 class 属性值为 js-title value title-font 的 a 标签中,因此正则表达式为:

<div.+?g-list".+?<a.+?js-title.+?>(.+?)</a>  # (.+?)为提取数据
2、房源户型

在这里插入图片描述
结论:需要查找的房源户型在 class 属性值为 dd-item size 的 dd 标签下的第一个 span 中,因此正则表达式为:

#接着上面的正则往后写
.+?<dd.+?dd-item.+?<span>(.+?)</span>
3、房源面积

在这里插入图片描述
结论:需要查找的房源面积在房源户型后没有 class 属性值的 span 标签中,因此正则表达式为:

#接着上面的正则往后写
.+?<span>(.+?)</span>
4、房源走向

在这里插入图片描述
结论:需要查找的房源走向在房源面积后没有 class 属性值的 span 标签中,因此正则表达式为:

#接着上面的正则往后写
.+?<span>(.+?)</span>
5、房源装修

在这里插入图片描述
结论:需要查找的房源装修在房源走向后 class 属性值为 last 的 span 标签中,因此正则表达式为:

#接着上面的正则往后写
.+?"last">(.+?)</span> 
注意:有的房源没有装修信息,自然也不会存在对应的网页结构,所有后面要进行处理。如下:

在这里插入图片描述

6、房源租金

在这里插入图片描述

#接着上面的正则往后写
.+?<div.+?price.+?num">(.+?)</span>

3、由于房源装修信息不全,所以先不爬取,后面再爬取后添加到爬取信息中

二、爬虫编写

直接上代码,用到的全是前面学的知识:

import requests
import re

class RentalInfos:

    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        }

        self.sum_page = int(input('请输入爬取总页数:'))
        self.page_urls = []
        for i in range(1, self.sum_page+1):
            page_url = f'http://bayinguoleng.ganji.com/zufang/pn{i}/'
            self.page_urls.append(page_url)

    def parse_page_urls(self, page_url):
        '''解析页面信息'''
        resp = requests.get(page_url, headers = self.headers)
        text = resp.text
        infos = re.findall('''
        <div.+?ershoufang-list".+?<a.+?title-font.+?>(.+?)</a> # 房源信息
        .+?<dd.+?dd-item.+?<span>(.+?)</span>  # 房源户型
        .+?<span>(.+?)</span>  # 房源面积
        .+?<span>(.+?)</span >  # 房源走向 
        # .+?"last">(.+?)</span>  
        .+?<div.+?price.+?num">(.+?)</span>  #房源租金
        ''', text, re.VERBOSE|re.DOTALL)
        infos = self.tup_lis(infos)

        infos_yes_dec = re.findall('''
        <div.+?ershoufang-list".+?<a.+?title-font.+?>(.+?)</a> # 房源信息
        .+?<dd.+?dd-item.+?<span>(.+?)</span>  # 房源户型
        .+?<span>(.+?)</span>  # 房源面积
        .+?<span>(.+?)</span >  # 房源走向 
        .+?"last">(.+?)</span>  #房源装修
        .+?<div.+?price.+?num">(.+?)</span>  #房源租金
        ''', text, re.VERBOSE|re.DOTALL)
        infos_yes_dec = self.tup_lis(infos_yes_dec)

        for no_dec in infos:
            for yes_dec in infos_yes_dec:
                if no_dec[0] in yes_dec:
                    no_dec.insert(4, yes_dec[4])

        for no_dec in infos:
            if len(no_dec) == 5:
                no_dec.insert(4, '无装修数据')

        return infos

    def tup_lis(self, lis):
        '''把列表中的元组全部转换成列表'''
        new_lis = []
        for i in lis:
            m = list(i)
            new_lis.append(m)
        return new_lis

    def run(self):
        with open('rental_infos.csv', mode='w', encoding='utf-8') as f:
            f.write('{},{},{},{},{},{},{}\n'.format('房源信息', '房源户型', '房源面积', '房源走向', '房源装修', '房源地址', '房源租金'))
            for page_url in self.page_urls:
                infos = self.parse_page_urls(page_url)
                for info in infos:
                    f.write('{},{},{},{},{},{}\n'.format(info[0], info[1], info[2], info[3], info[4], info[5]))


def main():
    rental_infos = RentalInfos()
    rental_infos.run()

if __name__ == '__main__':
    main()

输出结果:

房源信息,房源户型,房源面积,房源走向,房源装修,房源地址,房源租金
天河美半年苑一室一厅   60平方中装修  起租,1室1厅1卫,60㎡,东向,精装修,1200
华凌 1室1厅1卫,1室1厅1卫,42㎡,南向,精装修,1167
九星丽苑 3室2厅1卫,3室2厅3卫,110.23㎡,南向,无装修数据,1700
车城现代美居 3室2厅1卫,3室2厅3卫,85㎡,南向,精装修,1300
库尔勒 3室2厅1卫,3室2厅3卫,108.51㎡,东西向,无装修数据,1500
短租!短租!1个月起租 建宇盛府丽苑,香梨大道4楼两室两厅,2室2厅2卫,87㎡,南北向,精装修,1300
房东急出租 随时看房 两室两厅 可改三室 房屋干净,2室2厅2卫,80.61㎡,东向,毛坯,750
恒友花园 3室2厅1卫,3室2厅3卫,106㎡,南北向,精装修,1100
亲水湾,条楼三楼对外出租,2室2厅2卫,84㎡,南北向,精装修,1500
宏基财富 1室1厅1卫,1室1厅1卫,60㎡,北向,简单装修,1200
新汇嘉 后面  石化大道 上面 精装 家具家电齐全领包入住,1室1厅1卫,87㎡,南北向,精装修,1600
龙源万方大厦 2室0厅1卫,2室2卫,47㎡,南北向,精装修,1500
下恰其一号小区好房出租拎包入住,3室2厅3卫,125㎡,南北向,精装修,1600
方兴大厦 1室1厅1卫,1室1厅1卫,72㎡,南向,精装修,1800
华景摩登BOBO 2室2厅1卫 1350元月 85平,2室2厅2卫,85㎡,南向,简单装修,1150
馨怡家园 1室1厅1卫,1室1厅1卫,60㎡,南向,简单装修,1300
板楼好 南北朝向没得说!价格1600元!随时可看房!,3室2厅3卫,105㎡,南北向,毛坯,1600
库尔勒国贸中心 1室1厅1卫,1室1厅1卫,55㎡,东向,简单装修,1200
实验中学广安滨湖  条楼三楼拎包入住,3室2厅3卫,108㎡,南北向,简单装修,1350
团结小区 1室1厅1卫,1室1厅1卫,59.69㎡,南向,精装修,1000
华誉亲水湾 2室2厅1卫 1400元月 80平 电梯房,2室2厅2卫,80㎡,南向,精装修,1400
孔雀小区 1室1厅1卫,1室1厅1卫,57㎡,西北向,简单装修,700
冠农花园城邦两室简装,条楼一楼,房东配家具家电,2室2厅2卫,87㎡,南北向,简单装修,1400
华凌 2室2厅1卫,2室2厅2卫,80㎡,南北向,简单装修,700
天山绿苑5楼85平拎包入住,2室2厅2卫,85㎡,南北向,无装修数据,950
华誉亲水湾 3室2厅1卫,3室2厅3卫,111㎡,南向,简单装修,850
金色港湾156平精装三室两厅两卫!领包入住!随时看房!,3室2厅3卫,156㎡,南向,精装修,2599
塔指小区三区 3室1厅2卫,3室1厅3卫,175.61㎡,南向,豪华装修,2700
石化大道旁  红玺台 两室两厅一卫精装拎包入住交通便利,2室2厅2卫,92㎡,南北向,精装修,1600
龙府水苑 2室1厅1卫,2室1厅2卫,60.38㎡,南向,简单装修,950
湖滨世纪城,1室1厅1卫,拎包入住,押一付三,1100元月,1室1厅1卫,43㎡,南北向,无装修数据,1100
华凌 3室2厅1卫,3室2厅3卫,114㎡,西北向,简单装修,1100
孔雀小区旁泰隆大厦 2室2厅1卫 临近巴州二中 拎包入住,2室2厅2卫,100㎡,南北向,简单装修,1200
龙腾居 1室1厅1卫,1室1厅1卫,39㎡,南向,精装修,1500
车城美居条楼一楼三室新装修适合附近上班族,3室2厅3卫,85㎡,南北向,精装修,1250
冠农花园城邦 2室1厅1卫,2室1厅2卫,72㎡,南向,精装修,1200
金色港湾电梯中层175平四室两厅两卫2000月,4室2厅4卫,175㎡,南北向,无装修数据,2000
华凌 3室1厅1卫,3室1厅3卫,96㎡,东向,简单装修,1200
机场路物探三处,条楼二楼,家具家电齐全,年付优惠,2室2厅2卫,88㎡,南北向,无装修数据,1100
永乐小区 2室1厅1卫,2室1厅2卫,70㎡,南北向,精装修,900
在水一方旁!精装两室!家具家电齐全!随时看房!,2室2厅2卫,97㎡,南北向,无装修数据,1500

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值