查看原文
其他

【爬虫实战】恒大的底气?--恒大楼盘数量爬取

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:任   哲,中南财经政法大学经济学院

文字编辑:王子一 

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营在不久前已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!     

9月24日,一份名为《恒大集团有限公司关于恳请支持重大资产重组项目的情况报告》的文件在网络上广为流传,恒大一时间站在了风口浪尖之上。但很快恒大集团很快就辟谣处理,并且在9月30日与战略投资者达成协议,化解了传闻中即将到期的1300亿债务危机。恒大究竟凭借什么来与战略投资者进行谈判,我们不得而知,但是恒大的依仗,肯定和其地产项目离不开关系。

那么恒大地产作为国内房地产龙头企业之一,布局全国,具体下来又有多少地产项目呢?今天小编就带你一起爬取恒大官网,一起了解恒大的地产布局。

爬虫思路

我们进入恒大的官网,在首页找到地区公司选项,点击即可看到恒大在全国的所有分公司。

以华东公司为例,打开Chrome浏览器的开发者模式,可以看到公司的官网链接在href属性之中。

进入华东公司的官网,再点击精品项目,便会出现该地区楼盘列表,接下来就可以根据楼盘列表爬取所有地区的楼盘。

具体操作

1.单个地区抓取

正式操作之前,引用我们所需的包,在本例中,由于要不停的更改需要爬取的网页,我们选择selenium来模拟鼠标操作帮助我们爬取:

from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutExceptionfrom lxml import etreeimport reimport pandas as pdimport timeimport os

首先,对selenium进行设置,打开恒大官网:

#设置seleniumCHROME_OPTIONS = webdriver.ChromeOptions()prefs = {"profile.managed_default_content_settings.images":2} # 1代表显示图片,2代表不显示图片CHROME_OPTIONS.add_experimental_option("prefs", prefs)#打开恒大官网url = "https://www.evergrande.com/Home"CHROME_DRIVER = './Driver/chromedriver.exe'driver = webdriver.Chrome(executable_path=CHROME_DRIVER, options=CHROME_OPTIONS) # 初始化浏览器driver.set_window_position(0, 0)driver.maximize_window() # 设置浏览器窗口最大化driver.get(url) # 打开要访问的页面

我们在官网中,找到地区公司的xpath,得到各分公司的名单并借助href属性模拟点击分公司的网址。同时,为方便后期分析,把分公司所在地区保留在region之中。这里以华东分公司为例,代码如下:

driver.find_element_by_xpath("""//a[@class='ad_a1']""").click()time.sleep(2)
html = driver.page_source # 获取页面源代码tree = etree.HTML(html)
#各地分公司的网址都在属性之中filiale_xpath = "//div[@class='innerWrapper']/ul/li[1]/a/@href"filiale_web = tree.xpath(filiale_xpath) filiale_web = filiale_web[0] #提取网址filiale_web = str(filiale_web) #将网址转化为字符型
#为方便后期分析,把分公司所在地区保留在region之中region_xpath = "//div[@class='innerWrapper']/ul/li[1]/a/text()"region=tree.xpath(region_xpath)region=region[0]region=str(region)region=region[0:-2]

在打开分公司网站之后,再利用selenium模拟点击精品项目选项就可以打开楼盘列表进行爬取了。代码如下:

#爬取各个分公司的楼盘项目driver.get(filiale_web) driver.find_element_by_xpath("""//ul/li[@id='nav4']/a[@class='navA']""").click()time.sleep(2) estate_list=[]estate_xpath = "//ul[@id='cl']/li/a/p[@class='title']"estate_list = driver.find_elements_by_xpath(estate_xpath)region_list = [region]*len(estate_list)

通过上述操作,便可将华东分公司的楼盘信息保存到estate_list当中,结果如下:

2.所有地区抓取

接下来,我们需要爬取其余公司的信息。通过观察可以发现各地分公司的xpath具有一定的规律,我们可以直接利用循环爬取所有公司的信息。在循环之中,我们添加一些代码进行完善:

