首页 编程教程正文

北京地区二手房爬虫数据处理与展示

piaodoo 编程教程 2020-02-22 22:04:21 920 0 python教程

本文来源吾爱破解论坛

业余时间学的python,写的是关于北京的二手房爬虫,从数据的爬取,清洗,存取到数据可视化,然后利用sklearn的线性回归算法做了一个关于房价面积的预测,欢迎大家一块学习交流。

https://github.com/zhaoyuetong/python



部分图片展示:

EXCJYS46Z(1CLPL68TE46]C.png (93.97 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:43 上传


I(I@`]2RTGYJ6A@LMJIV)[P.png (28.69 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:43 上传

NQ3$SBSJ@NHVL1YT[T5HE_P.png (28.78 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:43 上传

W3%7`X799}]TQ)M0M@DA%NL.png (50.96 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:43 上传


二手房户型和关注人数分布.jpg (49.07 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:44 上传

二手房面积分布.jpg (43.52 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:44 上传

各个区域房源均价.jpg (52.14 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:44 上传


北京二手房与面积的房价预测.png (26.78 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-15 21:44 上传




部分代码展示:
[Python] 纯文本查看 复制代码
#导入相关库
import requests
import time
from bs4 import BeautifulSoup
import pandas as pd
#设置页面页的可变部分
page=('pg')
#设置请求头部信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding':'gzip',
'Connection':'close',
'Referer':'http://www.baidu.com/link?url=_andhfsjjjKRgEWkj7i9cFmYYGsisrnm2A-TN3XZDQXxvGsM9k9ZZSnikW2Yds4s&wd=&eqid=c3435a7d00006bd600000003582bfd1f'
}
def main():
    #设置列表页URL的固定部分
    url='https://bj.lianjia.com/ershoufang/'
    a=(url+page+'/')
    r=requests.get(url=a,headers=headers)
    html=r.content
    #解析抓取的页面内容
    lj=BeautifulSoup(html,'html.parser')
    positionInfo=lj.find_all('div',attrs={'class':'section_sub_nav'})
    #print(return_regin(positionInfo))
    positionInfo = return_regin(positionInfo)
    #print(positionInfo)
    for regin in positionInfo:
        regin1 =regin
        url1 = url+regin
        Crawling_data(url1,is_sellect(regin),regin1)
    pass 
#Crawling_data(url,positionInfo)
#h获取北京各个区
def return_regin(positionInfo):
    a_lis = []
    for item in positionInfo:
         pzzr=item.find_all('a')
         #print(pzzr)
         for item in pzzr:
             a_lis.append(item.get("href").split('/')[-2])
    a_lis.pop()
    return a_lis  
    pass
#判断当前选择的区
def is_sellect(regin):
    url='https://bj.lianjia.com/ershoufang/'+regin+'/'
    a=(url+page+'/')
    r=requests.get(url=a,headers=headers)
    html=r.content
    #解析抓取的页面内容
    lj=BeautifulSoup(html,'html.parser')
    positionInfo=lj.find_all('div',attrs={'class':'section_sub_nav'})
    #h获取各区域
    for item in positionInfo:
         pzzr=item.find_all('a')
         #print(pzzr)
         for item in pzzr:
             link = item.get('class')
             #判断如果是该区则返回
             if link:
                 return item.string
    pass
#判定数字 
def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        pass
    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass
    return False  
def Crawling_data(url1,regin,regin1):
    #循环抓取列表页信息
    for i in range(1,10):
         if i == 1:
             i=str(i)
             a=(url1+'/'+page+i+'/')
             r=requests.get(url=a,headers=headers)
             html=r.content
         else:
             i=str(i)                
             a=(url1+'/'+page+i+'/')
             r=requests.get(url=a,headers=headers)
             html2=r.content
             html = html + html2
         #每次间隔0.5秒
         time.sleep(0.5)
    #解析抓取的页面内容
    lj=BeautifulSoup(html,'html.parser')
    #提取房源总价
    price=lj.find_all('div',attrs={'class':'priceInfo'})
    tp=[]
    re = []
    for a in price:
        totalPrice=a.span.string
        #print(totalPrice)
        tp.append(totalPrice)
        re.append(regin)
    #提取房源信息
    houseInfo=lj.find_all('div',attrs={'class':'houseInfo'})   
    #hi=[]
    xiaoqu = []
    huxing = []
    mianji = []
    chaoxiang = []
    zhuangxiu = []
    dianti = []
    l = []
    for b in houseInfo:
        house=b.get_text()
        #数据清洗
        l = house.split('/')
        #print(l[1].split('室')[0])
        if len(l)==7:
            del l[1]
        if len(l)==6 and not (is_number(l[1].split('室')[0])):
            del l[1]
        if len(l)==5:
            l.append('无电梯')
        #hi.append(house)
        #print(l)
        xiaoqu.append(l[0])
        huxing.append(l[1])
        mianji.append(float(l[2].split('平米')[0]))
        chaoxiang.append(l[3])
        zhuangxiu.append(l[4])
        dianti.append(l[5])
    #提取房源关注度
    followInfo=lj.find_all('div',attrs={'class':'followInfo'})
    guanzhu=[]
    daikan=[]
    unitprice = []      
    for c in followInfo:
        follow=c.get_text()
        if len(follow.split('/'))!=3:
            print(follow.split('/'))
        #print(len(follow.split('/'))!=3)
        guanzhu.append(int(follow.split('/')[0].split('人关注')[0]))
        daikan.append(int(follow.split('/')[1].split('次带看')[0]))
        #fi.append(follow)
        unitprice.append(int(follow.split('/')[1].split('单价')[1].split('元')[0]))
    #创建数据表
    house=pd.DataFrame({'region':re,'totalprice':tp,'unitprice':unitprice,'xiaoqu':xiaoqu,'huxing':huxing,'mianji':mianji,'chaoxiang':chaoxiang,'zhuangxiu':zhuangxiu,'dianti':dianti,'guanzhu':guanzhu,'daikan':daikan})
    print(len(house))
    if len(house):
#保存数据
        house.to_csv("lianjiawang"+regin1+".csv",encoding="GBK")
    pass
if __name__ == '__main__':
    main()

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7475.html

搜索