Advertisement

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

阅读量:

一、项目分析

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

在这里插入图片描述

每个具有 class 属性为 f-list-item ershoufang-list 的 div 都包含所需爬取的数据信息;且该查询返回了 42 个结果;这表明该属性无重复性;与单个页面上的42条房源信息相对应。

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

1、房源信息
在这里插入图片描述

结论:位于 class 属性值包含 js-title value title-font 的 a 标签中的房源信息为此设计的正则表达式是:

复制代码
    <div.+?g-list".+?<a.+?js-title.+?>(.+?)</a>  # (.+?)为提取数据
2、房源户型
在这里插入图片描述

总结:想要查找的房源户型位于该标签组(其中 class 属性设置为 dd-item 和 size 组合)的第一个 span 元素中。可以通过以下正则表达式实现:

复制代码
    #接着上面的正则往后写
    .+?<dd.+?dd-item.+?<span>(.+?)</span>
3、房源面积
在这里插入图片描述

结论:需要查找位于房源户型后未带有class属性值的span标签中的房源面积信息;从而正则表达式被构造为:

复制代码
    #接着上面的正则往后写
    .+?<span>(.+?)</span>
4、房源走向
在这里插入图片描述

结果表明,在要寻找符合条件的房源走向时,这些房源必须位于不包含 class 属性值的 span 元素中;其对应的正则表达式即为

复制代码
    #接着上面的正则往后写
    .+?<span>(.+?)</span>
5、房源装修
在这里插入图片描述

总结

复制代码
    #接着上面的正则往后写
    .+?"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

全部评论 (0)

还没有任何评论哟~