Python爬取重庆租房情况(新手爬虫)

Selenium & PhantomJS
  利用基于浏览器的自动化测试工具Selenium ,也可用来辅助网页抓取。PhantomJS在浏览器里可以做的事情,它几乎都能做到,提供了如 CSS 选择器、DOM 操作、对 HTML5 的支持等。

 1 url = 'http://zu.cq.fang.com/'
 2 # 设置代理IP
 3 proxy = [
 4     '--proxy=39.104.48.62:8080',
 5     '--proxy=39.104.14.232:8080',
 6 ]
 7 # 设置打开网页参数,不载入图片会加快爬取速度
 8 service_args=[
 9     '--load-images=no',
10     proxy[0]
11 ]
12 driver = webdriver.PhantomJS(service_args=service_args)
13 driver.get(url)
14 driver.set_window_size(1920,2000)
15 # 获取网页元素
16 soup = BeautifulSoup(driver.page_source,'lxml’)

CSS选择器
  每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是“选择器”。 “选择器”指明了{}中的“样式”的作用对象
其中类别选择器,ID的选择器,标签选择器,后代选择器是我们在抓取时常用的
1 抓取区域的链接 regions = soup.select('#rentid_D04_01 > dd > a')

 

#rentid_D04_01是ID选择器,选取区域所在标签位置
dd,a分别是#rentid_D04_01的子标签

2 抓取所需的信息

点击进入后抓取更多详细信息,其中的信息有部分不需要利用正则表达式处理

配套设施信息抓取,相应的配套设施是否有,标签不同来识别

 1 # 创建Mongodb数据库
 2 client = pymongo.MongoClient()
 3 db = client.rent
 4 collection = db.roomInfo
 5 # 创建一条新的记录
 6 new_data = {
 7         'title': title,
 8         'district': district,
 9 10          'reshuiqi':reshuiqi
11     }
12 # 使用update_one 而不是insert,是因为发现不同时间重复录入信息
13     collection.update_one({'title': new_data['title'],'image':new_data['image']}, {'$set': new_data}, upsert=True)

多线程抓取数据

为了更快的抓取数据,采用并行多线程抓取,函数是把第一层数据当作参数传入

1 for item in items:
2             threading.Thread(target=selectData,args=(item,)).start()
3             while threading.active_count()>15:
4                 time.sleep(2)
5                 print(threading.active_count())

限制线程过多造成堵塞,故而设置了活跃线程数目上限

数据读取
  Mongdb中读取数据到DataFrame data = DataFrame(list(collection.find()))
find函数中可以添加自己所需要的数据名称,读取的数据并不是按照自己所希望的顺序列,则可以转换顺序dataTest = data[['title','district’,…,'reshuiqi’]]
去除异常的数据

 1 #2 去除掉size小于10平方的数据
 2 data1 = dataTest[dataTest['size']>9]
 3 #3 算出均价
 4 data1['average'] = data1['price']/data1['size']
 5 data1['peizhi'] = data1['jiajv']+data1['chuang']+data1['nuanqi']+data1['meiqi']+data1['kuandai']+data1['kongtiao']+data1['bingxiang']+data1['xiyiji']+data1['reshuiqi']
 6 #4 取出超出范围的值,异常值
 7 data1 = data1[data1['average']<100]
 8 data2 = data1[data1['average']>10]
 9 #5 统一装修标准
10 data2['zhuang'] = data2['zhuang'].replace('豪装','豪华装修').replace('简装','简单装修').replace('简装修','简单装修').replace('中装','中等装修').replace('中等','中等装修').replace('中装修','中等装修').replace('精装','精装修').replace('不限','暂无资料')
11 #6 去除无配套设施信息的数据
12 data3 = data2[data2['peizhi']>0]

数据分析
  分别算出各区的面积和价格总和,再求出其平均价格  

 1 result = pandas.pivot_table(
 2         data1,
 3         values = ['size','price'],
 4         index = ['district'],
 5         aggfunc = {'size':(numpy.sum,numpy.size),'price':(numpy.sum)}
 6         )
 7 result.columns = ['price','count','size']
 8 result['average'] = result['price']/result['size']
 9 result = result.sort_values(by='average',ascending = False)
10 result.to_csv('C:/Users/Henley/Desktop/district.csv',index=True)

数据可视化
  目前还不是很熟悉Matplotlib进行数据可视化的展示,故而还是使用的Excel进行数据可视化的展示,同时也尝试使用的Echart进行展示,但还不知道如何进一步的展示出来,还需要进一步的学习。

 

Result(只是个人简单好玩的分析)

对于抓取的数据删除均价大于100,小于10的数据点,对于剩下的数据均价分析
(1) 房天下网站上的报价参差不齐,报价上下差距平均可达20元/㎡,更多是主观议价,并无太大的统一标准;
(2) 经济水平相对高的地区的房屋出租价格高也符合预期水平,如江北,渝北,渝中,南岸地区,这些地区甚至出现高报价50元㎡ ;

 

 


从出租房的面积与均价的关系图看出,
(1) 面积和均价并非正比的关系,面积增长均价变化趋势成凹型;
(2) 面积小的均价相对于中等面积高,均价平均高出10元左右,故从性价比看,租房应该租用面积中等的房子,多室而言即可对外合租,降低自身的租房成本;
(3) 面积大的房型,如大于300 ㎡,更多适用于商务办公类,如
  九龙坡 歇台子轻轨旁,青年汇毛坯商务楼 8000平;
  渝中区 临华大厦 精装修21室整体出租 800平;
  …
4) 从各区的均价可看出,江北,渝北,渝中,均价相对较高;

 

posted @ 2018-03-05 20:20  henleySu  阅读(405)  评论(0编辑  收藏  举报