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插入该图表,并设置其缩放比例、偏移量等参数
关闭该工作簿
插入图表后,即可自动生成对比图表







