zoukankan      html  css  js  c++  java
  • 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) 从各区的均价可看出,江北,渝北,渝中,均价相对较高;

  • 相关阅读:
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯六角幻方
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    java实现第五届蓝桥杯海盗分金币
    jQuery异步上传文件
    关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。
  • 原文地址:https://www.cnblogs.com/henley0000/p/8511077.html
Copyright © 2011-2022 走看看