#导入需要用到的模块
import requests
import pymysql
import time
from bs4 import BeautifulSoup
import tkinter as tk
import xlwt
import importlib,sys
importlib.reload(sys)
from PIL import Image,ImageTk
#背景图片
def resize( w_box, h_box, pil_image):
"""调整图片大小,适应窗体大小"""
"""arg:: w_box:new width h_box:new height pil_image:img"""
w, h = pil_image.size #获取图像的原始大小
f1 = 1.0*w_box/w
f2 = 1.0*h_box/h
factor = min([f1, f2])
width = int(w*factor)
height = int(h*factor)
return pil_image.resize((width, height), Image.ANTIALIAS) #获取url下的页面内容,返回soup对象
def get_page(url):
responce = requests.get(url)
soup = BeautifulSoup(responce.text,'html.parser')
return soup
#封装成函数,作用是获取列表页下面的所有租房页面的链接,返回一个连接列表
def get_links(link_url):
soup = get_page(link_url)
links_div = soup.find_all('div',class_="pic-panel")
links = [div.a.get('href') for div in links_div]
return links
def get_house_info(house_url):
soup = get_page(house_url)
price = soup.find('span',class_='total').text #价格
unit = soup.find('span',class_='unit').text.strip() #单位 strip()函数去空格
house_info = soup.find_all('p')
area = house_info[0].text[3:] #面积
layout = house_info[1].text[5:] #户型
floor = house_info[2].text[3:] #楼层
towards = house_info[3].text[5:] #朝向
subway = house_info[4].text[3:] #地铁
uptown = house_info[5].text[3:-8].strip() #小区
location = house_info[6].text[3:] #位置
info ={
'价格':price,
'单位':unit,
'面积':area,
'户型':layout,
'楼层':floor,
'朝向':towards,
'地铁':subway,
'小区':uptown,
'位置':location
}
return info
DATABASE = {
'host':'localhost',#如果是远程数据库,此处为远程服务器的ip地址
'database':'examination',
'user':'root',
'password':'123456',
'charset':'utf8mb4'
}
def get_db(setting):
return pymysql.connect(**setting)
def insert(db,house):
table_name=cityEntry.get()+'_'+localEntry.get()
values = "'{}',"* 8 +"'{}'"
sql_values = values.format(house['价格'],house['单位'],house['面积'],house['户型'],
house['楼层'],house['朝向'],house['地铁'],house['小区'],
house['位置']) sql = """
insert into {0}(price,unit,area,layout,floor,towards,subway,uptown,location)
values({1})
""".format(table_name,sql_values)
cursor = db.cursor()
cursor.execute(sql)
db.commit()
def creatTable(db):
table_name=cityEntry.get()+'_'+localEntry.get()
sql = """
CREATE TABLE `{}` (
`price` varchar(80) DEFAULT NULL,
`unit` varchar(80) DEFAULT NULL,
`area` varchar(80) DEFAULT NULL,
`layout` varchar(80) DEFAULT NULL,
`floor` varchar(80) DEFAULT NULL,
`towards` varchar(80) DEFAULT NULL,
`subway` varchar(80) DEFAULT NULL,
`uptown` varchar(80) DEFAULT NULL,
`location` varchar(80) DEFAULT NULL
);""".format(table_name)
cursor = db.cursor()
cursor.execute(sql)
db.commit() def main():
db = get_db(DATABASE)
try:
creatTable(db)
except:
print("数据库已存在")
pass
num = int(numberEntry.get())
for i in range(num):
links = get_links("https://"+dict_loc['{}'.format(cityEntry.get())]+".lianjia.com/zufang/"+dict_loc['{}'.format(localEntry.get())]+"/pg{}/".format(i))
for link in links:
time.sleep(0.1)
house = get_house_info(link)
insert(db,house)
lableInit.config(text="{}市{}区数据获取成功".format(cityEntry.get(),localEntry.get()))
print('DONE') def quitw():
top.destroy() def export():
db = get_db(DATABASE)
cursor = db.cursor()
table_name=cityEntry.get()+'_'+localEntry.get()
count = cursor.execute('select * from '+table_name)
# 重置游标的位置
cursor.scroll(0,mode='absolute')
# 搜取所有结果
results = cursor.fetchall()
# 获取MYSQL里面的数据字段名称
fields = cursor.description
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('table_'+table_name,cell_overwrite_ok=True)
# 写上字段信息
for field in range(0,len(fields)):
sheet.write(0,field,fields[field][0])
# 获取并写入数据段信息
row = 1
col = 0
for row in range(1,len(results)+1):
for col in range(0,len(fields)):
sheet.write(row,col,u'%s'%results[row-1][col])
workbook.save(r'C:\Users\Lenovo\Desktop\{}.xls'.format(table_name))
lableInit.config(text="共{}条数据导出成功!".format(count)) #构造字典
dict_loc = {
'北京':'bj',
'东城':'dongcheng',
'西城':'xicheng',
'朝阳':'chaoyang',
'海淀':'haidian',
'丰台':'fengtai',
'上海':'sh',
'浦东':'pudong',
'宝山':'baoshan',
'杭州':'hz',
'西湖':'xihu',
'下城':'xiacheng',
'余杭':'yuhang',
'富阳':'fuyang',
'郑州':'zz',
'金水':'jinshui',
'中原':'zhongyuan',
'二七':'erqi',
'高新':'gaoxin',
'新郑市':'xinzhengshi',
'洛阳':'luoyang',
'嵩县':'songxian',
'新乡':'xinxiang',
'牧野':'muye'
}
if __name__ == "__main__":
top = tk.Tk()
top.title("链家")
top.resizable(width=False,height=False)#设置不可拉伸
top.geometry("410x510") #设置窗口大小 #添加背景图片
canvas = tk.Canvas(top) #设置canvas
pil_image = Image.open('lianjiabg2.png') #打开背景图片
pil_image_resize = resize(410,510,pil_image) #将它放大保存
im = ImageTk.PhotoImage(pil_image_resize)
canvas.create_image(205,255,image = im) #将图片加载到canvas来
canvas.place(x=0,y=0,height=510,width=410,anchor='nw')#放到屏幕当中 #图片
photo = tk.PhotoImage(file="F:\CodeWorkspace\lianjia.png")
imgLabel = tk.Label(top,image=photo,bg='#fbfbfb',width=410)
imgLabel.grid(row=0,column=0,columnspan=2)
#lable
Label = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "请输入您要查询的地区")
Label.grid(row=1,column=0,columnspan=2,pady=5)
#市
cityEntry = tk.Entry(top,width=12)
cityEntry.grid(row=2,column=0,padx=5,pady=10,sticky="E")
cityLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#d9f3e1', text = "市")
cityLabel.grid(row=2,column=1,sticky="W")
#区
localEntry = tk.Entry(top,width=12)
localEntry.grid(row=3,column=0,padx=5,pady=10,sticky="E")
localLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#d9f3e1', text = "区")
localLabel.grid(row=3,column=1,sticky="W")
#lable2
Label2 = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "请输入您要查询的页数\n(每页30条数据)")
Label2.grid(row=4,column=0,columnspan=2)
#信息数
numberEntry = tk.Entry(top,width=12)
numberEntry.grid(row=5,column=0,padx=5,pady=10,sticky="E")
numberLabel = tk.Label(top,fg='#589e6e',font = '隶书 -20 ',bg='#abe1c1', text = "页")
numberLabel.grid(row=5,column=1,sticky="W")
#提交
submit = tk.Button(top,bg='#589e6e',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="数据获取",command=main)
submit.grid(row=6,column=0,columnspan=2,padx=3,pady=5)
#lable3
Label3 = tk.Label(top,fg='#589e6e',bg='#f9f7ba',font = '隶书 -20 ', text = "将数据导出为Excel格式")
Label3.grid(row=7,column=0,columnspan=2)
#导出excel
export = tk.Button(top,bg='#f9a33f',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="导出数据",command=export)
export.grid(row=8,column=0,columnspan=2,padx=3,pady=5)
#退出
quitB = tk.Button(top,bg='#ff5757',fg='white',width=12,height=1,font = 'Helvetica -15 bold', text="退出",command=quitw)
quitB.grid(row=9,column=0,columnspan=2,padx=3,pady=3)
#反馈
lableInitTitle = tk.Label(top,font = '正楷 -12',text="* * * 提 示 信 息 * * *",width=40,fg="#f9a33f")
lableInitTitle.grid(row=10,column=0,columnspan=2,ipady=5) lableInit = tk.Label(top,bg='#d9f3e1',font = '正楷 -12 ',text="请在上方输入您要查询的信息",width=40,fg="red")
lableInit.grid(row=11,column=0,columnspan=2,ipady=5)
 
 

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. Mysql截取和拆分字符串函数用法

    Mysql截取和拆分字符串函数用法 截取字符串函数: SUBSTRING(commentid,9) 意思是:从第9个字符开始截取到最后.SUBSTRING的参数有三个,最后一个是截取的长度,默认是到结 ...

  2. C_Learning(2)

    /指针 /指针变量指向一个变量的地址 /给指针变量赋的值只能是地址 /指针变量的赋值 /{ int a; int *p; p=&a; } or { int a; int *p=&a; ...

  3. pip install MySQL-python

    在win7下安装了python后,想安装python-mysql,使用pip安装出现如下问题: pip install MySQL-pythonbuild\lib.win-amd64-2.7\_mys ...

  4. 《js高级程序设计》--第三章数据类型

    一.关键字 二.保留字 三.数据类型 (数据类型具有动态性)   1.Undefined 声明变量却未对其加以初始化(赋值) 2.Null null值表示一个空对象指针,而这也正是使用typeof操作 ...

  5. linux下保存下位机输出的串口信息为文件

    linux下保存下位机输出的串口信息为文件 1.stty -F /dev/ttyUSB0 raw (转换成raw模式) 2.stty -F /dev/ttyUSB0 speed 115200 (设置波 ...

  6. spring集成mybatis后,打印SQL语句

    网上说mybatis的早前版本配置打印sql还比较简单,在3.0.6之后配置方式修改了. 现在的spring-mybatis.xml配置如下: <bean id="sqlSession ...

  7. 1、Python快速入门(0529)

    学习来自马哥教育的视频,感谢马哥 编程语言: 用户: 问题空间 计算机:解决问题 解空间 抽象: 机器代码-->微码编程-->高级语言 (语言的高下级的是根据语言是否被人类容易理解或者更接 ...

  8. UVa 1347 旅行

    https://vjudge.net/problem/UVA-1347 思路:用d(i,j)表示第一个人走到i,第二个人走到j,还需要走多长的距离.在这里强制定义i>j,并且每次只能走到i+1. ...

  9. GATK 一些资料

    1. http://blog.sciencenet.cn/home.php?mod=space&uid=1469385&do=blog&classid=166694&v ...

  10. Qt5.3.2(VS2010)_调试_遇到的问题

    1.(20171124)调试程序 的时候,一直卡住,看到 右下角的进度里面,一直是"Launching Debugger"的状态 ZC: 一直找不到 原因... 尝试了 32位/6 ...