看我如何抓取二手房价数据

来源:Python 技术「ID: pythonall」

上次为大家介绍了如何通过 Python 抓取新房楼盘价格信息,很多朋友都在问,那二手房最新的价格信息要如何抓取呢?好!今天就再来为大家讲一讲,二手房的房价信息要怎么抓取。

模块安装

同上次新房一样,这里需要安装以下模块(当然如果已安装就不用再装了):

# 安装引用模块pip3 install bs4pip3 install requestspip3 install lxmlpip3 install numpypip3 install pandas

好了,安装完成后,就可以开始写代码了。至于配置请求头和代理IP地址的代码,上次介绍新房已经说过了,这里不再赘述,下面直接上抓取代码。

二手房价数据对象

在这里我们将二手房的房价信息,创建成一个对象,后续我们只要将获取到的数据保存成对象,再处理就会方便很多。SecHouse 对象代码如下所示:

# 二手房信息对象class SecHouse(object): def __init__(self, district, area, name, price, desc, pic): self.district = district self.area = area self.price = price self.name = name self.desc = desc self.pic = pic def text(self): return self.district + "," + \ self.area + "," + \ self.name + "," + \ self.price + "," + \ self.desc + "," + \ self.pic

获取二手房价信息并保存

准备好了,下面我们依然以贝壳为例,批量爬取其北京地区二手房数据,并保存到本地。这里我主要想说的是如何抓取数据过程,所以这里依然就保存成最简单的 txt 文本格式。如果想保存到数据库,可以自行修改代码进行保存数据库处理。

获取区县信息

我们在抓取二手房信息时,肯定想知道这个房源所在地区,所以这里我写了个方法把北京市所有区县信息抓取下来,并临时保存至列表变量里,以备后续程序中使用,代码如下:

# 获取区县信息def get_districts(): # 请求 URL url = 'https://bj.ke.com/xiaoqu/' headers = create_headers() # 请求获取数据 response = requests.get(url, timeout=10, headers=headers) html = response.content root = etree.HTML(html) # 处理数据 elements = root.xpath('///div[3]/div[1]/dl[2]/dd/div/div/a') en_names = list() ch_names = list() # 循环处理对象 for element in elements: link = element.attrib['href'] en_names.append(link.split('/')[-2]) ch_names.append(element.text)
# 打印区县英文和中文名列表 for index, name in enumerate(en_names): chinese_city_district_dict[name] = ch_names[index] return en_names

获取地区板块

除了上面要获取区县信息,我们还应该获取比区县更小的板块区域信息,同样的区县内,不同板块地区二手房的价格等信息肯定不一样,所以板块对于我们来说也很重要,具有一次参考价值。获取板块信息代码如下:

# 获取某个区县下所有板块信息def get_areas(district): # 请求的 URL page = "http://bj.ke.com/xiaoqu/{0}".format(district) # 板块列表定义 areas = list() try: headers = create_headers() response = requests.get(page, timeout=10, headers=headers) html = response.content root = etree.HTML(html) # 获取标签信息 links = root.xpath('//div[3]/div[1]/dl[2]/dd/div/div[2]/a')
# 针对list进行处理 for link in links: relative_link = link.attrib['href'] # 最后"/"去掉 relative_link = relative_link[:-1] # 获取最后一节信息 area = relative_link.split("/")[-1] # 去掉区县名称,以防止重复 if area != district: chinese_area = link.text chinese_area_dict[area] = chinese_area # 加入板块信息列表 areas.append(area) return areas except Exception as e: print(e)

获取二手房信息并保存

# 创建文件准备写入with open("sechouse.txt", "w", encoding='utf-8') as f: # 定义变量 total_page = 1 # 初始化 list sec_house_list = list() # 获取所有区县信息 districts = get_districts() # 循环处理区县 for district in districts: # 获取某一区县下所有板块信息 arealist = get_areas(district) # 循环遍历所有板块下的小区二手房信息 for area in arealist: # 中文区县 chinese_district = chinese_city_district_dict.get(district, "") # 中文版块 chinese_area = chinese_area_dict.get(area, "") # 请求地址 page = 'http://bj.ke.com/ershoufang/{0}/'.format(area) headers = create_headers() response = requests.get(page, timeout=10, headers=headers) html = response.content # 解析 HTML soup = BeautifulSoup(html, "lxml")
# 获取总页数 try: page_box = soup.find_all('div', class_='page-box')[0] matches = re.search('.*data-total-count="(\d+)".*', str(page_box)) # 获取总页数 total_page = int(math.ceil(int(matches.group(1)) / 10)) except Exception as e: print(e)
print(total_page) # 设置请求头 headers = create_headers() # 从第一页开始,遍历到最后一页 for i in range(1, total_page + 1): # 请求地址 page = 'http://bj.ke.com/ershoufang/{0}/pg{1}'.format(area,i) print(page) # 获取返回内容 response = requests.get(page, timeout=10, headers=headers) html = response.content soup = BeautifulSoup(html, "lxml")
# 获得二手房查询列表 house_elements = soup.find_all('li', class_="clear") # 遍历每条信息 for house_elem in house_elements: # 价格 price = house_elem.find('div', class_="totalPrice") # 标题 name = house_elem.find('div', class_='title') # 描述 desc = house_elem.find('div', class_="houseInfo") # 图片地址 pic = house_elem.find('a', class_="img").find('img', class_="lj-lazy")
# 清洗数据 price = price.text.strip() name = name.text.replace("\n", "") desc = desc.text.replace("\n", "").strip() pic = pic.get('data-original').strip()
# 保存二手房对象 sec_house = SecHouse(chinese_district, chinese_area, name, price, desc, pic) print(sec_house.text()) sec_house_list.append(sec_house) # 循环遍历将信息写入 txt for sec_house in sec_house_list: f.write(sec_house.text() + "\n")

