最近很多人私聊我帮忙做一个作业。很多人不是计算机专业的大学生,其实我也不是。应该选修了Python数据分析的学堂在线的公开课吧,最近应该要做作业,然后作业就是要求爬取链家网北京二手房信息,并进行线性回归建模。其实没啥什么难度。
具体要求就是下面几张图。
我是一个学到啥写啥的,好博主。今天Runsen帮你们做了,效果如下图所示。我把这篇文章放在付费的专栏,当可怜下我吧。
@
调试代码绘制箱型图线性回归代码爬虫
爬取的网址是:
https://bj.lianjia.com/ershoufang/pg1/爬取的信息是下面圈住东西。
我现在打开F12,链家就来一个确认过眼神,你就是对的人。
不说了,我菜。还是赶紧先和我同龄的大学生的小钱吧。
调试
后面就是找信息的ID和Class,发现都是在网页源代码上。
代码
后面就是使用xpath遍历,没有什么难度。这里,我需要说下链家网的爬虫真是挺严的,ip会封,然后重定301,但是链家网也好的,即是301,但它还是返回了网页源代码,可能知道大学生要做这个作业。因此,爬虫的时候并不难。然后就是写入csv。这里我不推荐用csv模块,直接with open不香吗?然后就是一个长长字符串切片的问题,如3室1厅 | 95.02平米 | 西南 北 | 精装 | 高楼层(共14层) | 1998年建 | 板塔结合,直接一个split搞定,然后就是列表取值的简单问题。爬虫代码如下。
@Author: Runsen @微信公众号: 润森笔记 @博客: https://blog.csdn.net/weixin_44510615 @Date: 2020/5/28 import requests from lxml import etree headers = { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36 } with open(df.csv, a+) as f: f.write( number + , + square + , + direction + , + decorate + , + floor + , + time + , + MeanPrice + , + totalPrice + , + location + , + where + \n) for i in range(1, 101): page_url = https://bj.lianjia.com/ershoufang/pg{}.format(i) res = requests.get(page_url, headers=headers) // 这里千万不要判断res的状态码200 page = etree.HTML(res.text) content = page.xpath(“//div[@class=houseInfo]/text()”) MeanPrice = page.xpath(“//div[@class=unitPrice]/@data-price”) totalPrices = page.xpath(“//div[@class=totalPrice]/span/text()”) locationes = page.xpath(“//div[@class=positionInfo]/a[1]/text()”) wherees = page.xpath(“//div[@class=positionInfo]/a[2]/text()”) for i, price, totalPrice, location, where in zip(content, MeanPrice, totalPrices, locationes, wherees): print(“爬取:{}”.format(page_url)) if not i.split(“|”)[0]: number = else: number = i.split(“|”)[0] if not i.split(“|”)[1][:-3]: square = else: square = i.split(“|”)[1][:-3] if not i.split(“|”)[2]: direction = else: direction = i.split(“|”)[2] if not i.split(“|”)[3]: decorate = else: decorate = i.split(“|”)[3] if not i.split(“|”)[4]: floor = else: floor = i.split(“|”)[4] if not i.split(“|”)[5]: time = else: time = i.split(“|”)[5] print( “正在写入 :” + number + , + square + , + direction + , + decorate + , + floor + , + time + , + price + , + totalPrice + , + location + , + where + \n) f.write( number + , + square + , + direction + , + decorate + , + floor + , + time + , + price + , + totalPrice + , + location + , + where + \n)运行上面代码,可以得到下面的结果
这里一共有3000条数据,也是全部的数据。
数据分析
绘制箱型图
读取数据就是一个pandas库读取,需要设置encoding=gbk。因为我设置了中文编码,然后绘制箱型图,就是matplotlib中的boxplot,然后我随便抽选出七里庄,万寿路,万达,三元桥,东大桥绘制箱型图,效果如下。
线性回归
然后就是二手房面积和二手房总价关系,最二乘法本质上就是LinearRegression,效果如下。
代码
@Author: Runsen @微信公众号: 润森笔记 @博客: https://blog.csdn.net/weixin_44510615 @Date: 2020/5/28 import numpy as np import pandas as pd import matplotlib as mpl from matplotlib import pyplot as plt from sklearn.linear_model import LinearRegression mpl.rcParams[font.sans-serif] = [simHei] mpl.rcParams[axes.unicode_minus] = False data = pd.read_csv(“data.csv”,encoding=gbk) data.dropna(inplace=True) print(np.unique(data[where])) data_qilizhaun = data[data[where] ==七里庄][MeanPrice] data_wangshoulu = data[data[where] ==万寿路][MeanPrice] data_wangda = data[data[where] ==万达][MeanPrice] data_sanyuanqiao = data[data[where] ==三元桥][MeanPrice] data_dongdaqiao = data[data[where] ==东大桥][MeanPrice] plot_data = np.array([data_qilizhaun,data_wangshoulu,data_wangda,data_sanyuanqiao,data_dongdaqiao]) labels = [七里庄,万寿路,万达,三元桥,东大桥] plt.boxplot(plot_data,labels = labels) plt.title(“北京七里庄,万寿路,万达,三元桥和东大桥二手房平方米平均价 单位:元”) plt.show() X = np.array(data[square]).reshape(-1, 1) y = data[totalPrice].astype(np.int).values model = LinearRegression() model.fit(X,y) plt.scatter(X,y,c=g) plt.xlabel(“北京二手房面积 单位:平方米”) plt.ylabel(“北京二手房总价 单位:万元”) plt.title($y=%.4fx + %.4f$ % (model.coef_ , model.intercept_ )) plt.plot(X, model.predict(X),r) plt.show(),不是计算机专业的大学生,其实我也不是。应该选修了Python数据分析的学堂在线的公开课吧,最近应该要做作业,然后作业就是要求爬取链家网北京二手房信息,并进行线性回归建模。其实没啥什么难度。具体要求就是下面几张图。
我是一个学到啥写啥的,好博主。今天Runsen帮你们做了,效果如下图所示。