Python爬取58同城广州房源+可视化分析

作者: 天善智能 | 来源:发表于2018-05-21 14:16 被阅读165次

    感谢关注天善智能,走好数据之路↑↑↑

    欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

    对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。​


    消失了一段时间,这段时间在CSDN阅读了不少关于Python爬虫的文章,也学习了秦璐老师《七周成为数据分析师》系列的Python内容,主要是关于强大的pandas,后面的可视化课程还没学习~所以这里的可视化都只能用Power BI来绘制,后面会再改进和完善。

    下面就直入主题,写一写Python爬取58同城广州房源+可视化分析的过程啦。

    一、数据爬取

    爬虫这一块是利用requests来实现的,并通过BeautifulSoup4实现解析。这里我参考了CSDN博客文章《python爬虫租房信息在地图上显示》https://blog.csdn.net/qq_36091581/article/details/76944053

    1.我选取的是58同城上广州地区各个价格区间的个人房源。

    2.这里我进行了两层爬虫,第一层是爬取房源列表的数据,爬到的每条房源数据都为其设置一个ID号,并爬下房源的标题、地址、Url等数据。

    第二层爬取则是根据第一层生成的房源ID号和爬到的每个房源链接,进入每个房源URL并抓取其详细信息。

    下面是获取详细信息的部分代码,通过对网页的解析,进而爬取出具体数据:

     # 通过bs4获取对应的网页

                time.sleep(3)

                print("fetch:" + house_url)

                response = requests.get(house_url, headers=headers)

                html = BeautifulSoup(response.text, "html.parser", exclude_encodings="utf-8")  //使用html.parser进行解析

                house_title_node = html.select(".house-title")

                if not house_title_node:

                    continue

                house_title = html.select(".house-title")[0].select("h1")[0].string.strip()  //房源标题

                #print("=========title:" + house_title)    //这里包括下面的每次打印是为了测试是否出错

                house_price = html.select("b.f36")[0].string  //房源价格

                if html.select("span.c_333")[0].string:

                    pay_method = html.select("span.c_333")[0].string  //支付方式

                print("=========pay:" + pay_method)

                house_type = html.select("ul.f14")[0].select("li")[0].select("span")[1].string  //租房类型

                print("=========house_type:" + house_type)

                room_info = html.select("ul.f14")[0].select("li")[1].select("span")[1].string.strip()

                room_info_list = room_info.split()

                for index in range(len(room_info_list)):

                    if index == 0:

                        room_count = room_info_list[index]    //?房?室?厅

                    if index == 1:

                        room_square = room_info_list[index]    //房源面积

                print("=========room_count:" + room_count)

                print("=========room_square:" + room_square)

                other_info_list = html.select("ul.f14")[0].select("li")[2].select("span")[1].string.strip().split()

                for index in range(len(other_info_list)):

                    if index == 0:

                        orientation = other_info_list[index]

                    if index == 1:

                        room_floor = other_info_list[index]

                print("=========orientation:" + orientation)  //朝向

                print("=========room_floor:" + room_floor)  //楼层

                microdistrict_span = html.select("ul.f14")[0].select("li")[3].select("span")[1].select("a")

                if microdistrict_span:

                    if microdistrict_span[0].string:

                        microdistrict = microdistrict_span[0].string.strip()  //所在小区

                print("=========microdistrict:" + microdistrict)

                house_district_span = html.select("ul.f14")[0].select("li")[4].select("span")[1].select("a")

                if house_district_span:

                    house_district = house_district_span[0].string.strip()      //所在地区

                print("=========house_district:" + house_district)

                house_location_span = html.select("ul.f14")[0].select("li")[4].select("span")[1].select("a")

                if len(house_location_span) > 1 :

                    house_location = house_location_span[1].string.strip()    //房源所在地址

                print("=========house_location:" + house_location)

                house_addr = html.select("ul.f14")[0].select("li")[5].select("span")[1].string.strip()  //房源详细地址

                print("=========house_addr:" + house_addr)

                pic_url = html.select("#smainPic")[0]["src"]  //图片

                print("=========pic_url:" + pic_url)

                print("getid===" + str(house_id) + "success") 

                csv_writer.writerow(

                    [house_id, house_title, house_type,

                    room_count, room_square, house_location,

                    house_addr, house_price, house_district,

                    pay_method, orientation, room_floor,

                    microdistrict, pic_url, house_url])

    这里主要用到的是csv库的读写。爬取到的csv文件长下面这样:

    这是在Notepad++打开的效果。由于是按价格区间爬取的,所以爬下来的是按照价格区间进行分类的多个csv文件。为了便于操作,我将全部房源数据导入MySql数据库中,也方便数据清洗。

    如上图,这样看数据就规整多了。一共爬下了16445条房源数据~

    二、数据清洗

    接着进行简单的数据清洗,这里主要是把过分夸大的数据给清洗掉。

    例如,利用select语句找出room_square>600的房源记录,发现数据有夸大的成分,房价与房源面积的关系不符合客观事实,因此我们可以把这种脏数据直接删除掉。

    再者,由于爬虫的时候没有考虑爬经纬度,所以只能在做热力图的时候,利用网上的工具生成经纬度啦~这里就为了能较准确地利用house_location生成经纬度,也对house_location做了处理:

    利用update语句将没有标明“广州”的地址都为其加上城市名前缀,这里是用concat实现连接。

    数据清洗可以结合自己想要实现的分析功能来进行,还有其他可能需要清洗的字段,这个视分析对象、分析目的而定。

    三、可视化分析

    1.热力图

    由热力图不难得出,广州市中心地区(越秀区和海珠区)房价最高,天河区及周边次之。从整体来看,房价由市中心向外围逐渐降低,符合我们了解的客观事实。

    2. 利用其他图表分析房租变化的影响因素

    2.1 利用折线图分析合租或整租情况下,房价随房源面积的变化。

    ①从折线图中,我们可以得到结论:合租时,选取40-140平方米的房源会更加划算;而整租时,则适合选取房源面积小的,最好在0-40平方米这个区间。

    折线图反映的整体规律符合我们的客观认识:整租时租金随房源面积的增加而增加,而合租由于个人可能只是租到其中的单间,所以大体上租金不受房源面积的影响。

    ②利用条形图直观体现不同地区的房租高低。结果和我预想的差不多,无论是合租还是整租,前三名妥妥的都是越秀海珠天河(越秀区的合租平均租金仅比海珠区低6块钱),这三个区整租时的平均租金均超过了3000,越秀区竟然超过了4000!!!看来以后要在这三个区,最好还是合租或者租个小单间。

    ③上面这个dashboard还可以实现联动。

    2.2 好奇地利用各种图表来看看朝向、房间数、客厅数、卫生间数对租金的影响。

    ①条形图-朝向:整租时一般不用考虑朝向,而合租时因为租的算是单间啦,朝向可是个很重要的因素哦。从条形图我们也可以看出,合租时,南、东南、南北、西南这些带有“南”的,平均房租会比较高。而整租的时候,就没有这种规律啦。

    ②面积图-房间数:合租时3室、4室、5室的租金相对会较高,但总体上合租时房间数的多少不会对租金有太大影响,因为合租一般就是租个单间;而整租的话,1-2个人建议租1-2室。大家庭住的话6室和8室比较划算,8室的均价最低。

    ③折线图-客厅数:0厅毋庸置疑是最便宜的,而一定要带厅的话,合租时1厅和2厅的租金差距不大,整租时选择1厅的租金比较能接受,5厅的性价比最高。

    ④色带图-卫生间数:让我觉得不可思议的是,合租时0卫的租金居然比1卫略低那么一点点?其实卫生间数的多少似乎对合租租金没多大影响。

    再来看整租,带卫的房源租金要比不带卫的租金高,且除了5卫和8卫的租金略低外,房租随卫生间数的增加而增加。看来,卫生间对房租的影响还是挺大的!

    ⑤眼尖的人可以发现,我在色带图的右上方还放置了个过滤器~想具体找某个地区的房源就可以直接挑选**区进行联动啦!

    这次分析就先在这里告一段落啦~由于爬的数据量不大,且数据较零散,所以可能有一些分析结果存在数据干扰。

    下次估计会用统计学来分析房源数据啦~下篇见~


    文章来源:天善智能社区https://blog.hellobi.com/newest

    文章作者:顾小t

    相关文章

      网友评论

        本文标题:Python爬取58同城广州房源+可视化分析

        本文链接:https://www.haomeiwen.com/subject/jgvfjftx.html