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

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

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

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

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

 

选择需要爬的信息

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

然后开始创建一下表

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;
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条,准备继续爬一下其他网站上面的数据,开始研究下这么使用这些数据。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值