美文网首页
中国的超级城市新房抓取:来源房多多

中国的超级城市新房抓取:来源房多多

作者: 马益_6db5 | 来源:发表于2017-12-15 17:29 被阅读0次

@DC学院《Python爬虫:入门+进阶》
昨晚睡不着,用《得到》随机听了三十分钟音频,其中一篇是王煜全老师讲的关于超级城市的商业机会,突然对超级城市有些感兴趣;今天早上在DC学院的爬虫课交流群里看到其他同学交的爬虫作业,突然对爬虫作业有些感兴趣;之前在数据分析入门课上学习获取数据这一章时,其实自己学爬过一些小数据,如是乎找了找之前的一些笔记,发现了自己爬房多多留下的蛛丝马迹;所以感兴趣加上对过去笔记的温习;我决定爬一下中国的超级城市在房多多上公布的新房数据。

是时候展现真正的技术了。首先确定爬取思路大概如下(好吧,我是渣渣,这是爬完之后总结的):1、确定待爬网站:房多多,待爬范围:新房,待爬内容(根据网页内容进行选择,页面如下图):城市名、楼盘名、楼盘所在区域、楼盘详细地址,户型、面积、总价、单价以及关注度等几项数据。


网页页面内容.png

2、确认网页加载方式(禁用javascript,刷新网页来判断):房多多用的是同步加载;

3、观察网页特征,通过选取不同的页面可以发现网页参数只是改变了pg后的数字,那么在后面的抓取中只需要一个for循环就可以搞定多页抓取了,但是这时候有个新问题:每个超级城市的新房楼盘数量不同,所以在for循环时,range的个数也不一样;所以要通过网页抓取每个超级城市的新房有多少个page;

4、观察特征,抓取数据。

既然思路确认了,是时候展现真正的技术了;首先检查(好吧,我是渣渣,其实一开始我就没检查)我创建的python3.5的虚拟环境中是否安装了BeautifulSoup4和urllib.request模块,运行如下代码:import sys 和 sys.modules.keys() 即可查看所有已安装的模块

我喜欢从外层往内层的来写代码(好吧,我是渣渣,一开始我是只写单页的,后面才把循环一层层补上去的),鉴于我已经在代码中做了比较多的注释,就不进行一步步详解了,直接放代码:

from bs4 import BeautifulSoup
import urllib.request as urlrequest
url_get_pages = "https://{}.fangdd.com/loupan/"#这里使用每个supercity的第一页,为获取每个city的页数做准备
locations = ["chongqing","shanghai","beijing","tianjin","chengdu","guangzhou","shenzhen","haerbin","suzhou","wuhan"]
#获取每个城市新房总页数
pgs = []
for location in locations:
    url =url_get_pages.format(location)#遍历补全每一个city的url
    page_crawl_url = urlrequest.urlopen(url).read()#读取url内容
    page_https_url = page_crawl_url.decode("utf-8")#编码设置
    soup = BeautifulSoup(page_https_url,"html.parser")#设置解析方式为html
    page_soup = soup.find_all(class_ ='_1EyO9')#根据class的特征获取总页数满足的范围
    pgs.append(int(page_soup[-2].get_text()))#发现倒数第二个获取的结果即为总页数,注意使用int转换一下;将总页数添加到pgs的list中
pg_dict = dict(zip(locations,pgs))#创建city和页数的对应字典
with open ('fangduoduo.csv','w',encoding='utf-8')as outputfile:#设置导出文件名,编码方式,这里是默认目录
    urls = "https://{}.fangdd.com/loupan-pg{}/"#设置url的通用式
    for location in locations:#遍历city
        for i in range(pg_dict[location]):#遍历页数
            pg = i+1#设置页数每次增加1
            url =urls.format(location,pg)#代入city和页数,组成每一个city的每一页的完整url
            crawl_url = urlrequest.urlopen(url).read()
            https_url = crawl_url.decode('utf8')
            soup = BeautifulSoup(https_url,'html.parser')
            all_soup = soup.find_all(class_ = '_22560')
            links_url = "https://{}.fangdd.com"#这里在com后面没有加/是因为爬取的link前面已经带有/
            link_url = links_url.format(location)
            for each_soup in all_soup:
                city = soup.find(class_ ='_1Ftcx').get_text().replace('\r\n','').replace(' ','').replace(',','')
                name = each_soup.find(class_ ='_2Q-Ct').get_text().replace('\r\n','').replace(' ','').replace(',','')
                areas = each_soup.find(class_ ='_2Sxyg').get_text().replace('\r\n','').replace(' ','').replace(',','')
                details = each_soup.find(class_ ='_19Hij').get_text().replace('\r\n','').replace(' ','').replace(',','').split('|')
                area = details[0]
                #此后的几个特征都使用try和except的方式,存在特殊情况,确保统一性
                try:
                    house_type = details[1]
                except:
                    house_type = ""
                try:
                    floor_space = details[2]
                except:
                    floor_space = ""
                try :
                    total_price = each_soup.find(class_ ='_1zKaO').get_text().replace('\r\n','').replace(' ','').replace(',','')
                except:
                    total_price = each_soup.find(class_ ='X3L_9').get_text().replace('\r\n','').replace(' ','').replace(',','')
                try:
                    price = each_soup.find(class_ ='_3J8M9').get_text().replace('\r\n','').replace(' ','') .replace(',','')
                except:
                    price = ""
                try:
                    attention = each_soup.find(class_ ='_2b7ai').get_text().replace('\r\n','').replace(' ','') 
                except:
                    attention = ""
                links = each_soup.find(class_ ='_1AXFZ')
                link = links.find_all('a')[0]
                link_name=(link["href"])
                true_link = link_url + link_name #通过抓取href再拼接上link_url组成完成的每个楼盘的url
                #导出每一个特征,组成文件
                outputfile.write('{},{},{},{},{},{},{},{},{}\n'.format(city,name,area,house_type,floor_space,total_price,price,attention,true_link))

爬取的截图结果如下:


爬取结果截图.png

爬取的结果一共3056行,在获得csv文件后,直接用excel打开中文会出现乱码,需要使用记事本打开后,另存,改变编码方式为ANSI,再使用csv打开即可搞定。
其实写这次爬虫作业基本没有使用到DC爬虫课程中的学习内容,之前学习完DC的数据分析课程后,感觉自己的编程基础薄弱;最近在学习python的基础;突然在群里收到的消息,所以才想做一下这个作业,看了以及交完作业的几个同学写的爬虫,感觉很棒;待完成python基础的学习后,再来学习爬虫课程,xpath看起来很好用啊!后面要加油赶上进度了,尽早开始爬虫学习啦!希望能像ZhuNewNew同学一样,系统地写一个爬虫代码。

相关文章

网友评论

      本文标题:中国的超级城市新房抓取:来源房多多

      本文链接:https://www.haomeiwen.com/subject/wvpdwxtx.html