一、项目分析
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