ZXC1020

前言:原方案是设计爬取起点中文网月票排行榜并处理数据

 

 

爬取后发现数据量不够,无法做可视化。

 

 

重新爬取发现网站对月票数据进行了加密处理,学识有限便放弃这一课程设计了。

爬取的数据图片

 

链家网上关于福州二手房每平米价格爬取及数据处理

一,设计方案

1.爬取的目标是链家网上福州二手房的价格信息(https.//fz.lianjia.com/xiaoqu/ )

2.网页信息有房屋每平米单价,简介等等

3.设计方案:通过Jupyter Notebook 运用requests,BeautifulSoup库爬取信息并保存,再进行find遍历查取所需信息,并进行数据可视化。

 

.。主题页面源代码分析标签

进入网页打开源代码,发现所需的信息的标签为li,并与其他房产信息在ul下。继续 打开标签,确定这是我们所需的信息。

 

 

 

三。运行代码进行爬取实践

1,爬取

 

 

保存结果文件到Excle

 

 

2,数据清洗

3.进行数据可视化,制作直方图,折线图等

直方图:

 

 

折线图:

 

 

建立一元二次方程并做图

 

 

 

 

源代码

 

import requests#导入库
from bs4 import BeautifulSoup
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib
from scipy.optimize import leastsq
from numpy import genfromtxt
url=\'https://fz.lianjia.com/xiaoqu/\'
headers={
\'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363\'
}#伪装爬虫
resp=requests.get(url)#发送requests请求
#print(resp.text)
html=resp.text
soup=BeautifulSoup(html,\'lxml\')
#print(soup)
infos=soup.find(\'ul\',{\'class\':\'listContent\'}).find_all(\'li\')#find查询
#print(infos)
for info in infos:
    name=info.find(\'div\',{\'class\':\'title\'}).find(\'a\').get_text()
    #print(name)
    price=info.find(\'div\',{\'class\':\'xiaoquListItemPrice\'}).find(\'div\',{\'class\':\'totalPrice\'}).find(\'span\').get_text()
    #print(price)
    data=(name,price)
    #print(data)
    D=pd.DataFrame(data,index=["简介","平方单价"])
    #print(D.T)
    with open(r\'C:\Users\86150\Desktop\house/abc.scv\',\'a\',encoding=\'utf-8\') as f:
        f.write(\'{},{}\n\'.format(nameprice))#保存到Excel

#数据清洗
print(\'\n====各列是否有缺失值情况如下:====\')
print(D.isnull()) 
print(D.duplicated())
print(D.isna().head()) 
print(D.describe())

#条形图
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10), dpi=80)
# 柱子总数
N = 30
# 包含每个柱子对应值的序列
values = (19441,7853,17715,20261,11373,18850,24968,17773,18653,23799,18027,22596,20842,
          15882,28645,21279,2726,15182,26430,2790,1542,1919,2939,18762,26299,18808,16852,8694,31261,20561)
# 包含每个柱子下标的序列
index = np.arange(N)
# 柱子的宽度
width = 0.45
p2 = plt.bar(index, values, width, label="num", color="#87CEFA")
# 设置横轴标签
plt.xlabel(\'region\')
# 设置纵轴标签
plt.ylabel(\'unit price\')
# 添加标题
plt.title(\'Second-hand house square unit price \')
# 添加纵横轴的刻度
plt.xticks(index, (\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'10\',\'11\',\'12\',\'13\',\'14\',\'15\',\'16\',\'17\',\'18\',\'19\',\'20\',\'21\',
                   \'22\',\'23\',\'24\',\'25\',\'26\',\'27\',\'28\',\'29\',\'30\'))
# plt.yticks(np.arange(0, 10000, 10))
# 添加图例
plt.legend(loc="upper right")
plt.show()

#折线图
from pylab import *
mpl.rcParams[\'font.sans-serif\'] = [\'SimHei\']  # 添加这条可以让图形显示中文

x_axis_data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
y_axis_data = [19441,7853,17715,20261,11373,18850,24968,17773,18653,23799,18027,22596,20842,15882,
               28645,21279,2726,15182,26430,2790,1542,1919,2939,18762,26299,18808,16852,8694,31261,20561]

# plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签
plt.plot(x_axis_data, y_axis_data, \'ro-\', color=\'#4169E1\', alpha=0.8, linewidth=1, label=\'二手房单价\')

# 显示标签,如果不加这句,即使在plot中加了label=\'一些数字\'的参数,最终还是不会显示标签
plt.legend(loc="upper right")
plt.ylabel(\'平方单价\')

plt.show()
# plt.savefig(\'demo.jpg\')  # 保存该图片


#一元二次
chinese=matplotlib.font_manager.FontProperties(fname=\'C:/Windows/Fonts/simsun.ttc\')

source_data=genfromtxt(\'C:/house.csv\',dtype=float,delimiter=\',\')
data=np.delete(source_data,0,axis=0)
price=data[:,0]
number=data[:,1]
X=np.array(number)
Y=np.array(price)
def func(p,x):
    a,b,c=p
    return a*x*x+b*x+c
def error(p,x,y):
    return func(p,x)-y
p0=[1,0]
def main():
    plt.figure(figsize=(8,6))
    p0=[1,30,30]
    Para=leastsq(error,p0,args=(X,Y))
    a,b,c=Para[0]
    print("a=",a,"b=",b,"c=",c)
    plt.scatter(X,Y,color="green",label="样本数据",linewidth=2)
    x=np.linspace(1,30,30)
    y=a*x*x+b*x+c
    plt.plot(x,y,color="red",label="拟合曲线",linewidth=2)
    plt.legend(prop=chinese)
    plt.title("Second-hand house square unit price")
    plt.grid()
    plt.show()
main()

 

 

 

 

四。结论。

通过前段时间python课程的学习,加上这段时间爬虫程序的设计与实践。发现运用python可以做许多事情,编写各种程序,而爬虫程序更是可以进行数据获取及整合,通过清洗后可视化能更好的进行数据分析。可惜自身学识有限,在爬虫过程中遇到许多问题并不能很好解决,在查找资料的过程中无不为他人厉害的爬虫程序所驻足,忍不住想要一试,例如爬取歌单等等。这便是爬虫的魅力,做许多本想不到的事。此次制作更是让我明白,纸上功夫是没用的,想要学好还得实践才行,实践了才明白如何运用库,函数。

 

分类:

技术点:

相关文章: