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 zcmd5iZEzFknY+?TT1hL*U-%oxVB?@bY%n1qGz}q`P$2O%HR%Nhs>s^4ETONg*4S31 zJKCmqQbUS;y^QT7t>rWc=I|AF(oUR@UXp8Pnw$1!tk}e!4V`1|Y=eK5LOQwT$K5^8 zyV{j31nJz5&b{DwpZDG8ecq3KzF+;uX0uRG?)kX0$F-iK{u3K&VKTrCKL8^XPw}*$ z>Y~Y0*QJA}&QAsOUHSmi#n8%oLzj`fH+7ldsrR!1bC;RCWBitYrOQHKgWnpkc3Ejk zM;)Me*5A!2fK=m4u?+GOVSD15)dL0mq+Lh4LE4oAV{Jh0H6=J!th}H z-k{)CMk{rO6m_Em+9Q-e77YugpQXC=ybfxH*F$aKIi7izh9w)IWx|DYvAhXtGrVEp zjfJ=IW_Vh83-oe>R!5P{d?geR+;q-_EWmpByCFmUcQB)*z4fVU$w5D#fs>R|dz++u z>T%~_`b;^E49L^xGt_D77Ng7sM(MJncsTsKR6MCx zg@AIE3TL0{3A9tkk5kk!IQuvq*X8W0E{m%|g?AOx#dJM%g6g69qG!!h_Vf7lp}=bF z3Pe#cnzuw@4xWiZS6olpaL#c!Z(qHNm3h%e*I`E`87RAqLJ|Ccl6t6rUofTO-COx{?(uT(@NsKmG4hpeSYZ58}D3sXFO`Z zcjvZ&9Xq#e*|}}ombPu%WNHadvUZ6*)B<<7GEOcc`j8etClXB1zZ3 z9#O-o&+lsAeJnia?sbWQV_`Am6Wme+I;7rE@T*F5`!Uq}E#bk>*$4ctKsWDtFnR~+ zayq?1ujF*LJm3$xUH-^}04NA|0PzTZtp7Si&369PLZ>I)>6z_4G1uuoMcu#^pVNs& z@Q_XJP$1w6@~fyF9gK*4CgOIQ*00)~e|l5CK?l3$Qnj{s*Oi9qi$*8psv7Y1b8zCKYDf>Nf*y8M0sdqTlTT%c+ z*za-+vYEU=4?t$|l>!A^-k?7e3Ofv94W1$GC5s@ZD(ivYBWV7fZh#`9(U4j78%Aww zJ}I7fBnfN=AMjFn#mN5Q{XaO6U{0GCS?-KEX+C35+Gne_&a-!CIu_WPG+Q%Ui(S`P zs-_N*ix$_{CzyG*=5kdHG;NEekPeqBhsy2s%%J=FKlQ_Z)lsV+;N>^%Qp)?ih2V+Rq-GI5^$@;gR`={qr?}MEmK(i=|~l&kQ$@ZXdoYu@4)r;Y|Q= z#b*vD4=-?aX|66+HrY8XzOS3*>MnBou9=bUryNyLHF9+L=%_S4I5s#LeE-O=kAHA{ zeqAT5mBY1iNlrP16f?PFrs>1-S+-`L?O1|g-eGTwIcuIUPyY4${I7!_1m`QBASVLD zY)RV!TbpKUVb;vBS{Qa&IcSCAMYc`^FO|AUF%a*o8{XvlURm8OW$ZImQ19n@R57ZM z&y}SFRzTMgWq}o2dZmCLBo)=NZ0Q%eyFsZ&1W{&?C1tbQFStafJ96?IO_(r(%1U83 zaVLNoPE$D>ZBGRE28_m9Pa7_=rR0lS=GjI()uLq4MYihy#qP~0Wa{?OR}}YP^$=Ej zv3eM)-0kjycC?5HmL{&Ph@O}_RNXl@8f=otMH1R_7w z$8?IHmE(J$ZqF+*y=orf5Cg=RtOqV>UawE{c(a3Jj8F4hv%MNEL(Jeq1DjWPM#X5S z&KTV~59QV!2h|=o#*9AAQ_K!h`D|Esx}2fnCcrC9*Pzmkv$w!7su(b{IWzMHnAsdN z7hI`H#s7kJHNv_qKt;#1C%^*}4}ruKXLq1NyqUcH(k)hJQD=)=CA4y+#H?yBZ#{7z z(5{VHd9E7X#km;A+X!Tn&=isqv#Izo%Bg*`AU#+lX)#316k}r+)jtQ%zX?2l;GcL= z+#WB6wHJsJd|Di#&II0kQLH#-@6ou2rcO6ARN?WR@Re!!iyQk@$lOmk>>bgKy^<7; z>~3uh3jMvIzKGD$;|h9O!1lM2W^1H1s&DPS|8qm1)N}W)=*HGo-h1+?hunTwB=Y5r zLBE@K23-MRgIF$bbW%a+Ik`0f5yCXnM48FuOeL@7RxZWdx zYas;PAs(oTXlEf}KJwV388=`c?2>wA15O$iQR&HgKd4JRbjbQB^xchpMpqb=DDNmy z?6*-AJl;@HHYlEkzEAYyl#y^K7!hO|{=+*w81N!82LK?=%SN)x2)Z4(IE&OPIFJtSO4SVCfMgcdwIoNv^1!=(TLey)Z1Y6O{caYO%O& z`rhfyGmW!F56<+Zi`oYFR}lUy>w{jbJ5Z5--|D<-CQ>ROgtH%W$XTQeLYpuN&o3TN}i6O$Mr!~<$jL&mvzniOBi>q z5=RwHl>cVnt6WoGD9r-GiJ?zk$x#`aSpiHmD|y9ND2@vUbRebeS&6=-W2&nq>+u0#Jv)VnLMy?f=Q z(dD7%ubiF!BWgs*F|4HCC155EMPsG{(?$`8UUUJ9=!QyWT%zET*gAunF^7}Ix71)D z`u#G~9g=#Fz)~@8kc|R(CPDBRpjQe7WO{(4rIu#Cw={EVb>inDN;cdz2tCp&IyJEU zL3oJZQ&UQI2F=CN%ySC5qgrf+w#*(0h5f=w!7rlpfNK#7_k~5|3ekZbx-c)B+rf`` zL!2ZK!6=moz=lw_k6@_QqaZ0;mG?gn4RFi1w4 z-JxKQ*V88o;97x428liQ3Gmm*EIV+PGEc}Ug}@DjslXL=hT(!mwkw@Ma4nS%oAObd z{or|p`W+UdLUOMh|V6IO}63`nGBq4C8U+K zPQ(Huvfh>AT9qQp5YGydM^4Gr?H8hz#KpS##bYo&q6Y^7VrEFDJT?4Os{CyAMD^Ud zEjfu3C95!caGq_>q*4~xsx(_QTYdLD+w!TADk?s6EO~6S>7&h$&f6YK=$7oIXJX0N zX#4n~u|u=l4$gkHYu^4;g27Y-BsYeRq>2*UJlmQ{c0ilOwj;ld_|~L#s6C~h{7M1> z+ntEEyZ3wNEn>-^Tl;fvgT=t=GR zl%-(Ffn-2g@?`Y=dw#w9gWdB*9SJ>73Auxm`>bcelPH26FS6D%Y?2-Fr1qinxjBZT8WSiW%3l|Ja2ujo!#7uho9GmQ33ZlB&h%T~ep+=PBSeen2v#W!-%J(GK< z_Y(AbVdb~U3u&2xQ80`n7^?xhF0G(;6+}4;u!GpIAG>FotYs%l={4qRkJZ_ zfG$X17X|mmt#fK4vw4QXD^iUom~pC5Ccv>R+66B~v_Gp)LDh$Ok*n{Gt&Co{GBu@W z({o^UGIziZPDCp$ej6&;#6!#}h6YK<1{Q$Cjs}u>6Vaw9S>MMIdJ!uI2eGI~Ffk3e z_ZsZ|0aVI8Kqfsm1Rc>TqI3!<$vC3F02KsyR{Mf=ecHNyv^#BWNNq@48&lmMSvRA! zLOi#?)u*}od9DH40Dr{Q0}9u8k*kM*Z>VXZv?*QMG|z3);-ov$+#U1WhRbD@BYTGT zr0zL;|HS=M?&+q5w)S*e`&`TZxw1zR?U#{SBM?fpU*sH1T*U&117|ni|1r1w<_w`G z2QyzN2iZI+d}%zayrO>R6L4-sPLOt9DHJy4^5-q&gpNXBv_?)eKEFM85;;Nc$t$T+54kX}@Vcp-ToYuSnGPZ%$_?7f=a;Ad zS^N=m%!~zoZa=;jmRIVlc^m%xzbs0KF--0Cy>=gJvQH zkT<5XI+@o&3;LDf0nMAu3lmI@60heO79`i~}%Rr;Hm9(65!JKXBRGBK_L^qdr z5Z{|H9{8dzFYkprVis~{p+U%7%BCJ6=#gAr*)-sF_W~@N`B2c40Rb)O2}3v_8+q3N zK3TYf^+X~4D6^RNi~xdcjP&*e2fea2((CnM?0}tyfOoJjD5Cu!my;_m|KpYM*Wl`N zd3;v%DrN$m0OGO|Z&k!)WP~K|mU#@`L|%sqgrvF_ z+)?coa4~ZWSY83WW^nf^8x||z{~hH2hQ$i_Ur&0VvwpF z!4GxJSsJg^Qs$~_^;B6UlDTZPpV^b#GrDJT|D3gL`oKrlFD+)Q$ew918@q2~HXi<% z+jq0TpmUC_dZXetX2Yj3Ghk-Q`OFitP6b`A+c{Fe#(HqcKrBFT$P*ni$kZ^IUic9g zz9qfJThKSDE6F~2U18yj=_H`0l$hq2o05^-?Gt!QE$qDuqY?9y+3>M3Juv=H7(<2s$&TsLPeLBhlgLLgkKh z<&L?^o#60S)s0)mEDKdT(^Wg?s_skJfKf}q;h(BAQFAp?+u;JTA8uie0tWUB=#NtU zw8PlZhe}2J84jovaY%BQ;8>Hv+2wqiI{G;GxSB=DHShQCq3dkUvhwm6-E5Z~uVm~%Rx>2vv&H{zFJ7`a^* z@y<0z(V6o70N{9KB%6huIuUz>#skkH&kC|p}J92 z2F;eOP(4js4PUxm#~Ipg)YTc<=^GDN3|;h%DxIN3p^21W-6rV-I46*~Xoj|ORg79g zamJ09ba6$*?_kd%s365M5b%?GBXYGaB0rNwiN8V!)3Ri>@G~6c5FQjigg&(1wmE{g*j&&iv|h+5sMcwNs(@X#oDx1!I^B%)_@aGXXfj5d!GRQ=*5!vPm$-$R3ga z9Qh&Wp&-ps12q6BRuh2Kbithf2_ivw=zny%(?e*^!;p<5J`@+uNO3t>Fv}4uevp$Nu+TQj^rqg=FDGFX#x?3dDKYHP+*z@DdL)Cx-gSAAzV^^q)bt>!EaE`x^7FR z$f#{&#^5;HbRlAzLPdr)MMa$kzd<>>VQbJd{oj4Kq6!T4TwI5NXVA16l^Ah3Cs)js zaGS2Vrm4JcFGyRE%b1V44Q_*`EbB;Cw8hY;XhYiuF3bUtwuM33p0aU8xtIFh6PD&D zEKg#~qLe+l)xg=HFX~gu_TrjT`Mx~o?L~FxXNIxpjQj{NdWr(#h5t2ow-Nni$(`hq-4M5MS1eL>M5W0e7j{0b`$gd{~}1?Y>Qn2`J!!6AgbVnQt| z%K{%{5ig1UAzib3=vi${Xuf!`&Uc`ekFjCsXD{)g0y_x%WkV~A;o4pPT{+YJPr<5u zScIGx4h18u7>3Q44)!g#-U%?wsFH8wLtO^qI=1=kGE z!Txq0`S&*L^EEUvHSNc`PIS~V0zUwm01OUD9;P*-NHOTI-_zj35E%6g8)6mSa5=(- zH|9K)W^M@vp^TCxdFt)J#l~^Nl8#nML{LQDu7nJe_HGp_-j*;{cuX1@R|L%xfh-3V zRigyle2qr^5|_|SNKy1H5i^l^8D^G8CzftqTfX_h^60IV;UAZNxZw+`mo$P+(zzCB z00UZ~7?e0(3~Lq<4hp;ou|F5rcMCNVU%4`~^4ayjKfkd&_Qmq`(UtG7cuF*@0x!m) zid2mZL!{^%xkl-I)~FC}qeco))GRvNA_y8K$yg-y$mT(XM^MpdyuiXxGvl=cu|2IK zg_kvJepVXPXj$QLwGKt!4HS!xk7KH`B&txORD7B!`W~*?&O)URhk-+y?WDpNSR$m+ zIVg?baff&nX+%_YU4B8l(h#rj@cUK@*8pPbMv z1zz!BApN{i$MK1g0SndxnbuVbxZgD`RJJc{tzR{PvToCT8|^e_0*@S^xNNL<`_Tn+mh-W;IwZEDr?(Ny) z9hu{cPpPKZS$EC6yKdH9H&dE*H)V_WWsWb|oOgBJS*By2IX%mq&N5wdrQP>Q z9pI4}RKEUl09SK>e>z-aogz6+=Sn8x)zDg(6rj=g%0dgJj{Ea!?|Q}y%u zr>fQiM|YDy@1~D7S~P24UyS9&zCMpxDaW&leq?H7zuK5vxw-eL8;NWT_Vs-S9^z@B z;NKgtW_>Frad812Qv6ude-PB2_<_?Rh#6;qoi7!h6ExConM3&Y!BD|C*&z)ro5`FU~bI*5v z?sv~U_h)`9De)j^P2HCU?r{kHK^42PyI`vgz$6lp$SA0fN>*WFY#+-|>`+k5(T6R} zC|n;8Hmo>f&ORsDxa+9Tm1KhapOma8$PnBu$0d+XRWoHZZcrGJ%uc}+!n+e%!Ueqp zzO64Hk4a=QwsU3|Fvz5Ss|{is?Maal*_>l$cNJ-rg1qX$on`=W7GeSM7ILK6PIME8 z*$4`=?=?UaHk~$C3J9 zwiIXQ0@W$At!BB61}ki|Cq}!0T@^qom`*K73MxFjLvV|SXlq*UQ5{c;3}6e2by1o^X-!2 zVO5mlkpw+PkG~q-m{@?&gb%bwpWWTKJFz}DvT^%{Whjh|77c|TzuRG&2!E=zwN)D? z+>2CL427@1+!)C|nqLSy2sb2)W|Z(zNsdHK;?abN6f$K~p?AzJ$7M4F7meOB&#*8o z8zB)cT974PL(*l*2*rh%MEGQg`V#g3x|qj5d|DV;C`|nfB%DRv3&;svMpPXFE{|oj z<{>^)Rh291u%%sfD{$FcqGn79`gM3;5MecuxO7PnLr@~Z4JfK$63#GnStGouDzX8p zrps|tr{|GinmuuK!9p%lP#_`fN2R2|8hhNqI~)qiQ@v(+d@IE~CEv1~)CG zWgwU?+n}5Mtlf5wcfQiECBsockM(Q1Iw*xr0}Pb*?V@_B->R0D)K9=jtK$I}&%-m5 zL95t%y=&cDa`WsbXY(~D=Z-FUU(a-|`21t_i@w8|b1PM~*&~Zp$1-oNRMuom7b}lu zx;J@rrh~a(+cC@BuFk%HXXw_@v@w-ht~-&h?a1S5=vPj^c0bVmjWChOzH{gDt;^Gw zruvs_j^_jInTyZ?LwR7*H}3nqG}E=sBhHie)Gy%%fIk0fMPRadym>l08~L?u=6{~fy?;Mzr8yINT@**4y` zQgITfsyr}B;LwBWrp4+eSRI%Go=rF6>b8-S<2S45EEld_81pXUh9`f$gz7q(CnV5r z(6{pY#&Zn*rJ?a0k72LfT2i8whx6lq3R{X6>zL{E|Dn?-gYcRV7X?G77u!0r)<%4b zwm?UEGjuzyS7WM}P^32fG^q3^V9-}<)4?#zL*!pWjccgsA*x(M^;_(7%whcn@cs?h 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