目标

#2020.5.21
#author:pmy
#目标:爬取链家成都的新房楼盘,每个楼盘的信息包括名称,参考均价,区域,具体项目地址,开盘时间,户型
#问题1,项目地址别抓下面的项目地址,而是住区上面的高新楼盘>长治南阳羽龙服 之类的,这个更清晰
#问题2:可能没有参考售价,但应该有字,抓下来就行

本次实战练习只是在于进一步熟练使用BeautifulSoup,更多内容可以点击爬虫实战 爬取豆瓣top250电影(BeautifulSoup)
链家和豆瓣的爬取都是比较简单的,因为是偏向于那种信息展示的网站,比较规范统一。


这里虽然爬取的是成都的新房房源,但其实本博客的代码可以爬取任意城市链家的房源,需要将https://cd.fang.lianjia.com/loupan/pg中的cd改成其他城市的简称,同时将headers中的host修改成bj,将get_url方法中的字符串改成bj,方可。至于二手房,就是修改loupan为ershoufang即可。

网页分析

本次爬取的网站https://cd.fang.lianjia.com/loupan/pg。
打开网页之后,我们发现它是一个分页的展示,一共100页,每页最多10个房源。
然后观察他们每页的url。
发现规律,其中pg参数便是不同分页的关键,第2页是2,而第4页是4。
所以我们便以https://cd.fang.lianjia.com/loupan/pg为基础的url。
从1开始到100,每次和上面的基础url拼接便得到了100个分页的url。


下一步就是从每个分页上抓取10个房源的url。
我们选中第一部电影的标题,发现其url的位置如下图所示。

实现代码如下:

    soup = BeautifulSoup(html,'html.parser')ul = soup.find('ul',class_='resblock-list-wrapper')for li in ul.find_all('li',class_='resblock-list post_ulog_exposure_scroll has-results'):a = li.find('a')# print('https://cd.fang.lianjia.com/' + a['href'])yield 'https://cd.fang.lianjia.com/'+a['href']

对于每个房源,我们来分析其各名称,户型,价格等信息的标签特征,从而快速找到信息,抓取信息。

名称的位置特征如下图,先找到class_='DATA-PROJECT-NAME’的h2,直接提取其文本就好。

实现代码如下:

#名称h2 = soup.find('h2',class_='DATA-PROJECT-NAME')house_name = h2.get_text()

价格的位置特征如下,提取其class_='price-number’的span的文本即可,这里可能没有定价,但是也有这个标签,标签的文本内容为“价格待定”。

实现代码如下:

    #参考均价house_price = soup.find('span',class_='price-number').get_text()

区域,为了显示房源大致在哪个区,我便从下图所示的位置来找寻,这样可以知道是高新区还是金牛区,还是什么区。因为发现需要提取的信息旁边一定有本房源的名称,而且位置十分靠上,所以就直接搜索我们直接提取的房源的名称,找到其父节点的前一个兄弟节点即可。

实现代码如下:

    #区域area_next = soup.find(string=house_name)house_area = area_next.parent.find_previous_sibling('a').get_text()

具体项目地址,也是和上一个区域类似的方法,通过一定的字符串来寻找
实现代码如下:

    #项目地址location_next = soup.find(string='项目地址')house_location = location_next.parent.find_next_sibling('span').get_text()

户型,这里遇到的问题是,有些房源没有户型,所以这里用一个try-catch,同样方法还是和抓取区域一样,用字符串来定位,再找其父节点的兄弟节点。

实现代码如下:

    #户型 有的可能没有 需要try-catchtry:type_next = soup.find(string='楼盘户型')house_type = ''for each in type_next.parent.find_next_sibling('span',class_='content').find_all('span'):house_type += each.get_text()except:house_type = ''

开盘时间也是类似

实现代码如下:

    #开盘时间date_next = soup.find(string='最新开盘')house_date = date_next.parent.find_next_sibling('span').get_text()

完整代码

