import re
import requests
from bs4 import BeautifulSoup
import get_allurls#import自定义模块
from get_allurls import *
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
from numpy import random
def parse_url():
info_db=DataFrame()
all_urls=get_allurls.get_allurl()
for url in all_urls:
info={}
res=requests.get(url)#
if res.status_code==200:
html=res.content#响应内容
soup=BeautifulSoup(html,'html.parser')
#该网站的html代码中有的标识为空,字典赋值会出现报错IndexError: list index out of range
#加上try.....except 错误机制跳过空值
try:
#获取标题
title=soup.select('.main')[0].text
#获取房屋总价(单位万)
total_price=soup.select('.total')[0].text#输出如:'775'
#获取房屋单价(单位元)
price=soup.select('.unitPriceValue')[0].text#输出如:'85147元/平米'
#获取房屋名称及所属区
s=soup.find_all('div',attrs={'class':'fl l-txt'})[0]
##返回的s格式如下
##
s=re.findall('
##返回的s格式如下
##['上海房产网',
##'上海二手房',
##'静安二手房',
##'大宁二手房',
##'上海滩大宁城(公寓)二手房']
name=re.findall('>(.*?)<',s[-1])[0]#将s继续规整,得到name,'上海滩大宁城(公寓)二手房'
district=re.findall('>(.*?)<',s[2])[0]#'静安二手房'
info['title']=title#标题
info['name']=name#小区名称
info['district']=district#所在区
info['total_price']=total_price#房屋总价
info['price']=total_price#单价
#获取房屋基本信息
basic_info=re.findall("""房屋户型.*?|
所在楼层.*?|
建筑面积.*?|
户型结构.*?|
套内面积.*?|
建筑类型.*?|
房屋朝向.*?|
建筑结构.*?|
装修情况.*?|
梯户比例.*?|
配备电梯.*?
""",str(soup('li')),re.VERBOSE)#re.VERBOSE参数可以将正则表达式写成多行,并且自动忽略空格,此处一定要加上该参数。
#输出的basic_info列表格式如下:
#['房屋户型3室2厅1厨1卫',
#'所在楼层中楼层 (共23层)',
#'建筑面积91.02㎡',
#'户型结构暂无数据',
#'套内面积暂无数据',
#'建筑类型板楼',
#'房屋朝向南',
#'建筑结构钢混结构',
#'装修情况精装',
#'梯户比例两梯三户',
#'配备电梯有']
basic_info_list=[]
for i in basic_info:
i=re.findall('>(.*?)<',i)[0]#对basic_info列表中的值进行规整
basic_info_list.append(i)
#规整后的basic_info_list格式如下:
#['3室2厅1厨1卫',
#'中楼层 (共23层)',
#'91.02㎡',
#'暂无数据',
#'暂无数据',
#'板楼',
#'南',
#'钢混结构',
#'精装',
#'两梯三户',
#'有']
info['house_type']=basic_info_list[0]#房屋户型
info['floor_loc']=basic_info_list[1]#所在楼层
info['house_area']=basic_info_list[2]#建筑面积
info['house_struc']=basic_info_list[3]#户型结构
info['real_area']=basic_info_list[4]#套内面积
info['archi_cate']=basic_info_list[5]#建筑类型
info['house_toward']=basic_info_list[6]#房屋朝向
info['archi_struc']=basic_info_list[7]#建筑结构
info['deco_condition']=basic_info_list[8]#装修情况
info['elevator_rate']=basic_info_list[9]#梯户比例
info['elevator_equip']=basic_info_list[10]#配备电梯
except IndexError:
continue
info_db=pd.concat([info_db,DataFrame(info,index=[1])],axis=0,ignore_index=True)#将字典转为DataFrame,循环concat
return(info_db)#返回DataFrame格式的数据