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

来源:Python 技术「ID: pythonall」

经过前几年一轮房价大涨,到现在因为国家大力调控等原因,市场已经褪去热度,正在慢慢变得稳定,价格也相较最高时下降了些。那现在房价到底怎样?接下来又会是怎样的发展的趋势?这里我们就可以通过 Python 把最近的房价数据抓取下来进行分析。

模块安装

这里需要安装以下模块,当然如果已安装就不用再装了:

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

配置请求头

一般我们在抓取网站时,为了应对网站的反爬机制,我们会把请求的头信息进行封装处理,以下是最简单的处理,就是将请求客户端信息进行随机选择并使用,代码如下:

# 代理客户端列表USER_AGENTS = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",]
# 创建请求头信息def create_headers(): headers = dict() headers["User-Agent"] = random.choice(USER_AGENTS) headers["Referer"] = "http://www.ke.com" return headers

配置代理IP

除了上面配置请求头外,如果你用相同的 IP 大量请求抓取时,很可能会被封 IP,被封后再用这个 IP 请求网站时,会提示你请求超时,为避免被封最好我们通过代理 IP 去抓取,怎样才能找到能用的代理 IP?

# 引入模块from bs4 import BeautifulSoupimport requestsfrom lib.request.headers import create_headers
# 定义变量proxys_src = []proxys = []
# 请求获取代理地址def spider_proxyip(num=10): try: url = 'http://www.xicidaili.com/nt/1' # 获取代理 IP 列表 req = requests.get(url, headers=create_headers()) source_code = req.content # 解析返回的 html soup = BeautifulSoup(source_code, 'lxml') # 获取列表行 ips = soup.findAll('tr')
# 循环遍历列表 for x in range(1, len(ips)): ip = ips[x] tds = ip.findAll("td") proxy_host = "{0}://".format(tds[5].contents[0]) + tds[1].contents[0] + ":" + tds[2].contents[0] proxy_temp = {tds[5].contents[0]: proxy_host} # 添加到代理池 proxys_src.append(proxy_temp) if x >= num: break except Exception as e: print("获取代理地址异常:") print(e)

房价数据对象

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

# 新房对象class NewHouse(object): def __init__(self, xiaoqu, price, total): self.xiaoqu = xiaoqu self.price = price self.total = total
def text(self): return self.xiaoqu + "," + \ self.price + "," + \ self.total

获取房价信息并保存

好了,做好以上准备,下面我们就以贝壳为例,批量爬取其北京地区新房数据,并保存到本地。其实只要能抓取到数据,想保存成什么格式都可以,当然也可以保存到数据库。这里我主要想说的是如何抓取数据,所以这里就保存成最简单的 txt 文本格式。

# 创建文件准备写入with open("newhouse.txt", "w", encoding='utf-8') as f: # 获得需要的新房数据 total_page = 1 loupan_list = list() page = 'http://bj.fang.ke.com/loupan/' # 调用请求头 headers = create_headers() # 请求 url 并返回结果 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.fang.ke.com/loupan/pg{0}'.format(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_="resblock-list") # 循环遍历获取想要的元素 for house_elem in house_elements: price = house_elem.find('span', class_="number") desc = house_elem.find('span', class_="desc") total = house_elem.find('div', class_="second") loupan = house_elem.find('a', class_='name')
# 开始清理数据 try: price = price.text.strip() + desc.text.strip() except Exception as e: price = '0'
loupan = loupan.text.replace("\n", "") # 继续清理数据 try: total = total.text.strip().replace(u'总价', '') total = total.replace(u'/套起', '') except Exception as e: total = '0'
# 作为对象保存到变量 loupan = NewHouse(loupan, price, total) print(loupan.text()) # 将新房信息加入列表 loupan_list.append(loupan)
# 循环获取的数据并写入到文件中 for loupan in loupan_list: f.write(loupan.text() + "\n")

代码写好了,现在我们就可以通过命令 python newhouse.py 运行代码进行数据抓取了。抓取的结果如下图所示:

总结

本文为大家介绍了如何通过 Python 将房产网上的新房数据批量抓取下来,然后就可以将每天抓取的结果跟历史数据进行对比分析,来判断楼市的大概趋势。其中涉及到了用 BeautifulSoup 进行 html 解析,整个代码来看实现方式并不难,希望通过这个过程可以为你提供一些帮助。

(0)

相关推荐

  • 浏览器的“套娃行为”有多凶残?

    几乎所有的中国网民都不会忘记 2010 年的"3Q大战". 在腾讯做出那个"非常艰难的决定"之后,360 不但不能与 QQ 同时安装了,使用 360 浏览器的用 ...

  • scrapy 爬取网上租房信息

    一.背景 为了分析一线城市的房价在工资的占比,我用Python分别爬取了自如以及拉勾的数据.(见公众号「Crossin的编程教室」今天第1条推送) 本文使用 scrapy 进行爬取自如所有城市的租房信 ...

  • python爬虫添加请求头和请求主体

    添加头部信息有两种方法 1.通过添加urllib.request.Request中的headers参数 1 #先把要用到的信息放到一个字典中 2 headers = {} 3 headers['Use ...

  • requests模块的入门使用

    requests模块的入门使用 dongge-destiny 2018-07-11 00:10:18  137  收藏 分类专栏: python-爬虫 文章标签: requests模块的入门使用 版权 ...

  • 锲而不舍,爬虫的魂

    写爬虫经常被封锁,常用的策略有伪装成浏览器,降低访问频率,还有一个是修正一下重新爬.关于代理IP不在本文范畴,我们只需要够用的数据即可,一般一个IP,一台机器慢慢的爬就可以了. 分别看看这几个策略的实 ...

  • fake-useragent库:值得花2分钟学习的库

    前几天意外找到一个简单实用的库- fake-useragent,可以伪装生成headers请求头中的User Agent值.再也不用,重复做复制粘贴这种很Low的工作了. 安装 pip3 instal ...

  • 【科研工具】Mac系统如何使用IE浏览器模式?

    在平时需要填写一些系统信息时,针对Mac系统用户可能会出现如下提示,需要使用IE浏览器才能完成接下来的操作,或者在某些网页界面显示不正常时,也需要调整为IE浏览器才能正常操作. 那么针对这种情况,有什 ...

  • scrapy实践之settings的配置

    在scrapy创建的爬虫项目中,包括了以下4个基本文件 1. items.py 2. middlewares.py 3. pipelines.py 4. settings.py items定义了需要从 ...

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

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

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

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

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

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

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

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

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

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

  • 哈佛大学最新微型夹爪可抓取自重30倍的物体,可搬运微小芯片等

    导读 微型机器人指的是尺寸以毫米或者微米计量的机器人,它们结构精巧,通常由智能材料驱动,例如具有压电效应的电活性材料.虽然现在很多微型机器人都展示了不错的运动能力,但它们还缺少一个关键的部件,那就是能 ...

  • 哈佛研发最新软体机器人不仅能抓取,还能实现"人造肌肉和心脏"

    我们见过很多软体机器人,他们中有的可以披着科技的外衣,靠将一个完美的故事登上<Science Robotic>的封面.比如眼下这款 无意冒犯 也有的实实在在的科学家,怀揣民生大计,踏踏实实 ...

  • 河南省辖市直管县最新房价数据:让你看懂房价、GDP和人口的关系

    投实君按:高手对弈要看十步之外,普通人投资也至少要看5年以后. 投实君根据公开信息整理了河南省18个省辖市和10个直管县最新的房价数据.GDP数据以及2014年末各省辖市直管县人口总量和人口变化数据. ...

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

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