#2020.5.21
#author:pmy
#目标:爬取链家成都的新房楼盘,每个楼盘的信息包括名称,参考均价,区域,具体项目地址,开盘时间,户型
#问题1,项目地址别抓下面的项目地址,而是住区上面的高新楼盘>长治南阳羽龙服 之类的,这个更清晰
#问题2:可能没有参考售价,但应该有字,抓下来就行# 成都楼盘原始界面 https://cd.fang.lianjia.com/loupan/
# 北京楼盘原始界面 https://bj.fang.lianjia.com/loupan/
# 区别在于fang前面的城市缩写
# https://cd.fang.lianjia.com/loupan/pg2/
# 页面在于pg“i”#首先爬取子页面链接#然后爬取信息import requests
from bs4 import BeautifulSoup
import time
import jsonbase_url='https://cd.fang.lianjia.com/loupan/pg'
# test_url='https://cd.fang.lianjia.com/loupan/p_dyhybkygs/'headers = {'Host': 'cd.fang.lianjia.com','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}#获取当前单个url的html
def get_response(url):try:response = requests.get(url, headers=headers)if response.status_code == 200:return response.textexcept requests.ConnectionError as e:print('Error', e.args)#获取当前页面的所有子链接 10个
def get_url(page):url = base_url+str(page)html = get_response(url)soup = BeautifulSoup(html,'html.parser')ul = soup.find('ul',class_='resblock-list-wrapper')for li in ul.find_all('li',class_='resblock-list post_ulog_exposure_scroll has-results'):a = li.find('a')# print('https://cd.fang.lianjia.com/' + a['href'])yield 'https://cd.fang.lianjia.com/'+a['href']###############分析
#div class=resblock-list-container clearfix#ul class=resblock-list-wrapper#li class=resblock-list post_ulog_exposure_scroll has-results#a class=resblock-img-wrapper#获取一套房源信息
def get_data(url):html = get_response(url)soup = BeautifulSoup(html,'html.parser')#名称h2 = soup.find('h2',class_='DATA-PROJECT-NAME')house_name = h2.get_text()#参考均价house_price = soup.find('span',class_='price-number').get_text()#区域area_next = soup.find(string=house_name)house_area = area_next.parent.find_previous_sibling('a').get_text()#项目地址location_next = soup.find(string='项目地址')house_location = location_next.parent.find_next_sibling('span').get_text()#开盘时间date_next = soup.find(string='最新开盘')house_date = date_next.parent.find_next_sibling('span').get_text()#户型 有的可能没有 需要try-catchtry:type_next = soup.find(string='楼盘户型')house_type = ''for each in type_next.parent.find_next_sibling('span',class_='content').find_all('span'):house_type += each.get_text()except:house_type = ''return {'house_name':house_name,'house_price':house_price,'house_area':house_area,'house_date':house_date,'house_location':house_location,'house_type':house_type}#存储到txt文件中
def save_data(data,count):filename = 'result'+str(count)+'.txt'with open(filename, 'a', encoding='utf-8') as f:f.write(json.dumps(data, ensure_ascii=False) + '\n')f.close()if __name__ == '__main__':for i in range(1,101):page = i# 获取每个页面的10个链接urls = get_url(page)for url in urls:# 对每部电影抓取信息并存储save_data(get_data(url), i//10)time.sleep(0.1)time.sleep(0.5)print('第' + str(i) + '页完成')

结果


