Advertisement

Python爬取链家北京租房信息

阅读量:

用户学习Python爬虫的过程,包括使用requests和BeautifulSoup进行网页抓取,从链家网站爬取租房信息并存储到数据库中。文本详细描述了数据爬取的代码结构、数据处理流程以及如何将爬取的数据用于后续的API接口和数据分析。用户还提到通过数据库操作生成随机颜色并制作对比图表,用于展示不同地区和房型的平均租金。

最近学习Python过程中,遇到了诸多挑战,但通过查阅大量资料,我发现其中最为关键的技能便是熟练掌握调试技巧。在处理div信息时,必须确保其准确性,否则可能导致整个数据抓取过程出现偏差。以下是我的用于获取租房信息的代码示例及其运行结果展示:

链家的房租网站

两个导入的包

1.requests 用来过去网页内容

2.BeautifulSoup

import time

import pymssql

import requests

from bs4 import BeautifulSoup
#https://bj.lianjia.com/zufan

完整代码如下:

复制代码
 import requests

    
 import uuid
    
 import time
    
 from bs4 import BeautifulSoup
    
 from src.request import send as send
    
 from src.database import database as database
    
  
    
 def requestHtmlData() :
    
  
    
 conn = database.initDataConnect()
    
  
    
 url = "https://bj.lianjia.com/zufang/pg{0}/#contentList"
    
  
    
 headers = {
    
     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.43'
    
 }
    
 i = 1;
    
 while(1==1):
    
     rurl = url.replace("{0}",str(i))
    
     print("请求地址:"+rurl)
    
     i+=1
    
     if(i>100):
    
         i=1
    
     resp = requests.get(rurl,headers=headers)
    
     #print(resp.text)  #网页内容 文本
    
     #print(resp.content.decode('utf-8'))   #网页内容  二进制
    
  
    
     html=resp.text
    
     soup =BeautifulSoup(html,'html.parser')#解析
    
     #print (soup)
    
     infos = soup.findAll(class_='content__list--item')
    
     #print(infos)
    
     for info in infos:
    
         try:
    
             data_house_code = info.attrs['data-house_code']
    
             name = info.find(class_='content__list--item--aside').attrs['title']
    
             price = info.find(class_='content__list--item--main').find(class_='content__list--item-price').find('em').get_text();
    
             area = info.find(class_='content__list--item--main').find(class_='content__list--item--des').a.get_text();
    
             addresses = info.find(class_='content__list--item--main').find(class_='content__list--item--des').findAll('a');
    
             address = addresses[0].get_text()+'-'+addresses[1].get_text()+'-'+addresses[2].get_text()
    
             tags = info.find(class_='content__list--item--main').find(class_='content__list--item--bottom').findAll('i');
    
             tagStr = ''
    
             for tag in tags:
    
                 if(tagStr!='') :
    
                     tagStr += '-'
    
                 tagStr += tag.get_text()
    
                            deleteSql = "delete from building_data where id = '"+data_house_code+"';"
    
             database.execSql(deleteSql)
    
             insertSql = "INSERT INTO building_data (id, name, adrress, area, price, location, bz) VALUES ('"+data_house_code+"', '"+name+"', '"+address+"', '"+area+"', '"+price+"', '', '"+tagStr+"');"
    
             database.execSql(insertSql)
    
         except Exception as e:
    
             print(e)
    
     print("睡眠5s")
    
     time.sleep(5)

我们有时需要从网上爬取数据,因为这些数据并不是现成的。Python提供了一系列强大的爬虫库,其中包括requests、BeautifulSoup和Scrapy。这些库可以直接导入使用。首先,我们需要安装requests和BeautifulSoup这两个库。接下来,我们需要抓取并解析链家网的租房信息。链家网的租房信息页面URL结构为:https://bj.lianjia.com/zufang/pg/bj,其中bj表示北京,zufang是频道名称。我们关注的是北京的租房频道,因此固定部分不会改变。我们将URL拆分为前后两部分,其中固定部分赋值给url变量,然后使用while循环遍历页面。在循环中,我们生成分页URL格式,将其与固定部分拼接,形成需要抓取的具体URL。接下来,我们循环抓取各个页面的信息。使用BeautifulSoup对页面内容进行解析。解析完成后,我们开始提取页面中的关键信息,包括租房价格、小区名称、地址、户型、面积以及信息更新时间等。最后,我们将抓取到的信息存储到数据库中。

希望对刚学习爬虫的小伙伴有帮助!(◦˙▽˙◦)
————————————————
下面一部分是对爬取数据的分析:

从链家网站获取北京租房信息,完成数据爬取后,可以将其导入数据库进行后续处理。首先需要创建数据库并建立相应的表格结构。

