Python爬取并分析全国新楼盘数据
一、选题背景
Q:为什么选择选择此题?
随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战
Q:达到什么预期目标?
未来发展前景广阔,人口流入将会增加对于房产的需求,获取更多的新楼盘数据,并分析人口流动。
Q:项目背景
十三届全国人大四次会议5日上午9时在人民大会堂开幕,其中住房政策:“房住不炒”,解决好大城市住房突出问题!进行可视化分析。
二、主题式网络爬虫设计
Q:主题是网络爬虫名称
爬取并分析全国新楼盘数据Q:主题式网络爬虫的内容
爬取最新中国新楼盘数据,并实现数据可视化。
Q:设计方案描述
爬虫使用到的模块有requests_html、requests_cache、bs4.BeautifulSoup、re等
三、主页体面的结构特征分析这是一个的首页界面
结构特征
标签是div
结构分析
四、网络爬虫程序分析 定义函数
#定义好获取每个项目信息的函数。
1 def get_house_status(soup): 2 """ 3 获取房屋状态信息 4 """ 5 house_status = [] 6 status = soup.find_all(attrs={\'class\': \'fangyuan\'}) 7 for state in status: 8 _status = state.span.text 9 house_status.append(_status) 10 return house_status 11 12 def get_house_price(soup): 13 """ 14 获取房屋价格信息 15 """ 16 house_price = [] 17 regex = re.compile(\'\s(\S+)\s\') 18 prices = soup.find_all(attrs={\'class\': \'nhouse_price\'}) 19 for price in prices: 20 _prices = regex.findall(price.text) 21 _price = \'\' 22 if _prices[0] == \'价格待定\': 23 pass 24 else: 25 p = _prices[0].split(\'元\')[0] 26 if \'万\' in p: 27 _price = p + \'元/套\' 28 else: 29 _price = p + \'元/m2\' 30 house_price.append(_price) 31 return house_price 32 33 def get_house_address(soup, c_city): 34 """ 35 获取房屋地址信息 36 """ 37 house_address = [] 38 region = [] 39 regex = re.compile(\'\s(\S+)\s\') 40 addresses = soup.find_all(attrs={\'class\': \'address\'}) 41 for address in addresses: 42 _address = regex.findall(address.text) 43 if len(_address) > 1: 44 region.append(_address[0].split(\'[\')[1].split(\']\')[0]) 45 else: 46 region.append(c_city) 47 house_address.append(address.a[\'title\']) 48 return region, house_address 49 50 def get_house_type(soup): 51 """ 52 获取房屋类型信息 53 """ 54 house_type = [] 55 regex = re.compile(\'\s(\S+)\s\') 56 house_types = soup.find_all(attrs={\'class\': \'house_type clearfix\'}) 57 for _house_type in house_types: 58 type_list = regex.findall(_house_type.text) 59 type_str = \'\' 60 for i in type_list: 61 type_str += i 62 house_type.append(type_str) 63 return house_type 64 65 def get_house_name(soup): 66 """ 67 获取项目名称信息 68 """ 69 house_name = [] 70 regex = re.compile(\'\s(\S+)\s\') 71 nlcd_names = soup.find_all(attrs={\'class\': \'nlcd_name\'}) 72 for nlcd_name in nlcd_names: 73 name = \'\' 74 names = regex.findall(nlcd_name.text) 75 76 if len(names) > 1: 77 for n in names: 78 name += n 79 house_name.append(name) 80 else: 81 house_name.extend(names) 82 return house_name