爬虫实战 链家房源爬取(BeautifulSoup) 详细分析 2020最新相关推荐

  1. 爬虫实战-链家北京房租数据

    爬虫实战-链家北京房租数据 本篇是对 恋习Python 发布的原创文章<北京房租大涨?6个维度,数万条数据帮你揭穿>中涉及的代码部分的解读. < 在复现原文代码时,出现了一些报错,在 ...

  2. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

  3. Python爬虫实战系列(一)-request爬取网站资源

    Python爬虫实战系列(一)-request爬取网站资源 python爬虫实战系列第一期 文章目录 Python爬虫实战系列(一)-request爬取网站资源 前言 一.request库是什么? 二 ...

  4. python爬虫实战(一)--爬取知乎话题图片

    原文链接python爬虫实战(一)–爬取知乎话题图片 前言 在学习了python基础之后,该尝试用python做一些有趣的事情了–爬虫. 知识准备: 1.python基础知识 2.urllib库使用 ...

  5. 爬虫实战——豆瓣电影短评爬取

    目录 一.任务概述 心路历程 方案制定 二.正式开工 准备工作 处理 json 数据获取电影 id 处理短评 html 源码 三.全部代码 用Access后续处理 一.任务概述 爬取豆瓣电影中2020 ...

  6. Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件

    Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...

  7. 爬虫实战(二) 用Python爬取网易云歌单

    最近,博主喜欢上了听歌,但是又苦于找不到好音乐,于是就打算到网易云的歌单中逛逛 本着 "用技术改变生活" 的想法,于是便想着写一个爬虫爬取网易云的歌单,并按播放量自动进行排序 这篇 ...

  8. 爬虫实战——绝对通俗易懂,爬取房产数据

    爬取房产数据 爬虫介绍 实战目标 1.获取url 2.利用BeautifulSoup获取html的索引 3.查找所需数据索引 4.正则表达式获取所需要的信息 完整代码 爬虫介绍 简单介绍一下爬虫,百度 ...

  9. python爬虫实战之百度新闻爬取

    百度新闻信息爬取 目录 百度新闻信息爬取 序言 获取在百度新闻中搜索"阿里巴巴"的网页源代码 编写正则表达式提取新闻信息 数据清洗并打印输出 实战完整代码 序言  通过对百度新闻标 ...

  10. Python爬虫实战案例一:爬取猫眼电影

    背景 笔者上一篇文章<基于猫眼票房数据的可视化分析>中爬取了猫眼实时票房数据,用于展示近三年电影票房概况.由于数据中缺少导演/演员/编剧阵容等信息,所以爬取猫眼电影数据进行补充.关于爬虫的 ...

最新文章

  1. [算法题] Search in Rotated Sorted Array ii
  2. Pavel and Triangles(贪心)
  3. 可用资源不足excel无法完成任务_项目资源管理包括哪些内容?
  4. SQL运行速度慢?查查中间件
  5. Python连接Oracle-常见问题
  6. vscode 使用技巧(持续更新)
  7. Javascript第二章中switch结构及与if的区别第二课
  8. 中兴服务器 raid,中兴LIS等直通阵列卡卡硬盘检测工具
  9. 罗马数字相加java_LeetCode题库 13罗马数字转整数(java)
  10. php 如何模拟浏览器,PHP 浏览器模拟测试 Mink
  11. 硬件混合渲染器 (HWC)
  12. “微信教父”张小龙2021最新演讲,视频号、直播、创作者透漏了几大重要趋势丨国仁网络
  13. hh模型仿真matlab程序,gardner算法算法matlab仿真请教(附程序)
  14. 如何兼容IE4:Web浏览器兼容性浅谈
  15. 数据可视化echarts介绍
  16. JCP、JSR与servlet规范
  17. 在阿里云上打造属于你自己的APEX完整开发环境 (安装CentOS, Tomcat, Nginx)
  18. 11.16模拟赛总结
  19. 微信小程序复制邀请码
  20. 微型计算机系统原理内存条论文,微型计算机系统原理及应用结课论文.doc

热门文章

  1. vue 循环播放音乐列表 音量控制
  2. Wallpaper Engine壁纸推荐,让程序猿的桌面优美起来
  3. 人工智能基础:人工智能云服务(Alaas)介绍
  4. Mac怎么切换主显示器 Mac设置主显示器
  5. 日历控件修改的JS代码
  6. 搜狗推微信公众平台搜索 可搜公众号与文章
  7. 她全奖赴海外读博,一作发Science,毅然回国后任东南大学教授!
  8. 计算机类应届毕业生的求职历程
  9. 没有桌面体验功能就不能进行图片打印报错解决
  10. Longhorn,企业级云原生容器分布式存储 - 备份与恢复