厦门市集美区租房分析

数据获取

数据来源基于贝壳租房,搜索集美区得到的数据(数据来源:https://xm.zu.ke.com/zufang/rs%E9%9B%86%E7%BE%8E%E5%8C%BA/)

本文利用web scraper 爬取网页数据。web scraper是一款浏览器插件,进行简单调试,可对浏览网页数据进行一定程度的获取。本文利用qq浏览器+web scraper插件对数据进行获取。

创建sitemap

注意的是集美区房屋数据总计82页,尝试跳转页面之后发现页面参数在地址栏的位置,对其进行修改。(https://xm.zu.ke.com/zufang/jimei/pg[1-82]rs%E9%9B%86%E7%BE%8E%E5%8C%BA/#contentList)

选择包含要素element

获取多数据情况,可以选择需要获取数据的element,再在element选项下,筛选合适的数据。

选择需要的元素内容

筛选出需要分析字段,预览格式有效保存好字段选项。

scrape

爬取格式见上图,点击sitemap下的scrape,开始获取数据,获取完全部数据将数据存为csv下载,到本地。

beike.csv

清洗数据

下载完数据打开格式如图,用excel打开对数据进行清理,总计2342行数据,同检索到结果相同。

筛选数据

web-scraper-order,及web-scraper-start-url数据是获取数据过程中生成数据,对后续分析显著作用,予以剔除。

数据分列

1. title

title下的数据包含租房方式,小区,具体位置,以及房间朝向情况,利用excel表格分类,分割符号:·对租房方式及其他选项分列,余下字段利用空格进行分裂即可。

2. detail

detail字段下,包含字段信息较多,首先利用查找替换,将数据中存在换行符(ctrl+j)予以替换,依次分列出区域,具体位置,面积,朝向,房间,楼层字段。

数据一致化

剔除重复列的字段,对于将价格,面积,楼层数转化为数值,其中,部分地下室楼房缺少楼层信息,补充标注为1。

清洗完的数据如图所示:

清洗.xlsx

数据可视化

可视化.twb

总体租房方式以整租为主,少量房源为合租房。

总体平均租房面积为91.51平方米,其中杏西房源相对平均面积较高,高达127.67平方米,而环海东寓房源面积53.81平方米,相较较低。

房子朝向大多符合传统的“背北朝南”,阳光及通风较好。

将各区域的房价,楼层情况,及平均月租价格来看,杏林桥头的总体水平处在较高层面。租房可以参照上图看价格合理情况。

最后,各租房的平均单位租金进行分析来看,如果你在贝壳租房上找到合适的房子入住,平均你的一个垃圾桶一个月最低要花费你9.09元的租金。

清洗

2020/02/21 posted in  项目

商铺数据加载及存储

商铺数据

要求:

  1. 成功读取“商铺数据.csv”文件
  2. 解析数据,存为list
  3. 数据清洗:

    • comment,price两个字段清洗成数字
    • 清除字段缺失的数据
    • commentlist拆分成三个字段,并且清洗成数字
  4. 结果存为.csv文件

# 1.导入数据
f=open('商铺数据.csv','r',encoding='utf-8')
#查看前6行数据函数
def data(x):
    if x==all:
        for line in f.readlines()[:6] :#查看前5行数据
            print(line.split(','))# 按,拆分
    else:
        for line in f.readlines()[:6] :
            print(line.split(',')[x])
    f.seek(0,0)
data(all)
['\ufeffclassify', 'name', 'comment', 'star', 'price', 'address', 'commentlist\n']
['美食', '望蓉城老坛酸菜鱼(合生汇店)', '我要点评', '该商户暂无星级', '人均                                        ¥125', '翔殷路1099号合生汇5F', '口味8.3                                环境8.4                                服务8.5\n']
['美食', '泰国街边料理', '74                    条点评', '准四星商户', '人均                                        ¥48', '黄兴路合生汇B2美食集市内', '口味7.4                                环境7.6                                服务7.4\n']
['美食', '壹面如故(苏宁生活广场店)', '265                    条点评', '准四星商户', '人均                                        ¥21', '邯郸路585号苏宁生活广场B1层', '口味7.0                                环境7.2                                服务7.2\n']
['美食', '鮨谷•Aburiya(合生汇店)', '2748                    条点评', '准五星商户', '人均                                        ¥142', '翔殷路1099号合生广场5楼23、28铺位', '口味8.9                                环境8.5                                服务8.4\n']
['美食', '我们的烤肉我们的馕', '5                    条点评', '准四星商户', '人均                                    -', '邯郸路399-D3号', '口味7.5                                环境6.8                                服务7.5\n']

清洗数据

商铺数据.csv

清洗评论数量数据

f.seek(0,0)
print('---原始数据预览---')
data(2)#查看评论数据

#定义清洗数据函数
import re

def comment_number(s):
    if '我要点评' in s:
        return '无数据'
    else:
        return re.findall(r'\d+',s)

print('---清洗完数据预览---')

for line in f.readlines()[:6] :
        cm_n=comment_number(line.split(',')[2])
        print(cm_n)
---原始数据预览---
comment
我要点评
74                    条点评
265                    条点评
2748                    条点评
5                    条点评
---清洗完数据预览---
[]
无数据
['74']
['265']
['2748']
['5']

清洗价格数据

f.seek(0,0)

print('---原始数据预览---')
data(4)

def pri(s):
    if '-' in s:
        return '无数据'
    else:
        return re.findall(r'\d+',s)

print('---清洗完数据预览---')

for line in f.readlines()[:6] :
        pr=pri(line.split(',')[4])
        print(pr)
---原始数据预览---
price
人均                                        ¥125
人均                                        ¥48
人均                                        ¥21
人均                                        ¥142
人均                                    -
---清洗完数据预览---
[]
['125']
['48']
['21']
['142']
无数据

清洗评论数据

f.seek(0,0)

print('---原始数据预览---')
data(-1)

def comment(s):
    if len(s)<3:
        return '无数据'
    else:
        return re.findall(r'\d+\.\d',s)#提取小数


print('---清洗完数据预览---')

for line in f.readlines()[:6] :
        cm=comment(line.split(',')[-1])
        print(cm)
---原始数据预览---
commentlist

口味8.3                                环境8.4                                服务8.5

口味7.4                                环境7.6                                服务7.4

口味7.0                                环境7.2                                服务7.2

口味8.9                                环境8.5                                服务8.4

口味7.5                                环境6.8                                服务7.5

---清洗完数据预览---
[]
['8.3', '8.4', '8.5']
['7.4', '7.6', '7.4']
['7.0', '7.2', '7.2']
['8.9', '8.5', '8.4']
['7.5', '6.8', '7.5']

汇总数据

#数据清洗
import csv
csvfile=open('清洗完数据.csv','w')
writer = csv.writer(csvfile)
writer.writerow(['classify','name','comment','star','price','address','quality','environment','service'])

f.seek(0,0)

for line in f.readlines()[1:10] :#删除第一个数据
    s=line.split(',')   
    classify=s[0]
    name=s[1]
    comment_1=comment_number(s[2])[0]#获取列表下数字
    star=s[3]
    price=pri(s[4])[0]
    address=s[5]
    quality=comment(s[-1])[0]
    environment=comment(s[-1])[1]
    service=comment(s[-1])[2]
#预览查看    
    print(classify,name,comment_1,star,price,address,quality,environment,service)
    
#删除缺失数据   
    if '无数据'not in [classify,name,comment_1,star,price,address,quality,environment,service]:
        writer.writerow([classify,name,comment_1,star,price,address,quality,environment,service])
        
csvfile.close()
f.close()
美食 望蓉城老坛酸菜鱼(合生汇店) 无 该商户暂无星级 125 翔殷路1099号合生汇5F 8.3 8.4 8.5
美食 泰国街边料理 74 准四星商户 48 黄兴路合生汇B2美食集市内 7.4 7.6 7.4
美食 壹面如故(苏宁生活广场店) 265 准四星商户 21 邯郸路585号苏宁生活广场B1层 7.0 7.2 7.2
美食 鮨谷•Aburiya(合生汇店) 2748 准五星商户 142 翔殷路1099号合生广场5楼23、28铺位 8.9 8.5 8.4
美食 我们的烤肉我们的馕 5 准四星商户 无 邯郸路399-D3号 7.5 6.8 7.5
美食 麦当劳(万达店) 785 准四星商户 24 邯郸路600号万达商业广场B1楼A05号铺 7.4 7.2 7.2
美食 蒸年青STEAMYOUNG(百联又一城购物中心店) 3779 准五星商户 70 淞沪路8号百联又一城购物中心7层 8.6 8.6 8.6
美食 丸来玩趣(百联又一城购物中心店) 458 准四星商户 14 淞沪路8号百联又一城购物中心B1层 7.0 6.5 6.5
美食 韩国雪冰(合生汇店) 1280 四星商户 47 翔殷路1099号合生汇4F 7.7 7.5 7.6

代码汇总

# 1.导入数据
f=open('商铺数据.csv','r',encoding='utf-8')
#2. 定义函数
import re

def comment_number(s):
    if '我要点评' in s:
        return '无数据'
    else:
        return re.findall(r'\d+',s)
    
def pri(s):
    if '-' in s:
        return '无数据'
    else:
        return re.findall(r'\d+',s)
    
def comment(s):
    if len(s)<3:
        return '无数据'
    else:
        return re.findall(r'\d+\.\d',s)#提取小数
    
# 3.计算清洗数据&导出csv

import csv
csvfile=open('清洗完数据.csv','w')
writer = csv.writer(csvfile)
writer.writerow(['classify','name','comment','star','price','address','quality','environment','service'])

f.seek(0,0)
n=0 #计数变量
for line in f.readlines()[1:] :#删除第一个数据
    s=line.split(',')   
    classify=s[0]
    name=s[1]
    comment_1=comment_number(s[2])[0]#获取列表下数字
    star=s[3]
    price=pri(s[4])[0]
    address=s[5]
    quality=comment(s[-1])[0]
    environment=comment(s[-1])[1]
    service=comment(s[-1])[2]
    
#删除缺失数据   
    if '无数据'not in [classify,name,comment_1,star,price,address,quality,environment,service]:
        n+=1
        writer.writerow([classify,name,comment_1,star,price,address,quality,environment,service])
        
print('导出成功,合计'+str(n)+'条数据')
csvfile.close()
f.close()
导出成功,合计1265条数据

清洗完数据

2020/02/21 posted in  项目

当当图书爬虫

# 爬取当当网图书
import requests
from pyquery import PyQuery
import csv
import time

class DDSider(object):
    def __init__(self,key):
        self.key = key
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
        }
        self.base_url = 'http://search.dangdang.com/?key='+key+'&act=input&page_index={}'
    # 获取界面内容 
    def get_pageInfo(self):
        
        num_page = 0
        while True:
            num_page += 1 
            page_url = self.base_url.format(num_page)
            res = requests.get(page_url,headers=self.headers)
#             print(res.content.decode('GBK'))
            
            # 解析
            self.parse_pageInfo(res.content.decode('GBK'))
            time.sleep(1)
            if num_page == 1:
                break
                
    def parse_pageInfo(self,html):
        doc = PyQuery(html)
        
        book_ul = doc('#component_59 li').items()
        
        for one_li in book_ul:
#             print(one_li)
            # 图片的链接
            if one_li('.pic img').attr('data-original'):
                img_url = one_li('.pic img').attr('data-original')
                
            else:
                img_url = one_li('.pic img').attr('src')
            
            # 标题
            title = one_li('.name a').attr('title')

            # 价格
            price = one_li('.price .search_now_price').text()

            # 获取评价数
            comments = one_li('.search_star_line .search_comment_num').text()
            
            #search_star_black
#             stars = one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;')
            stars = float(one_li('.search_star_black span').attr('style').split(':')[-1].strip('%;'))/20
#             print(stars)

if __name__ == "__main__":
    dd = DDSider('python')
    dd.get_pageInfo()
5.0
4.5
4.5
4.5
4.5
4.5
4.5
5.0
4.5
4.5
5.0
4.5
5.0
3.0
4.5
4.5
5.0
5.0
5.0
4.5
5.0
4.5
4.5
4.5
4.5
0.0
4.5
4.5
4.5
4.0
4.5
5.0
4.0
5.0
4.5
4.5
4.5
5.0
3.0
5.0
5.0
5.0
5.0
4.5
4.5
0.0
5.0
5.0
4.5
5.0
4.0
5.0
4.5
5.0
4.5
0.5
4.5
4.5
4.0
5.0
import time
import requests
import json
# 时间戳: 1970-01-01 00:00:00 到当前时间的的秒数(10位数)或者是毫秒数(13位)
# timestamp = 1559223244110
# timearray = time.localtime(float(timestamp/1000))
# tt = time.strftime('%Y--%m--%d %H:%M:%S',timearray)
# print(tt)

# 把当前时间转成时间戳的格式

# timestamp = int(time.time())*1000
# timearray = time.localtime(float(timestamp/1000))
# tt = time.strftime('%Y--%m--%d %H:%M:%S',timearray)
# print(tt)
# 动态界面的爬取
base_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp={}&keyword=Python&pageIndex=1&pageSize=10&language=zh-cn&area=cn'

timestamp = int(time.time())*1000
headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
        }
