1. #导入需要用到的模块
  2. import requests
  3. import pymysql
  4. import time
  5. from bs4 import BeautifulSoup
  6. import tkinter as tk
  7. import xlwt
  8. import importlib,sys
  9. importlib.reload(sys)
  10. from PIL import Image,ImageTk
  11. #背景图片
  12. def resize( w_box, h_box, pil_image):
  13. """调整图片大小,适应窗体大小"""
  14. """arg:: w_box:new width h_box:new height pil_image:img"""
  15. w, h = pil_image.size #获取图像的原始大小
  16. f1 = 1.0*w_box/w
  17. f2 = 1.0*h_box/h
  18. factor = min([f1, f2])
  19. width = int(w*factor)
  20. height = int(h*factor)
  21. return pil_image.resize((width, height), Image.ANTIALIAS)
  22.  
  23. #获取url下的页面内容,返回soup对象
  24. def get_page(url):
  25. responce = requests.get(url)
  26. soup = BeautifulSoup(responce.text,'html.parser')
  27. return soup
  28. #封装成函数,作用是获取列表页下面的所有租房页面的链接,返回一个连接列表
  29. def get_links(link_url):
  30. soup = get_page(link_url)
  31. links_div = soup.find_all('div',class_="pic-panel")
  32. links = [div.a.get('href') for div in links_div]
  33. return links
  34. def get_house_info(house_url):
  35. soup = get_page(house_url)
  36. price = soup.find('span',class_='total').text #价格
  37. unit = soup.find('span',class_='unit').text.strip() #单位 strip()函数去空格
  38. house_info = soup.find_all('p')
  39. area = house_info[0].text[3:] #面积
  40. layout = house_info[1].text[5:] #户型
  41. floor = house_info[2].text[3:] #楼层
  42. towards = house_info[3].text[5:] #朝向
  43. subway = house_info[4].text[3:] #地铁
  44. uptown = house_info[5].text[3:-8].strip() #小区
  45. location = house_info[6].text[3:] #位置
  46. info ={
  47. '价格':price,
  48. '单位':unit,
  49. '面积':area,
  50. '户型':layout,
  51. '楼层':floor,
  52. '朝向':towards,
  53. '地铁':subway,
  54. '小区':uptown,
  55. '位置':location
  56. }
  57. return info
  58. DATABASE = {
  59. 'host':'localhost',#如果是远程数据库,此处为远程服务器的ip地址
  60. 'database':'examination',
  61. 'user':'root',
  62. 'password':'123456',
  63. 'charset':'utf8mb4'
  64. }
  65. def get_db(setting):
  66. return pymysql.connect(**setting)
  67. def insert(db,house):
  68. table_name=cityEntry.get()+'_'+localEntry.get()
  69. values = "'{}',"* 8 +"'{}'"
  70. sql_values = values.format(house['价格'],house['单位'],house['面积'],house['户型'],
  71. house['楼层'],house['朝向'],house['地铁'],house['小区'],
  72. house['位置'])
  73.  
  74. sql = """
  75. insert into {0}(price,unit,area,layout,floor,towards,subway,uptown,location)
  76. values({1})
  77. """.format(table_name,sql_values)
  78. cursor = db.cursor()
  79. cursor.execute(sql)
  80. db.commit()
  81. def creatTable(db):
  82. table_name=cityEntry.get()+'_'+localEntry.get()
  83. sql = """
  84. CREATE TABLE `{}` (
  85. `price` varchar(80) DEFAULT NULL,
  86. `unit` varchar(80) DEFAULT NULL,
  87. `area` varchar(80) DEFAULT NULL,
  88. `layout` varchar(80) DEFAULT NULL,
  89. `floor` varchar(80) DEFAULT NULL,
  90. `towards` varchar(80) DEFAULT NULL,
  91. `subway` varchar(80) DEFAULT NULL,
  92. `uptown` varchar(80) DEFAULT NULL,
  93. `location` varchar(80) DEFAULT NULL
  94. );""".format(table_name)
  95. cursor = db.cursor()
  96. cursor.execute(sql)
  97. db.commit()
  98.  
  99. def main():
  100. db = get_db(DATABASE)
  101. try:
  102. creatTable(db)
  103. except:
  104. print("数据库已存在")
  105. pass
  106. num = int(numberEntry.get())
  107. for i in range(num):
  108. links = get_links("https://"+dict_loc['{}'.format(cityEntry.get())]+".lianjia.com/zufang/"+dict_loc['{}'.format(localEntry.get())]+"/pg{}/".format(i))
  109. for link in links:
  110. time.sleep(0.1)
  111. house = get_house_info(link)
  112. insert(db,house)
  113. lableInit.config(text="{}市{}区数据获取成功".format(cityEntry.get(),localEntry.get()))
  114. print('DONE')
  115.  
  116. def quitw():
  117. top.destroy()
  118.  
  119. def export():
  120. db = get_db(DATABASE)
  121. cursor = db.cursor()
  122. table_name=cityEntry.get()+'_'+localEntry.get()
  123. count = cursor.execute('select * from '+table_name)
  124. # 重置游标的位置
  125. cursor.scroll(0,mode='absolute')
  126. # 搜取所有结果
  127. results = cursor.fetchall()
  128. # 获取MYSQL里面的数据字段名称
  129. fields = cursor.description
  130. workbook = xlwt.Workbook()
  131. sheet = workbook.add_sheet('table_'+table_name,cell_overwrite_ok=True)
  132. # 写上字段信息
  133. for field in range(0,len(fields)):
  134. sheet.write(0,field,fields[field][0])
  135. # 获取并写入数据段信息
  136. row = 1
  137. col = 0
  138. for row in range(1,len(results)+1):
  139. for col in range(0,len(fields)):
  140. sheet.write(row,col,u'%s'%results[row-1][col])
  141. workbook.save(r'C:\Users\Lenovo\Desktop\{}.xls'.format(table_name))
  142. lableInit.config(text="共{}条数据导出成功!".format(count))
  143.  
  144. #构造字典
  145. dict_loc = {
  146. '北京':'bj',
  147. '东城':'dongcheng',
  148. '西城':'xicheng',
  149. '朝阳':'chaoyang',
  150. '海淀':'haidian',
  151. '丰台':'fengtai',
  152. '上海':'sh',
  153. '浦东':'pudong',
  154. '宝山':'baoshan',
  155. '杭州':'hz',
  156. '西湖':'xihu',
  157. '下城':'xiacheng',
  158. '余杭':'yuhang',
  159. '富阳':'fuyang',
  160. '郑州':'zz',
  161. '金水':'jinshui',
  162. '中原':'zhongyuan',
  163. '二七':'erqi',
  164. '高新':'gaoxin',
  165. '新郑市':'xinzhengshi',
  166. '洛阳':'luoyang',
  167. '嵩县':'songxian',
  168. '新乡':'xinxiang',
  169. '牧野':'muye'
  170. }
  171. if __name__ == "__main__":
  172. top = tk.Tk()
  173. top.title("链家")
  174. top.resizable(width=False,height=False)#设置不可拉伸
  175. top.geometry("410x510") #设置窗口大小
  176.  
  177. #添加背景图片
  178. canvas = tk.Canvas(top) #设置canvas
  179. pil_image = Image.open('lianjiabg2.png') #打开背景图片
  180. pil_image_resize = resize(410,510,pil_image) #将它放大保存
  181. im = ImageTk.PhotoImage(pil_image_resize)
  182. canvas.create_image(205,255,image = im) #将图片加载到canvas来
  183. canvas.place(x=0,y=0,height=510,width=410,anchor='nw')#放到屏幕当中
  184.  
  185. #图片
  186. photo = tk.PhotoImage(file="F:\CodeWorkspace\lianjia.png")
  187. imgLabel = tk.Label(top,image=photo,bg='#fbfbfb',width=410)
  188. imgLabel.grid(row=0,column=0,columnspan=2)
  189. #lable
  190. Label = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "请输入您要查询的地区")
  191. Label.grid(row=1,column=0,columnspan=2,pady=5)
  192. #市
  193. cityEntry = tk.Entry(top,width=12)
  194. cityEntry.grid(row=2,column=0,padx=5,pady=10,sticky="E")
  195. cityLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#d9f3e1', text = "市")
  196. cityLabel.grid(row=2,column=1,sticky="W")
  197. #区
  198. localEntry = tk.Entry(top,width=12)
  199. localEntry.grid(row=3,column=0,padx=5,pady=10,sticky="E")
  200. localLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#d9f3e1', text = "区")
  201. localLabel.grid(row=3,column=1,sticky="W")
  202. #lable2
  203. Label2 = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "请输入您要查询的页数\n(每页30条数据)")
  204. Label2.grid(row=4,column=0,columnspan=2)
  205. #信息数
  206. numberEntry = tk.Entry(top,width=12)
  207. numberEntry.grid(row=5,column=0,padx=5,pady=10,sticky="E")
  208. numberLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#abe1c1', text = "页")
  209. numberLabel.grid(row=5,column=1,sticky="W")
  210. #提交
  211. submit = tk.Button(top,bg='#589e6e',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="数据获取",command=main)
  212. submit.grid(row=6,column=0,columnspan=2,padx=3,pady=5)
  213. #lable3
  214. Label3 = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "将数据导出为Excel格式")
  215. Label3.grid(row=7,column=0,columnspan=2)
  216. #导出excel
  217. export = tk.Button(top,bg='#f9a33f',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="导出数据",command=export)
  218. export.grid(row=8,column=0,columnspan=2,padx=3,pady=5)
  219. #退出
  220. quitB = tk.Button(top,bg='#ff5757',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="退出",command=quitw)
  221. quitB.grid(row=9,column=0,columnspan=2,padx=3,pady=3)
  222. #反馈
  223. lableInitTitle = tk.Label(top,font = '正楷 -12',text="* * * 提 示 信 息 * * *",width=40,fg="#f9a33f")
  224. lableInitTitle.grid(row=10,column=0,columnspan=2,ipady=5)
  225.  
  226. lableInit = tk.Label(top,bg='#d9f3e1',font = '正楷 -12 ',text="请在上方输入您要查询的信息",width=40,fg="red")
  227. lableInit.grid(row=11,column=0,columnspan=2,ipady=5)
  228.  
  229.  

