用Python爬取2020链家杭州二手房数据
起源于数据挖掘课程设计的需求,参考着17年这位老兄写的代码:https://blog.csdn.net/sinat_36772813/article/details/73497956?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242
在此感谢
1.导入库及准备工作
主要用到了三个库,分别用于获取、解析、和操作excel
#_*_coding:utf-8_*_# 导入开发模块
import requests
# 用于解析html数据的框架
from bs4 import BeautifulSoup
# 用于操作excel的框架
import xlwt
# 创建一个工作
book = xlwt.Workbook()
# 向表格中增加一个sheet表,sheet1为表格名称 允许单元格覆盖
sheet = book.add_sheet('sheet1', cell_overwrite_ok=True)
2.分析爬取方法
然后我们需要分析一下网页,看看要爬取什么数据以及如何爬取。
链家杭州二手房网址为:https://hz.lianjia.com/ershoufang/
可以发现,链家把杭州分为15个区域。
其中,截止到2020年09月19日,大江东和建德区域数据为0条,桐庐数据为3条,淳安数据共36条。和其他区域相比,这几个区域数据量太少,因此可以在后续爬取过程中略去。
然后往下拉,我们需要的大致就是爬取每个区每套房红色框内的数据了。
按F12打开开发者工具,可以看到:
每套房的数据包在一个 li 标签中,所有的 li 标签包在一个 ul 标签中,因此可以先获取到ul标签,再获取所有的li标签,用循环加改变url的方式,获取每个区每一页的数据。li 标签内的数据就一个一个慢慢取出来存储就好,详细看代码就不说了。
分析可知‘url+区名(如xihu)+页码(如pg2)’即可构成整体url
3.数据爬取过程
3.1定义第一个方法,在最初的url后面加上区域,并获取总页码数。
# 指定爬虫所需的杭州各个区域名称
citys = ['xihu','qiantangxinqu','xiacheng','jianggan','gongshu','shangcheng','binjiang','yuhang','xiaoshan','fuyang','linan']
def getHtml(city):url = 'https://hz.lianjia.com/ershoufang/%s/' % cityheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}request = requests.get(url=url,headers=headers)# 获取源码内容比request.text好,对编码方式优化好respons = request.content# 使用bs4模块,对响应的链接源代码进行html解析,后面是python内嵌的解释器,也可以安装使用lxml解析器soup = BeautifulSoup(respons,'html.parser')# # 获取类名为c-pagination的div标签,是一个列表
# page = soup.select('div.page-box house-lst-page-box')[0]
# # 如果标签a标签数大于1,说明多页,取出最后的一个页码,也就是总页数
# if len(page.select('a')) > 1:
# alist = int(page.select('a')[-2].text)
# else:#否则直接取出总页数
# alist = int(page.select('span')[0].text)# 获取类名为page-box house-lst-page-box的div标签pages = soup.find(class_="page-box house-lst-page-box")page_ = pages['page-data']page = eval(page_)alist = page['totalPage']
# if alist > 10:
# allPage = 10
# else:
# allPage = alist# 调用方法解析每页数据saveData(city,url,alist+1)
其中页码获取原作者写的(即注释部分)有点复杂,不太懂也跑不通,所以用我比较熟悉的find方法了,直接找到div获取page-data属性里的totalPage总页码信息。
3.2定义第二个方法,解析每页数据并保存到表格中
# 调用方法解析每页数据,并且保存到表格中
def saveData(city,url,page):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}for i in range(1,page):html = requests.get(url='%spg%s' % (url,i),headers=headers).contentsoup = BeautifulSoup(html,'html.parser')infos = soup.find(class_="sellListContent").find_all('li') #属性为ResultSet
# infos = soup.select('.sellListContent')[0].select('li') #属性为listfor info in infos:# print '*'*50title = info.find('div',class_="title").find('a').text#标题positionInfo = info.find('div',class_='positionInfo').text.strip().split('-')xiaoqu = positionInfo[0].strip()#每套二手房的小区名称weizhi = positionInfo[1].strip()#每套二手房的位置houseInfo = info.find('div',class_='houseInfo').text.strip().split('|')room_type = houseInfo[0].strip() # 每套二手房的户型size = houseInfo[1].strip() # 每套二手房的面积chaoxiang = houseInfo[2].strip() # 每套二手房的朝向zhuangxiu = houseInfo[3].strip() # 每套二手房的装修情况if len(houseInfo[4].split('(')) == 2:region = houseInfo[4].split('(')[0].strip() # 每套二手房所属的区域louceng = houseInfo[4].split('(')[1].strip().split(')')[0] # 每套二手房所在的楼层else:region = '' # 每套二手房所属的区域louceng = houseInfo[4].strip() # 每套二手房所在的楼层if len(houseInfo) != 6:xingtai = ''else:xingtai = houseInfo[5].strip() # 每套二手房的形态price = info.find('div',class_='totalPrice').text.strip()# 每套二手房的总价price_union = info.find('div',class_='unitPrice').text.strip()# 每套二手房的平方米售价# 一定要声明使用全局的row变量,否则会报错,说定义前使用了该变量global row# 把数据写入表中,row:行数 第二个参数:第几列 第三个参数:写入的内容sheet.write(row,0,city)sheet.write(row,1,title)sheet.write(row,2,xiaoqu)sheet.write(row,3,weizhi)sheet.write(row,4,room_type)sheet.write(row,5,size)sheet.write(row,6,chaoxiang)sheet.write(row,7,zhuangxiu)sheet.write(row,8,region)sheet.write(row,9,louceng)sheet.write(row,10,xingtai)sheet.write(row,11,price)sheet.write(row,12,price_union)# 每次写完一行,把行索引进行加一row += 1
3.3最后运行一下
if __name__ == '__main__':# getHtml('jingshan')row = 0for i in citys:getHtml(i)# 最后执行完了保存表格,参数为要保存的路径和文件名,如果不写路径则默然当前路径book.save('lianjia_hz.xls')
得到的excel数据展示
4.总结
由于网站源码是会更新的,一段时间后爬虫的代码也需要作相应改变,如果届时跑不通希望大家先自行查看一下找找解决办法。可以先尝试爬取一个区的一页数据写入excel,再到每个区10页,再全部这样昂。
这个爬虫算是一个比较简单的版本,没有反反爬虫也没有伪头部啥的,总的运行下来花了半小时左右,懒得优化了仅给大家交流借鉴啦。
用Python爬取2020链家杭州二手房数据相关推荐
- 2020链家杭州二手房数据分析(截止到2020年09月07日)
2020链家杭州二手房数据分析(截止到2020年09月07日) 1 项目背景 通过python爬去链家杭州二手房的数据,网址为:https://hz.lianjia.com/ershoufang/.可 ...
- Python爬取汽车之家所有车型数据,以后买车就用这个参考了
欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.大航海计划.BAT内推.学习资料等. 前言 2018年马上就要过去了,经过一年的奋斗,我相 ...
- python 爬取贝壳网小区名称_用Python爬取贝壳网新房和二手房数据
[Python] 纯文本查看 复制代码import random import requests from bs4 import BeautifulSoup import re import math ...
- 爬虫+可视化——链家杭州二手房房源信息
------------本篇文章旨在练习数据的爬取及可视化 简介 本项目分两个部分: 1.爬虫:共爬取到链家杭州二手房信息30806条 2.可视化:主要用pyecharts 一.获取数据 提取杭州各个 ...
- Python爬虫框架Scrapy入门(三)爬虫实战:爬取长沙链家二手房
Item Pipeline介绍 Item对象是一个简单的容器,用于收集抓取到的数据,其提供了类似于字典(dictionary-like)的API,并具有用于声明可用字段的简单语法. Scrapy的It ...
- Python:爬了下链家的小区数据,为数据分析弄素材~
前言:最近在学数据分析,包括主成分分析.因子分析.聚类...等等,没有数据可不行啊,所以就把链家的小区数据给爬了一下,为后续的分析实战弄素材~ 2019年7月18日修正: 因为高德和百度对于GPS的加 ...
- PYTHON爬取汽车之家数据
PYTHON爬取汽车之家数据 使用知识 使用BeautifulSoup模块 使用正则表达式 使用到多线程爬取 使用说明 使用前请安装BeauifulSoup 起始页面: https://www.aut ...
- python爬取BT之家特定频道前5页电影信息(小白操作)
python爬取BT之家特定频道前5页电影信息(小白操作) 想要爬的网页如下,希望得到BT之家恐怖频道的电影信息,并存档xls 代码如下 import requests,openpyxl wb=ope ...
- 爬取‘广州链家新房’数据并以csv形式保存。
--本次的目标是爬取'广州链家新房'前十页的信息,具体需要爬取的信息为'楼房名字.地址.价格以及是否在售的情况',具体的代码如下. import requests,time import pandas ...
最新文章
- 禁毒学、油画、乌尔都语……字节跳动程序员的专业有多奇特丨技术同学大数据报告...
- OpenCV+yolov2-tiny实现目标检测(C++)
- 第三次学JAVA再学不好就吃翔(part1)--初识JAVA
- 两台centos之间免密传输 scp
- 关于在pjsip中添加视频的流程说明
- android自定义view(自定义数字键盘)
- BZOJ 1085(IDA*)
- 哈希表 HashTable对象 c#
- artdialog4.1.7 中父页面给子页面传值
- 关于IPointerEnterHandler和IpointerExitHandler的简单说明
- 【TSP】基于matlab蚁群算法求解31城市旅行商问题【含Matlab源码 1147期】
- 万恶的ie(还好只是ie11)
- 积极主动沟通说话交流的重要性和案例以及技巧
- 《Spring Boot极简教程》第1章 Spring Boot史前简述
- android 遥控器home键键值,android 中遥控器键值的添加和修改
- Android JetPack架构篇,一个实战项目带你学懂JetPack
- html 字符画,字符画
- Zookeeper启动成功,报错“Error contacting service. It is probably not running”
- Keepalived Nginx 类型效劳下高结实Linux系统计划
- SynchroTrap-基于松散行为相似度的欺诈账户检测算法
热门文章
- 机器学习-第2关:信息熵与信息增益
- 书读百遍,其意自现 --- 意境与语境的融合
- 2019前端面试总结
- 对java编程的搞笑形容_史上最搞笑的程序员期末考试题,笑得我要喷饭了!
- 如何成为一颗 GitHub Star
- TensorFlow+Pytorch识别阿猫阿狗
- 按月、按天计算失效日期的代码实现
- java无法从静态上下文_java - “非静态方法无法从静态上下文中引用”背后的原因是什么?...
- 使用htmlunit采集网页+点击网页按钮
- AutoCAD2016安装破解教程