起源于数据挖掘课程设计的需求,参考着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链家杭州二手房数据相关推荐

  1. 2020链家杭州二手房数据分析(截止到2020年09月07日)

    2020链家杭州二手房数据分析(截止到2020年09月07日) 1 项目背景 通过python爬去链家杭州二手房的数据,网址为:https://hz.lianjia.com/ershoufang/.可 ...

  2. Python爬取汽车之家所有车型数据,以后买车就用这个参考了

    欢迎点击右上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料可以领取包括不限于Python实战演练.大航海计划.BAT内推.学习资料等. 前言 2018年马上就要过去了,经过一年的奋斗,我相 ...

  3. python 爬取贝壳网小区名称_用Python爬取贝壳网新房和二手房数据

    [Python] 纯文本查看 复制代码import random import requests from bs4 import BeautifulSoup import re import math ...

  4. 爬虫+可视化——链家杭州二手房房源信息

    ------------本篇文章旨在练习数据的爬取及可视化 简介 本项目分两个部分: 1.爬虫:共爬取到链家杭州二手房信息30806条 2.可视化:主要用pyecharts 一.获取数据 提取杭州各个 ...

  5. Python爬虫框架Scrapy入门(三)爬虫实战:爬取长沙链家二手房

    Item Pipeline介绍 Item对象是一个简单的容器,用于收集抓取到的数据,其提供了类似于字典(dictionary-like)的API,并具有用于声明可用字段的简单语法. Scrapy的It ...

  6. Python:爬了下链家的小区数据,为数据分析弄素材~

    前言:最近在学数据分析,包括主成分分析.因子分析.聚类...等等,没有数据可不行啊,所以就把链家的小区数据给爬了一下,为后续的分析实战弄素材~ 2019年7月18日修正: 因为高德和百度对于GPS的加 ...

  7. PYTHON爬取汽车之家数据

    PYTHON爬取汽车之家数据 使用知识 使用BeautifulSoup模块 使用正则表达式 使用到多线程爬取 使用说明 使用前请安装BeauifulSoup 起始页面: https://www.aut ...

  8. python爬取BT之家特定频道前5页电影信息(小白操作)

    python爬取BT之家特定频道前5页电影信息(小白操作) 想要爬的网页如下,希望得到BT之家恐怖频道的电影信息,并存档xls 代码如下 import requests,openpyxl wb=ope ...

  9. 爬取‘广州链家新房’数据并以csv形式保存。

    --本次的目标是爬取'广州链家新房'前十页的信息,具体需要爬取的信息为'楼房名字.地址.价格以及是否在售的情况',具体的代码如下. import requests,time import pandas ...

最新文章

  1. 禁毒学、油画、乌尔都语……字节跳动程序员的专业有多奇特丨技术同学大数据报告...
  2. OpenCV+yolov2-tiny实现目标检测(C++)
  3. 第三次学JAVA再学不好就吃翔(part1)--初识JAVA
  4. 两台centos之间免密传输 scp
  5. 关于在pjsip中添加视频的流程说明
  6. android自定义view(自定义数字键盘)
  7. BZOJ 1085(IDA*)
  8. 哈希表 HashTable对象 c#
  9. artdialog4.1.7 中父页面给子页面传值
  10. 关于IPointerEnterHandler和IpointerExitHandler的简单说明
  11. 【TSP】基于matlab蚁群算法求解31城市旅行商问题【含Matlab源码 1147期】
  12. 万恶的ie(还好只是ie11)
  13. 积极主动沟通说话交流的重要性和案例以及技巧
  14. 《Spring Boot极简教程》第1章 Spring Boot史前简述
  15. android 遥控器home键键值,android 中遥控器键值的添加和修改
  16. Android JetPack架构篇,一个实战项目带你学懂JetPack
  17. html 字符画,字符画
  18. Zookeeper启动成功,报错“Error contacting service. It is probably not running”
  19. Keepalived Nginx 类型效劳下高结实Linux系统计划
  20. SynchroTrap-基于松散行为相似度的欺诈账户检测算法

热门文章

  1. 机器学习-第2关:信息熵与信息增益
  2. 书读百遍,其意自现 --- 意境与语境的融合
  3. 2019前端面试总结
  4. 对java编程的搞笑形容_史上最搞笑的程序员期末考试题,笑得我要喷饭了!
  5. 如何成为一颗 GitHub Star
  6. TensorFlow+Pytorch识别阿猫阿狗
  7. 按月、按天计算失效日期的代码实现
  8. java无法从静态上下文_java - “非静态方法无法从静态上下文中引用”背后的原因是什么?...
  9. 使用htmlunit采集网页+点击网页按钮
  10. AutoCAD2016安装破解教程