python爬虫-链家租房信息获取的更多相关文章

  1. python爬虫---链家网二手房价采集

    代码: import requests from lxml import etree import pandas as pd from pyecharts.charts import Bar from ...

  2. 【nodejs 爬虫】使用 puppeteer 爬取链家房价信息

    使用 puppeteer 爬取链家房价信息 目录 使用 puppeteer 爬取链家房价信息 页面结构 爬虫库 pupeteer 库 实现 打开待爬页面 遍历区级页面 方法一 方法二 遍历街道页面 遍 ...

  3. python抓取链家房源信息(二)

    试着用scrapy将之前写的抓取链家网信息的重新写了写 然后先是用了第一页的网页作为测试,调试代码,然后发现总是抓取的时候遇见了 类似于这样的问题,并且抓取不到信息 2017-03-28 17:52: ...

  4. python爬虫之User-Agent用户信息

    python爬虫之User-Agent用户信息 爬虫是自动的爬取网站信息,实质上我们也只是一段代码,并不是真正的浏览器用户,加上User-Agent(用户代理,简称UA)信息,只是让我们伪装成一个浏览 ...

  5. Python爬虫入门教程 23-100 石家庄链家租房数据抓取

    1. 写在前面 作为一个活跃在京津冀地区的开发者,要闲着没事就看看石家庄这个国际化大都市的一些数据,这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材. 我们需要爬取 ...

  6. Python爬虫入门教程石家庄链家租房数据抓取

    1. 写在前面 这篇博客爬取了链家网的租房信息,爬取到的数据在后面的博客中可以作为一些数据分析的素材.我们需要爬取的网址为:https://sjz.lianjia.com/zufang/ 2. 分析网 ...

  7. python抓取链家房源信息(三)

    之前写过一个链家网北京二手房的数据抓取,然后本来今天想着要把所有的东西弄完,但是临时有事出去了一趟,耽搁了一下,然后现在是想着把北京的二手房的信息都进行抓取,并且存储在mongodb中, 首先是通过' ...

  8. python抓取链家房源信息

    闲着没事就抓取了下链家网的房源信息,抓取的是北京二手房的信息情况,然后通过网址进行分析,有100页,并且每页的url都是类似的 url = 'https://bj.lianjia.com/ershou ...

  9. Python爬取链家二手房源信息

    爬取链家网站二手房房源信息,第一次做,仅供参考,要用scrapy.   import scrapy,pypinyin,requests import bs4 from ..items import L ...

