您的位置:首页 > 编程语言 > Python开发

python 学习爬取链家武汉二手房市场成交记录

2019-01-04 10:15 211 查看

以前几乎没有写过博客的,今年给自己立的flag其中有两条就是1.至少完成10篇计算类博客。2.每个月需要有一篇投资总结,so..

由于老妈最近逼着买房,但是现在感觉确实不是好的时机,具体的这里不说,但是身为码农总是要拿数据说话的,刚好想玩玩python,下面开始代码了。

首先去链家网上找到二手房成交记录去第二页看看,找下规律

链家首页 找到详情页规律 选择需要爬的信息

 

选择需要爬的信息

上面的就是一步步找到自己需要的信息

然后开始创建一下表

[code]CREATE TABLE `lianjiachengjiao` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '最近成交时间',
`price` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '价格',
`averageprice` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '平均价格(单位万元)',
`district` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '小区名称',
`houseType` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '房屋户型',
`floor` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '所在楼层',
`area` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '建筑面积',
`structure` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '户型结构',
`realarea` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '套内面积',
`architectureType` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '建筑类型',
`orientation` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '房屋朝向',
`architecturetime` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '建成年代',
`decoration` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '装修情况',
`architecture` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '建筑结构',
`heating` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '供暖方式',
`elevatorType` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '梯户比例',
`propertyYear` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '产权年限',
`elevator` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '配备电梯',
`record` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '历史成交记录',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3686 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
[code]import requests #导入requests 模块
from bs4 import BeautifulSoup  #导入BeautifulSoup 模块
import MySQLdb#导入MySQLdb  这里需要安装

class GetLianJiaInfo():

def __init__(self):  #类的初始化操作
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'}  #给请求指定一个请求头来模拟chrome浏览器
self.web_url = 'https://wh.lianjia.com/chengjiao/'  #要访问的网页地址       //  ........./pg1/

def get_Info(self):
i = 0
while i < 100:
i=i+1
url= ''.join([self.web_url,'pg'+str(i )+'/'])
print('开始网页get请求web_url' + url)
r = self.request(url)#请求二手房成交记录页
all_a = BeautifulSoup(r.text, 'html.parser').find_all('a',class_="img") #获取网页中的class为img的所有a标签
for a in all_a: #循环每个标签
#所有的数据存入list,方便sql拼接
list =[]
detailsurl = a['href'] #a标签中完整的href字符串
print('开始请求详细页面' + str(detailsurl))
ah = self.request(detailsurl)#请求二手房成交房子的详情页
soup = BeautifulSoup(ah.text, 'lxml')
title = soup.find('h1', class_='index_h1').text#获取主题信息中的---- 成交小区名称
time = soup.find('div',class_='wrapper').find('span').text.split()[0].rstrip()#获取成交时间
price = soup.find('span', class_='dealTotalPrice').text#成交价格
averageprice = soup.find('div', class_='price').find('b').text#获取每平米价格
list.append(title.split()[0].rstrip())
list.append(time)
list.append(price)
list.append(averageprice)
baseinform = soup.find('div', class_='base').find_all('li')#基本属性
for label in baseinform:
list.append(label.text[4:].rstrip())
chengjiao_record = soup.find('div', class_='chengjiao_record').find_all('li')  # 历史成交记录
record =''
for chengjiao in chengjiao_record:
record=record+chengjiao.text.rstrip()+';'
list.append(record)
sql = "INSERT INTO lianjiachengjiao( `district`, `time`, `price`, `averageprice`, `houseType`, `floor`, `area`, `structure`, " \
"`realarea`, `architectureType`, `orientation`, `architecturetime`, `decoration`, `architecture`," \
" `heating`, `elevatorType`, `propertyYear`, `elevator`, `record`) VALUES ('"+list[0]+"','"+list[1]+"','"+list[2]+"','"+list[3]+"','"+list[4]+"','"+list[5]+"','"+list[6]+"','"+list[7]+"','"+list[8]+"','"+list[9]+"','"+list[10]+"','"+list[11]+"','"+list[12]+"','"+list[13]+"','"+list[14]+"','"+list[15]+"','"+list[16]+"','"+list[17]+"','"+list[18]+"');"
try:
# 创建数据库连接
db = MySQLdb.connect("localhost", "root", "password", "lianjia", charset='utf8')
cursor = db.cursor()
#执行sql
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 出现异常回滚
db.rollback()
# 关闭数据库连接
db.close()

def request(self, url):  #返回网页的response
r = requests.get(url, headers=self.headers)  # 像目标url地址发送get请求,返回一个response对象。有没有headers参数都可以。
return r

lianJiaInfo = GetLianJiaInfo()  #创建类的实例
lianJiaInfo.get_Info()  #执行类中的方法

详细的代码记录在这里基本都有注释,其中用到了BeautifulSoup 模块

api: https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

用到了MySQLdb 这个需要安装

不然会报 ImportError: No module named MySQLdb  异常

 

对于不同的系统和程序有如下的解决方法:
easy_install mysql-python (mix os)
pip install mysql-python (mix os)
apt-get install python-mysqldb (Linux Ubuntu)
cd/usr/ports/databases/py-MySQLdb && make install clean (FreeBSD)
yum install MySQL-python (linux Fedora, CentOS)
pip install mysqlclient (Windows)


由于我现在的项目就是做一个大数据分析平台,而链家现在只提供100页的访问,所以数据还是不够只有3000条,准备继续爬一下其他网站上面的数据,开始研究下这么使用这些数据。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: