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条,准备继续爬一下其他网站上面的数据,开始研究下这么使用这些数据。
完
相关文章推荐
- Python爬虫三:抓取链家已成交二手房信息(58W数据)
- python+web编程学习总结记录(一)
- Python Cookbook学习记录 ch6_3_2013/11/7
- Linux-Python学习记录
- 初级python学习记录
- Python基础教程学习记录:第四章字典的勘误
- 【Python3.6爬虫学习记录】(八)Selenium模拟登录新浪邮箱并发送邮件
- python学习记录
- python第二十四天学习记录
- python 学习笔记记录(一)
- Python Cookbook学习记录 ch1_4_2013/10/22
- Python3.0+学习记录-编程第一步
- Python学习记录
- python学习记录-- 数据结构----列表篇
- 【每日一记3.16】python学习记录2--字符串方法
- Python学习记录_Day010总结复习+列表+集合+元组+字典
- Python学习记录1
- python学习记录---匿名函数
- Python学习记录----IDE安装
- python核心编程学习记录之基础知识