随机推荐

  1. 20145101《Java程序设计》第6周学习总结

    20145101<Java程序设计>第6周学习总结 教材学习内容总结 第十章输入和输出 java.io.InputStream.java.io.OutputStream实例分别作为输入.输 ...

  2. 20145327 《网络对抗》Web安全基础实践

    20145327 <网络对抗>Web安全基础实践 实践过程 webgoat开启 java -jar webgoat-container-7.0.1-war-exec.jar 在浏览器输入l ...

  3. 完美解决vim在终端不能复制的问题

    以前 用xshell,或者其他工具ssh到远程服务器,vim不能复制,搜索说是vim的 -xterm_clipboard没有开启. 今天发现,至少鼠标复制是不需要这个东东的! 在stackoverfl ...

  4. luoguP2826 LJJ的数学课

    思路 把公式拆开维护两个值,一个a[i]的总和,一个a[i]*i的总和 也可以用树状数组维护,模板题 代码 #include <iostream> #include <vector& ...

  5. 1-20 RHEL7的启动原理和服务控制

    大纲: RHEL7启动原理 RHEL7服务启动配置 网络概述 发布内网服务器 ############################################################ ...

  6. CodeCombat多人游戏Greed

    题目的意思在于,更高效的Collect Gold:然后合理的安排生产出来的士兵: // This code runs once per frame. Build units and command p ...

  7. java 监控工具 jconsole

    如图

  8. 【TCP/IP详解 卷一:协议】第一章概论 学习笔记

    第一章 概述 游览了一下,本章主要是简介OSI模型的低层(1-4层).介绍了TCP/IP协议族的相关知识. TCP/IP的分层 Application <--> TCP / UDP < ...

  9. python urljoin问题

    如何去除url拼接的时候存在的遗留的'../'问题,可以参考如下的强制去除方法: def fix_URL(urlstring): parts = list(urlparse.urlparse(urls ...

  10. 【Python】【内置函数】【bytes&bytearray&str&array】

    [bytes] 英文文档: class bytes([source[, encoding[, errors]]]) Return a new “bytes” object, which is an i ...