url = base_url.format(timestamp)
print(url)

res = requests.get(url=url,headers=headers)
# print(res.content.decode('utf-8'))

# 将数据转化成Python对象
conntent_dict = json.loads(res.content.decode('utf-8'))

Data_dict = conntent_dict['Data']
# posts_list 里面存的就是我们想要的数据
posts_list = Data_dict['Posts']

# 拿到每一条数据
for value_dict in posts_list:
    
    RecruitPostName = value_dict['RecruitPostName']
    print(RecruitPostName)
    LastUpdateTime = value_dict['LastUpdateTime']
    print(LastUpdateTime)





https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1559224906000&keyword=Python&pageIndex=1&pageSize=10&language=zh-cn&area=cn
25923-监控系统开发工程师(Python)(深圳)
2019年05月30日
31504-AI机器人后台开发工程师(python)
2019年05月29日
CSIG16-python高级研发工程师
2019年05月25日
TME-腾讯音乐python开发工程师
2019年05月17日
25923-Python高级工程师(上海)
2019年04月19日
25923-Python高级工程师(深圳)
2019年04月19日
25923-数据分析平台开发工程师(Python)(深圳)
2019年03月21日
PCG04-安全测试专家(后台服务/客户端)
2019年05月30日
30359-大数据高级开发工程师(深圳)
2019年05月30日
31504-腾讯云监控高级运维工程师
2019年05月30日
2020/02/21 posted in  项目