From 8235bc13464233dd242d189f71ef17e81ff7b85b Mon Sep 17 00:00:00 2001
From: Zeng Jia Hua <501600635@qq.com>
Date: Mon, 27 May 2024 12:09:31 +0800
Subject: [PATCH] first commit
---
pythonProject1/.idea/.gitignore | 8 +
.../inspectionProfiles/profiles_settings.xml | 6 +
pythonProject1/.idea/misc.xml | 7 +
pythonProject1/.idea/modules.xml | 8 +
pythonProject1/.idea/pythonProject1.iml | 10 +
pythonProject1/Home.py | 204 +++++++++
pythonProject1/URL.txt | 5 +
.../__pycache__/Home.cpython-312.pyc | Bin 0 -> 11009 bytes
.../__pycache__/getData.cpython-312.pyc | Bin 0 -> 2426 bytes
.../__pycache__/line.cpython-312.pyc | Bin 0 -> 1899 bytes
.../__pycache__/map.cpython-312.pyc | Bin 0 -> 1942 bytes
pythonProject1/getData.py | 33 ++
pythonProject1/line.html | 424 ++++++++++++++++++
pythonProject1/line.py | 43 ++
pythonProject1/login.py | 45 ++
pythonProject1/map.html | 219 +++++++++
pythonProject1/map.py | 43 ++
pythonProject1/北京市区房价.csv | 0
18 files changed, 1055 insertions(+)
create mode 100644 pythonProject1/.idea/.gitignore
create mode 100644 pythonProject1/.idea/inspectionProfiles/profiles_settings.xml
create mode 100644 pythonProject1/.idea/misc.xml
create mode 100644 pythonProject1/.idea/modules.xml
create mode 100644 pythonProject1/.idea/pythonProject1.iml
create mode 100644 pythonProject1/Home.py
create mode 100644 pythonProject1/URL.txt
create mode 100644 pythonProject1/__pycache__/Home.cpython-312.pyc
create mode 100644 pythonProject1/__pycache__/getData.cpython-312.pyc
create mode 100644 pythonProject1/__pycache__/line.cpython-312.pyc
create mode 100644 pythonProject1/__pycache__/map.cpython-312.pyc
create mode 100644 pythonProject1/getData.py
create mode 100644 pythonProject1/line.html
create mode 100644 pythonProject1/line.py
create mode 100644 pythonProject1/login.py
create mode 100644 pythonProject1/map.html
create mode 100644 pythonProject1/map.py
create mode 100644 pythonProject1/北京市区房价.csv
diff --git a/pythonProject1/.idea/.gitignore b/pythonProject1/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/pythonProject1/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/pythonProject1/.idea/inspectionProfiles/profiles_settings.xml b/pythonProject1/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/pythonProject1/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pythonProject1/.idea/misc.xml b/pythonProject1/.idea/misc.xml
new file mode 100644
index 0000000..a50ac5b
--- /dev/null
+++ b/pythonProject1/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pythonProject1/.idea/modules.xml b/pythonProject1/.idea/modules.xml
new file mode 100644
index 0000000..fdd8fdf
--- /dev/null
+++ b/pythonProject1/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pythonProject1/.idea/pythonProject1.iml b/pythonProject1/.idea/pythonProject1.iml
new file mode 100644
index 0000000..2c80e12
--- /dev/null
+++ b/pythonProject1/.idea/pythonProject1.iml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pythonProject1/Home.py b/pythonProject1/Home.py
new file mode 100644
index 0000000..2ab9c31
--- /dev/null
+++ b/pythonProject1/Home.py
@@ -0,0 +1,204 @@
+import tkinter as tk
+import webbrowser
+from tkinter import ttk, messagebox
+import pandas as pd
+import requests
+from lxml import etree
+from map import map
+from line import line
+
+
+class Home():
+ def __init__(self):
+ self.root = tk.Tk()
+ self.root.title("购房推荐系统")
+ self.root.geometry("650x350+500+200")
+
+
+
+ self.Max_index = ''
+ self.Current_index = 1
+ # 把爬取的三条信息组成一个元组捆绑,变成一条记录
+ self.all_info = []
+ self.text=''
+
+ self.label = tk.Label(self.root, text="欢迎来到北京市购房推荐系统,请选择要查询的地区", font=('宋体', 20), background="#00ffff")
+ self.label.grid(row=0, column=0, columnspan=4, pady=(20, 0))
+
+ self.button_texts = ["海淀", "朝阳", "丰台", "西城", "东城", "昌平", "大兴", "通州", "房山", "顺义", "石景山",
+ "密云"]
+ for i, text in enumerate(self.button_texts):
+ self.button = tk.Button(self.root, text=text, command=lambda txt=text: self.on_button_click(txt))
+ row = i // 4 + 1
+ col = i % 4
+ self.button.grid(row=row, column=col, padx=10, pady=10)
+
+ self.btn_map=tk.Button(self.root,text='区位房价',command=self.open_map)
+ self.btn_map.place(relx=0.65, rely=0.8, relheight=0.10, relwidth=0.13)
+
+ self.btn_line=tk.Button(self.root,text="同比房价",command=self.open_line)
+ self.btn_line.place(relx=0.2, rely=0.8, relheight=0.10, relwidth=0.13)
+
+ self.root.mainloop()
+ def open_map(self):
+ map()
+ webbrowser.open('map.html')
+ self.clear_csv()
+ def open_line(self):
+ line()
+ webbrowser.open('line.html')
+ self.clear_csv()
+
+
+ #爬取数据并做匹配
+ def fetch_data(self,region, index='1'):
+ url = f"https://newhouse.fang.com/house/s/{region}/b9"+index
+ response = requests.get(url)
+ response.encoding = "utf-8"
+ e = etree.HTML(response.text)
+ names = [n.strip() for n in e.xpath('//div[@class="nlcd_name"]/a/text()')]
+ addresses = e.xpath('//div[@class="address"]/a/@title')
+ prices = [d.xpath('string(.)').strip() for d in e.xpath('//div[@class="nhouse_price"]')]
+ if index=='1' and self.Max_index=='':
+ lasts = e.xpath('//a[@class="last"]/@href')
+ if len(lasts)!=0:
+ the_string = lasts[-1]
+ last_char = the_string[-2]
+ self.Max_index = str(last_char)
+ else:
+ return 'False'
+
+ for name, address, price in zip(names, addresses, prices):
+ self.all_info.append((name, price, address))
+ return self.all_info
+
+
+ # 展示图表数据函数
+ def show_data_in_table(self,data):
+ self.popup = tk.Toplevel(self.root)
+ self.popup.geometry('500x500')
+ self.popup.title("购房信息详情")
+
+ # 使用pandas DataFrame处理数据
+ df = pd.DataFrame(data, columns=["楼盘名称", "价格", "地区"])
+ # 创建Treeview部件,显式指定列ID
+ tree = ttk.Treeview(self.popup, columns=("name", "price", "area"), show="headings")
+ # 设置列标题,使用之前定义的列ID
+ tree.heading("#1", text="楼盘名称")
+ tree.heading("#2", text="价格")
+ tree.heading("#3", text="地区")
+ # 设置列宽度
+ tree.column("#1", width=100, anchor='center')
+ tree.column("#2", width=100, anchor='center')
+ tree.column("#3", width=100, anchor='center')
+
+ # 将DataFrame数据插入Treeview
+ for index, row in df.iterrows():
+ tree.insert('', 'end', values=row.tolist())
+
+ # 添加垂直滚动条
+ vsb = ttk.Scrollbar(self.popup, orient="vertical", command=tree.yview)
+ tree.configure(yscrollcommand=vsb.set)
+ vsb.pack(side='right', fill='y')
+
+ tree.pack(fill='both', expand=True)
+
+ # 添加底部框架用于放置翻页按钮
+ footer_frame = ttk.Frame(self.popup)
+ footer_frame.pack(side='bottom', fill='x')
+
+ footer_frame = ttk.Frame(self.popup)
+ footer_frame.pack(side='bottom', fill='x')
+
+ # 上一页按钮
+ prev_button = ttk.Button(footer_frame, text="上一页", command=self.go_to_previous_page)
+ prev_button.pack(side='left', padx=5, pady=5)
+
+ # 下一页按钮
+ next_button = ttk.Button(footer_frame, text="下一页", command=self.go_to_next_page)
+ next_button.pack(side='right', padx=5, pady=5)
+
+ self.center_window()
+
+
+ # 上翻页函数
+ def go_to_previous_page(self):
+ if self.Current_index+90 -1 >=91:
+ self.popup.destroy()
+ self.Current_index -= 1
+ print(self.Current_index)
+ self.all_info.clear()
+ # 把选择的区域 传入通过fetch传入url
+ data = self.fetch_data(self.text, str(self.Current_index))
+ # 网页地址传给展示页面
+ self.show_data_in_table(data)
+ else:
+ messagebox.showinfo(message='这是第一页')
+
+ # 下翻页函数
+ def go_to_next_page(self):
+ if self.Current_index + 1 <= int(self.Max_index):
+ self.popup.destroy()
+ self.Current_index += 1
+ print(self.Current_index)
+ self.all_info.clear()
+ # 把选择的区域 传入通过fetch传入url
+ data = self.fetch_data(self.text, str(self.Current_index))
+ # 网页地址传给展示页面
+ self.show_data_in_table(data)
+
+ else:
+ messagebox.showinfo(message='末尾')
+ # 首页点击函数
+ def on_button_click(self,text, index='1'):
+ self.Max_index = ''
+ self.Current_index = 1
+ self.all_info = []
+ self.text = ''
+
+ simplified_text = {
+ "海淀": "haidian",
+ "朝阳": "chaoyang",
+ "丰台": "fengtai",
+ "西城": "xicheng",
+ "东城": "dongcheng",
+ "昌平": "changping",
+ "大兴": "daxing",
+ "通州": "tongzhou",
+ "房山": "fangshan",
+ "顺义": "shunyi",
+ "石景山": "shijingshan",
+ "密云": "miyun",
+ }.get(text, "未知区域")
+
+ self.text=text
+ # 把选择的区域 传入通过fetch传入url
+ if self.fetch_data(simplified_text, index)!="False":
+ data = self.fetch_data(simplified_text, index)
+ # 网页地址传给展示页面
+ self.show_data_in_table(data)
+ else:
+ messagebox.showinfo(message='该地区暂无数据!')
+
+ def center_window(self, width=1200, height=600):
+ # 获取屏幕宽度和高度
+ screen_width = self.popup.winfo_screenwidth()
+ screen_height = self.popup.winfo_screenheight()
+
+ # 计算窗口的左上角应该放置的位置
+ left = (screen_width / 2) - (width / 2)
+ top = (screen_height / 2) - (height / 2)
+
+ # 设置窗口的位置和大小
+ self.popup.geometry("{0}x{1}+{2}+{3}".format(width, height, int(left), int(top)))
+
+ def clear_csv(self):
+ with open('北京市区房价.csv', 'w', encoding='utf-8', newline=''):
+ pass
+
+
+
+
+
+
+
diff --git a/pythonProject1/URL.txt b/pythonProject1/URL.txt
new file mode 100644
index 0000000..ca1a02a
--- /dev/null
+++ b/pythonProject1/URL.txt
@@ -0,0 +1,5 @@
+阿里云 http://mirrors.aliyun.com/pypi/simple/
+中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
+豆瓣 http://pypi.douban.com/simple/
+清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
+中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
\ No newline at end of file
diff --git a/pythonProject1/__pycache__/Home.cpython-312.pyc b/pythonProject1/__pycache__/Home.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3d339f7f2acf2366e2e06f6e7641a53c56993e34
GIT binary patch
literal 11009
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
C{O5oG
literal 0
HcmV?d00001
diff --git a/pythonProject1/__pycache__/map.cpython-312.pyc b/pythonProject1/__pycache__/map.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..b9193c61c6dce954c9623df6a15616ce7286dd45
GIT binary patch
literal 1942
zcmZuyOKclO7@qY$y!OV46DM(6w@XP{)CKY=YWkp6rHY^`5i}GKps1=@JZopodUv%u
zj&PJnDHOFx6%Yx@2Od(nq4A1emwPIf>{5
zD_V-qMTt(l2Ik}nuSt)n6OF_Co4QLx)NzsN*#1R|3kI6fk)G?s2?R}tC%?TPNcbv1
z95b$U00$7Y2csx36iUd!NR40XB)<%nNLo-VMD`I%F&gq1Vt$voB@T)KOJ=rE7L^b)
z1SJ?{af%714JGPkc&$@Kv6pE=$>KlLLm%TY4>ZTKM7hKj`LJ9j|s@DGu?$MCL5FCJm1pw1Oa!(jlOc0RI=U?f72{JSu3nl%NESXI^ixp3|Ntrpvay(*+2Qh;>
zv0@no!-nle_k!t{b&KR5tQTd1#^zDU(gr>9{Q@}RLM(fR4zuJ8u#j`y3g&%8YW57*
z(sKrubU&zF%v+9*u;@8u8)DwH5tbHot8DmKLXKtn#O8WL?a}*z1=@5hPm})7QpD>J
z;vU~X*@ESKq+9L$V(-#}3JCExg1iHqcrQqsd;^1}sc_$kL
z=1EyTeK?26c&tsmdfBby=5?=h+4Y>FkwZRFpn1oBtGzsSnfAf0c*n_}V4`=(f05jS
z6|f~J*QU3W#8+p&IJ2G}zn$Jx&aX^0m7cFN>j%fyljC(|qM=OImB|g|hSu=
z@wz(MP*2y@(+%}}T|Iwq7@JbF1f?eIw0*gDsKo
zkGEtnu&+A1I@=t`G*eVJKy^b08fmSb)|$QPX73;#I@yW}L-E}d5QkczoA^{|$eF7%
zHx~aA_V1CF0WF4;ZpEO@M*dh^v@byHiQ1zl<7s5VlB?TL_dWXQ3@%{M{GWhF|1-Tw
tGCh{hmK<2NjC0-@vZOE5r(ca-p5wUt;Lv?=Ehg5iS$#`yXV%-H`wQ
literal 0
HcmV?d00001
diff --git a/pythonProject1/getData.py b/pythonProject1/getData.py
new file mode 100644
index 0000000..c2b68bb
--- /dev/null
+++ b/pythonProject1/getData.py
@@ -0,0 +1,33 @@
+import csv
+import requests
+from bs4 import BeautifulSoup
+
+def getData():
+ url='https://bj.cityhouse.cn/market/rankforsale.html'
+ headers={
+ 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
+ 'Accept-Language':'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+ 'Content-Type':'text/html; charset=utf-8',
+ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0'
+ }
+ response=requests.get(url=url,headers=headers)
+ soup = BeautifulSoup(response.text, 'lxml')
+ tbody=soup.find('tbody')
+
+ Ver_index=len(tbody.findAll('tr'))
+ Ori_index=len(tbody.findAll('tr')[0].findAll('th'))
+
+ with open('北京市区房价.csv','a',encoding='utf-8',newline='') as f:
+ write=csv.writer(f)
+ for i in range(Ver_index):
+ list=[]
+ if i==0:
+ for j in range(Ori_index):
+ list.append(tbody.findAll('tr')[i].findAll('th')[j].text.strip())
+ else:
+ for j in range(Ori_index):
+ list.append(tbody.findAll('tr')[i].findAll('td')[j].text.strip())
+ write.writerow(list)
+ print('shu数据获取完毕')
+if __name__ == '__main__':
+ getData()
\ No newline at end of file
diff --git a/pythonProject1/line.html b/pythonProject1/line.html
new file mode 100644
index 0000000..823d33a
--- /dev/null
+++ b/pythonProject1/line.html
@@ -0,0 +1,424 @@
+
+
+
+
+ 多折线
+
+
+
+
+
+
+
+
diff --git a/pythonProject1/line.py b/pythonProject1/line.py
new file mode 100644
index 0000000..548bda2
--- /dev/null
+++ b/pythonProject1/line.py
@@ -0,0 +1,43 @@
+import pyecharts
+from pyecharts.charts import Line
+from pyecharts import options as opts
+import pandas as pd
+from getData import getData
+def line():
+ getData()
+ # 读取数据
+ data = pd.read_csv('北京市区房价.csv', encoding='utf-8')
+ datas = data['行政区']
+ compare_month = data['环比上月']
+ compare_year = data['同比上年']
+
+ # 移除百分号并转换为浮点数
+ mothon_list_float = [float(x.strip('%'))for x in compare_month] # 转换为小数(百分比转为0-1之间)
+ year_list_float = [float(x.strip('%'))for x in compare_year] # 转换为小数(百分比转为0-1之间)
+
+ # 转换为列表
+ name_list = datas.tolist()
+
+ # 打印转换后的列表以验证
+ print(mothon_list_float)
+
+ # 创建Line对象并设置数据
+ line = Line(
+ init_opts=opts.InitOpts(width='1000px',height='500px',page_title="多折线")
+ )
+ line.add_xaxis(xaxis_data=name_list) # x轴
+ line.add_yaxis(series_name='环比上月', y_axis=mothon_list_float) # 使用转换后的数据
+ line.add_yaxis(series_name='同比上年', y_axis=year_list_float) # 使用转换后的数据
+
+ line.set_global_opts(
+ title_opts=opts.TitleOpts(
+ title="北京市区房价趋势图"
+ ),
+ toolbox_opts=opts.ToolboxOpts(
+ is_show=True
+ )
+ )
+
+ # 渲染图表到HTML文件
+ line.render('line.html')
+
diff --git a/pythonProject1/login.py b/pythonProject1/login.py
new file mode 100644
index 0000000..1f94e28
--- /dev/null
+++ b/pythonProject1/login.py
@@ -0,0 +1,45 @@
+from tkinter import *
+import Home
+
+user_login={'aaa':'123456','bbb':'888888','ccc':'333333'}
+count=0
+def login():
+ global count
+ username=entry_username.get()
+ if username not in user_login:
+ lable_message.config(text="账号错误!")
+ else:
+ password=entry_password.get()
+ if(password==user_login[username]):
+ lable_message.config(text="登陆成功!")
+ window.destroy()
+ h=Home.Home()
+ else:
+ lable_message.config(text="你还可以尝试{}次".format(2-count))
+ count+=1
+ if count==3:
+ lable_message.config(text="登陆失败!")
+ btn_login.config(state='disabled')
+window = Tk()
+window.title('用户登陆')
+window.geometry("300x200")
+
+lable_usename=Label(window,text="账号:")
+lable_usename.pack()
+entry_username=Entry(window)
+entry_username.pack()
+
+lable_password=Label(window,text="密码")
+lable_password.pack()
+entry_password=Entry(window)
+entry_password.pack()
+
+#按钮登陆绑定login函数
+btn_login=Button(window,text="登陆",command=login)
+btn_login.pack()
+lable_message=Label(window,text="")
+lable_message.pack()
+
+window.mainloop()
+
+
diff --git a/pythonProject1/map.html b/pythonProject1/map.html
new file mode 100644
index 0000000..d7d89ca
--- /dev/null
+++ b/pythonProject1/map.html
@@ -0,0 +1,219 @@
+
+
+
+
+ 地图
+
+
+
+
+
+
+
+
+
diff --git a/pythonProject1/map.py b/pythonProject1/map.py
new file mode 100644
index 0000000..54aca7d
--- /dev/null
+++ b/pythonProject1/map.py
@@ -0,0 +1,43 @@
+from pyecharts.charts import Map
+from pyecharts import options as opts
+import pandas as pd
+from getData import getData
+
+def map():
+ getData()
+ data = pd.read_csv('北京市区房价.csv',encoding='utf-8')
+ info = data[['行政区','均价(元/㎡)']].copy()
+ # 移除千分号,转换为浮点数,然后四舍五入到最接近的整数(或者直接使用astype(int)向下取整)
+ info['均价(元/㎡)'] = info['均价(元/㎡)'].str.replace(',', '').astype(float).round().astype(int)
+ info_list = info.values.tolist()
+
+ print(info_list)
+
+ map=Map(
+ init_opts=opts.InitOpts(
+ page_title="地图"
+ )
+
+ )
+ map.add(
+ series_name="平均房价",
+ data_pair=info_list,
+ maptype="北京",
+ zoom=1,
+ )
+ map.set_global_opts(
+ title_opts=opts.TitleOpts(
+ title="北京市市区",
+ pos_left='center',
+ ),
+ legend_opts=opts.LegendOpts(
+ pos_left="left", # 图例在左边
+ orient="vertical" # 垂直排列图例
+ ),
+ visualmap_opts=opts.VisualMapOpts(
+ max_=130000,
+ min_=19000,
+ range_color=['#1E9600','#fff200','#ff0000']
+ )
+ )
+ map.render('map.html')
\ No newline at end of file
diff --git a/pythonProject1/北京市区房价.csv b/pythonProject1/北京市区房价.csv
new file mode 100644
index 0000000..e69de29