#设置列表,将每个分公司的数据拼接进去all_estate=[]all_region=[]
for num in range(1,27): #打开地区公司,获取每个分公司的网址 driver.find_element_by_xpath("""//a[@class='ad_a1']""").click() time.sleep(2)
html = driver.page_source # 获取页面源代码 tree = etree.HTML(html)
#各地分公司的网址都在属性之中 filiale_xpath = "//div[@class='innerWrapper']/ul/li[%g]/a/@href"%num filiale_web = tree.xpath(filiale_xpath) filiale_web = filiale_web[0] #提取网址 filiale_web = str(filiale_web) #将网址转化为字符型
#为方便后期分析,把分公司所在地区保留在region之中 region_xpath = "//div[@class='innerWrapper']/ul/li[%g]/a/text()"%num region=tree.xpath(region_xpath) region=region[0] region=str(region) region=region[0:-2] #判断网页是否正常打开 try : driver.get(filiale_web) print(region,"分公司官网正常打开") except : print(region,"分公司官网无法打开") print(filiale_web) driver.get(url) #重新打开恒大官网 time.sleep(2) continue #爬取各个分公司的楼盘项目 driver.find_element_by_xpath("""//ul/li[@id='nav4']/a[@class='navA']""").click() time.sleep(2) estate_list=[] estate_xpath = "//ul[@id='cl']/li/a/p[@class='title']" estate_list = driver.find_elements_by_xpath(estate_xpath) region_list = [region]*len(estate_list)
for estate,region in zip (estate_list,region_list) : all_estate.append(estate.text) all_region.append(region)
#为了下次循环顺利进行,重新打开恒大官网 driver.get(url) time.sleep(2)

最后,我们发现河南分公司无法正常打开。通过直接百度进入恒大河南分公司我们发现,河南分公司xpath的href属性提供的网址(http://hnzz.evergrande.com/)是错误的(扣鸡腿!),正确网址的应该是https://hdzy.evergrande.com/。这样,河南分公司的楼盘信息只好单独爬取了。

3.结果分析

在爬取河南分公司的数据后,所有分公司的数据就全部得到了。通过对爬取的数据进行整理发现,恒大集团在中国大陆共有766个楼盘,与官网声明的870多个项目有所差距,这可能是由于楼盘信息公布不完整、项目不完全为房地产等原因。但不管怎样,在全国至少拥有766个楼盘,也给了恒大与战略投资者谈判的底气。这766个楼盘在全国的分布如下图所示:

从地域上来看,恒大地产布局空间很广,几乎在中国大陆各个地区都设有分公司。其中广东省作为恒大集团的大本营,一省拥有两家分公司:珠三角公司与深圳公司,共有楼盘120个,当之无愧地夺得冠军!

本次推文的内容到这里就全部结束了,如果你觉得有所收获,请不要忘记点赞哦~

(ps:完整的程序和数据可以在后台回复“恒大楼盘”来获取~)





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
Python遇上Stata--IPyStata介绍
变量类型转换之encode&decode命令
Seminar | 主动型基金:我还行吗?

Seminar | CEO的哪些特征和能力更重要?

用词云图看Sustainability期刊热门题目

用Python把新婚祝福打满公屏!

震惊!知名数据分析软件竟被某度翻译“亲切称呼”为“斯塔塔”

喜临涛门,月满人圆

Python3.8新秀海象符成功出道
“合”我在一起—merge
在Sustainability上发文最多的原来是这些高校

Python中的这些运算符你真的会用吗?

字符串函数总动员

用词云图看2020社科基金课题~
建议收藏!Python精选推文干货合集
xpose和sxpose,谁是卧底?
让你的数据一目了然--label命令介绍
Python推文合集基础篇(下)|算法简介
【小白指南】Python中有哪些数据类型?(附推文合集)
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存