复制代码
 import sqlite3

    
  
    
 conn = None
    
  
    
 def initDataConnect() :
    
     global conn
    
  
    
     #创建或者连接已存在的数据库
    
     print('../../database/data.db')
    
     conn = sqlite3.connect('./database/data.db');
    
     print("数据库连接成功")
    
  
    
     #初始化数据表
    
     initTable()
    
     return conn
    
 def getConn():
    
     global conn
    
     return conn
    
  
    
 def execSql(sql):
    
     global conn
    
     print(sql)
    
     conn.cursor().execute(sql)
    
     conn.commit()
    
  
    
 def selectData(sql):
    
     global conn
    
     cursor = conn.cursor().execute(sql)
    
     return cursor
    
  
    
  
    
 def initTable():
    
     global conn
    
     try:
    
         conn.execute('''create table building_data
    
     (
    
         id       CHAR(50) not null
    
             constraint table_name_pk
    
                 primary key,
    
         name     CHAR(200),
    
         adrress  CHAR(500),
    
         area     CHAR(50),
    
         price   CHAR(100),
    
         location CHAR(100),
    
         bz       CHAR(500)
    
     );''')
    
         conn.execute('''create unique index table_name_id_uindex
    
         on building_data (id);''')
    
         print("初始化数据库表结构")
    
     except Exception as e:
    
         print("数据库表结构已存在")
    
  
    
  
    
 def disconnect(conn):
    
     conn.close()
    
     print("数据库断开连接")
    
         将数据表格创建好后将爬取到的数据向其中传递,并且会有一个数据更新
    
  
    
  deleteSql = "delete from building_data where id = '"+data_house_code+"';"
    
                 database.execSql(deleteSql)
    
                 insertSql = "INSERT INTO building_data (id, name, adrress, area, price, location, bz) VALUES ('"+data_house_code+"', '"+name+"', '"+address+"', '"+area+"', '"+price+"', '', '"+tagStr+"');"
    
                 database.execSql(insertSql)

运行代码后数据将传递进数据库中

存储完成后,开展数据分析工作。定义两个API接口:一个用于搜索不同地区不同房型的平均价格,另一个用于生成对比图的文件。

通过数据库操作获取对应地区和房型的平均租金数据,并返回至页面。

第二个定义了随机的颜色,将颜色、地区、平均租金传入 对应代码中

难点

生成随机颜色

from flask import Flask

app = Flask(name)

#定义Api接口 http://127.0.0.1:5000/area/通州/2室1厅
@app.route('/area//')
def area(area,hx):
#求平均值
sql = "select round(AVG(price),2) from building_data where area like '%"+area+"%' and name like '%"+hx+"%' ";
#连接数据库
conn = database.initDataConnect();
#执行数据库操作
datas = conn.cursor().execute(sql)
data = "未查到相应地区数据";
try:
for data in datas:
data = str(data[0])
except Exception as e:
print(e)
database.disconnect(conn);
return area+"区,户型"+hx+"平均租房价格:"+data+"元"

#API接口定义
指定地址:http://127.0.0.1:5000/compare
为该API路由配置处理逻辑:@app.route('/compare')
函数名称为compare:def compare():
获取area列表:#获取area的列表
从building_data表中获取distinct的area字段:sql = "select distinct area from building_data; ";

通过初始化数据连接器获取数据库连接:conn = database.initDataConnect();
通过cursor执行查询语句获取数据: datas = conn.cursor().execute(sql);
初始化区域数据列表: areas = [];
初始化价格数据列表: prices = [];
初始化颜色数据列表: colors = [];
开始处理数据:
对于每个区域数据data:
执行计算区域平均价格的SQL语句: areasql = "select round(AVG(price), 2) from building_data where area = '"+data[0]+"' ";
通过cursor执行该SQL语句: areaSqlDatas = conn.cursor().execute(areasql);
对于每个区域SqlData:
获取区域对应价格: prices.append(areaSqlData[0]);
生成随机颜色:颜色生成部分
将随机颜色应用到区域: colors.append({'fill': {'color': color}});

excels.createExcelPie(areas,prices,colors)
处理异常时
输出错误信息
断开数据库连接
返回成功信息
说明参数:地区、价格、颜色

import xlsxwriter

该函数用于在Excel中创建饼图,接受三个参数:areas、prices和colors。通过xlsxwriter库创建一个名为'北京各地区平均租房价格分析.xlsx'的Excel工作簿。在工作簿中添加一个新的工作表,命名为'分析表'。设置字体加粗的格式样式。将第一行数据写入A1单元格,使用加粗格式。将第二行数据写入A2单元格。

--------2、在Excel中生成并插入图表---------------

chart_col = workbook.add_chart({'type': 'pie'})
chart_col.add_series({
'name': '北京各地区平均租房价格分析',
'设置图表的分类标签范围加入数据',
'设置图表的数据范围加入数据',
'points': colors,
'数据标签':{'值': True},
})
chart_col.set_title({'name': '北京各地区平均租房价格分析'})
chart_col.set_style(10)
worksheet.insert_chart('B36', chart_col, {'x_scale': 3, 'y_scale': 1.5, 'x_offset': 25, 'y_offset': 10})

工作表中添加柱状图的公式为
工作表中添加柱状图的公式为
工作表中添加柱状图的名称为"北京各地区平均租房价格分析"
工作表中添加柱状图的类别为'=Sheet1!A1:AA1'
工作表中添加柱状图的数值为'=Sheet1!A2:AA2'
工作表中添加柱状图的数值显示为True
工作表中添加柱状图的边框颜色为'red'
工作表中添加柱状图的填充颜色为'yellow'

该图表表头设置为表格
在单元格B10插入该图表,并设置其缩放比例、偏移量等参数
关闭该工作簿
插入图表后,即可自动生成对比图表

全部评论 (0)

还没有任何评论哟~