泉州信息工程学院
软件学院
课程设计报告书
课 程 名: Python课程项目
课程设计项目名称: Python链家爬虫设计
班 级: 16软件工程3班
学 号: 20160850
姓 名: 占坤辛
一、项目简介
1.1项目博客地址
https://blog.csdn.net/qq_44036133/article/details/103661011
1.2项目完成的功能与特色
成功的爬到链家网的数据,生成CSV文件保存数据,并对爬到的数据进行可视化分析绘制成柱状图 箱型图和核密度图
二、自己负责的模块
2.1 自己负责模块列表
爬虫程序的代码书写,材料的查找
2.2 各模块详细描述(名称,功能,运行截图,关键源代码)
数据的爬取:
关键代码:
headers = {‘User-Agent’:‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36’}
#获取索引页的源代码
def get_page_index(url):
try:
response = requests.get(url,headers = headers) #get请求方式获取
if response.status_code == 200:
return response.text
return None
except RequestException:
print(‘请求页面出错…’)
return None
#获取索引页的url
def parse_page_index(html):
pattern = re.compile(’<a class="" href="(.*?)" target="_blank" data-log’,re.S)
items = re.findall(pattern,html)
return items
#获取详情页的url
def get_page_detail(url):
try:
response = requests.get(url,headers = headers)
if response.status_code == 200:
return response.text.encode(‘utf-8’)
return None
except RequestException:
print(‘请求页面出错…’)
return None
#获取详情页具体信息
def parse_page_detail(html):
soup = BeautifulSoup(html,‘lxml’)
infos = {}
infos[‘小区名称’] = soup.select(’.info’)[0].get_text()
infos[‘所在区域’] = soup.select(’.info a’)[0].get_text()
infos[‘房屋户型’] = soup.select(’.content ul li’)[0].get_text().replace(‘房屋户型’,’’)
infos[‘所在楼层’] = soup.select(’.content ul li’)[1].get_text().replace(‘所在楼层’,’’)
infos[‘建筑面积/㎡’] = soup.select(’.content ul li’)[2].get_text().replace(‘建筑面积’,’’).replace(‘㎡’,’’)
infos[‘户型结构’] = soup.select(’.content ul li’)[3].get_text().replace(‘户型结构’,’’)
infos[‘房屋朝向’] = soup.select(’.content ul li’)[6].get_text().replace(‘房屋朝向’,’’)
infos[‘装修情况’] = soup.select(’.content ul li’)[8].get_text().replace(‘装修情况’,’’)
infos[‘配备电梯’] = soup.select(’.content ul li’)[11].get_text().replace(‘配备电梯’,’’)
infos[‘房屋价格/万元’] = soup.select(’.total’)[0].get_text()
#print(infos)
yield infos
fileheader = [‘小区名称’,‘所在区域’,‘房屋户型’,‘所在楼层’,‘建筑面积/㎡’,‘户型结构’,‘房屋朝向’,‘装修情况’,‘配备电梯’,‘房屋价格/万元’]
#主函数
def main(page):
url = ‘https://bj.lianjia.com/ershoufang/pg’ + str(page) + ‘/’
html = get_page_index(url)
for item in parse_page_index(html):
html_detail = get_page_detail(item)
if html_detail:
results = parse_page_detail(html_detail)
for result in results:
save_to_csv(result)
if name == ‘main’:
write_csv_header(fileheader)
for page in range(1,2):
main(page)
功能:爬取链家网的数据
数据的可视化分析:
功能:数据处理和数据图形的绘制
关键代码:
fileheader = [‘小区名称’,‘所在区域’,‘房屋户型’,‘所在楼层’,‘建筑面积/㎡’,‘户型结构’,‘房屋朝向’,‘装修情况’,‘配备电梯’,‘房屋价格/万元’]
#将标题写入csv文件
def write_csv_header(fileheader):
with open(“lianjia.csv”,“a”,newline=’’,encoding = ‘utf-8’) as csvfile:
writer = csv.DictWriter(csvfile, fileheader)
writer.writeheader()
#将获取到的数据保存到csv文件
def save_to_csv(result):
with open(“lianjia.csv”, “a”,newline=’’,encoding = ‘utf-8’) as csvfile:
print(‘正在写入csv文件中…’)
writer = csv.DictWriter(csvfile, fieldnames = fileheader)
writer.writerow(result)
#设置图中汉字部分不会乱码
sns.set_style({‘font.sans-serif’:[‘simhei’,‘Arial’]})
#读取数据
data = pd.read_csv(‘lianjia.csv’)
data = data.drop([0])
df = data.copy()
#计算房屋均价
df[‘房屋均价/万元’] = df[‘房屋价格/万元’].astype(‘float64’)/df[‘建筑面积/㎡’].astype(‘float64’)
#对每个区的总房屋数量进行分组
df_house_count = df.groupby(‘所在区域’)[‘房屋价格/万元’].count().sort_values(ascending = False).to_frame().reset_index()
箱型图:
关键代码:
sns.boxplot(x= ‘所在区域’,y = ‘房屋均价/万元’,data = df)
plt.title(‘北京各区二手房每平米单价对比’,fontsize = 15)
plt.xlabel(‘所在区域’)
plt.ylabel(‘房屋均价/万元’)
plt.show()
运行截图:
核密度图:
关键代码:
sns.distplot(df[‘建筑面积/㎡’],bins = 20,color = ‘r’)
sns.kdeplot(df[‘建筑面积/㎡’],shade = True,color = ‘g’)
plt.show()
运行截图:
柱状图:
关键代码:
sns.barplot(x = ‘所在区域’,y = ‘房屋价格/万元’,palette = ‘Blues_d’,data = df_house_count)
plt.title(‘北京各区二手房数量对比’,fontsize = 15)
plt.xlabel(‘所在区域’)
plt.ylabel(‘房屋数量’)
plt.show()
运行截图:
三、自己完成的工作量评估
工作量一般,代码较为单一实现过程较为容易
3.1 完成的模块数和代码行数
数据爬取,数据分析,图表的绘制
代码行数119
3.2 技术含量
运用了pandas Matpiotlib seaborn 等第三方库,实现了三个第三方库的绘图和可视化分析,运用了CSV的读写
3.3 自我评分
简单的爬虫程序设计
来源:CSDN
作者:qq_44036133
链接:https://blog.csdn.net/qq_44036133/article/details/103661011