到这里代码就写好了,现在我们就可以通过命令 python sechouse.py 运行代码进行数据抓取了。抓取的结果我们可以打开当前目录下 sechouse.txt 文件查看,结果如下图所示:

总结

(0)

相关推荐

  • 全网最详细的爬虫实战教学

    转载自:小一的学习笔记 今天要分享的教程是爬取各大城市的二手房数据,抛开以前的文章不谈,下面的内容应该足够你实现这篇爬虫.以下是正文: 一.确定目标 今天我们的目标官网链接是链家网 ok,前提条件交代 ...

  • 『异步反爬』别再说自己不会爬取『抖音』视频了!

    Python爬虫数据分析挖掘 四年编程开发经验,专注于python爬虫.数据分析挖掘.数据可视化.python知识教学,分享日常编程学习和接私活过程.每次推文都『录制讲解视频』手撕代码,关注小白,编程 ...

  • 看我如何抓取最新房价数据

    来源:Python 技术「ID: pythonall」 经过前几年一轮房价大涨,到现在因为国家大力调控等原因,市场已经褪去热度,正在慢慢变得稳定,价格也相较最高时下降了些.那现在房价到底怎样?接下来又 ...

  • 股票分时攻击波,主力拉升的重要特征,看完轻松抓取主升浪

    股票分时攻击波,主力拉升的重要特征,看完轻松抓取主升浪

  • 如何抓取战机?看一看贾诩的战略眼光!

    建安十四年,正月初十,江陵城北乐进大营之中. 乐进和徐晃其实一早就到了江陵城北了,不过一直不敢太过于深入,所以只是在距离城池五十余里的地方扎下大营,然后进行观望. 而贾诩受曹操之命前去江陵城协助作战路 ...

  • 使用 MitmProxy 自动抓取微信公众号阅读数、点赞和再看数据

    来源:Python 技术「ID: pythonall」 某天接到一个需要抓取某某微信公众的所有历史文章的阅读数.点赞和再看数据的需求. 为了解放双手,就用 Python 代码撸一个,选择 MitmPr ...

  • Python抓取B站评论词云可视化(一看就会)

    前言 大家好,我是南南 众所周知,作为一个单身lsp,b站舞蹈区探花,咳咳咳,直接进入正题吧 由于内容过多,爬虫代码csdn上有很多篇博客讲解,我就不写了(我是不会告诉你是我懒的) 视频地址:BV12 ...

  • 网站收录抓取都很正常,搜索标题却没有排名算降权吗?

    昨天一个做推广朋友和平哥SEO优化交流了一个比较经典的问题,他说他的网站排名都掉了很长时间了,100%肯定是命中了惊雷算法(快排作弊,为什么这么肯定,因为他的网站是用过快排软件不到一周左右就出现排名直 ...

  • SEO如何做会更受蜘蛛喜爱抓取,达到事半功倍的效果?

    只有让搜索引擎给网站更高的排名,才可以更多的将网站显示在用户面前,提升用户点击率,提升网站的知名度以及更有效的促进用户转化率,所以,想要做好SEO优化,就需要对搜索引擎规则了解透彻,只做取悦搜索引擎的 ...

  • 死记“盘口”要诀,抓取牛股如探囊取物!

    资金管理 想要在交易中赚钱,先要学会怎么生存,二八定律不再陈述,某种程度上说,能否撑到学会稳定盈利的那一天,跟资金量大小没有必然的关系,更多的是次数,因为1万元一次亏100%跟100万元一次亏100% ...

  • 如何识别真突破,轻松抓取主升浪

    首先纠正一下大家选股的误区,很多朋友喜欢用技术指标选股,CCI KDJ 布林线MACD,金叉死叉,先自问一下,成功率有多高?技术指标具有滞后性,用指标选股,容易被其捆住,影响判断.还有就是总想着买在最 ...