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) 从各区的均价可看出,江北,渝北,渝中,均价相对较高;

  • 相关阅读:
    184. Department Highest Salary【leetcode】sql,join on
    181. Employees Earning More Than Their Managers【leetcode】,sql,inner join ,where
    178. Rank Scores【leetcode】,sql
    177. Nth Highest Salary【leetcode】,第n高数值,sql,limit,offset
    176. Second Highest Salary【取表中第二高的值】,sql,limit,offset
    118. Pascal's Triangle【LeetCode】,java,算法,杨辉三角
    204. Count Primes【leetcode】java,算法,质数
    202. Happy Number【leetcode】java,hashSet,算法
    41. First Missing Positive【leetcode】寻找第一个丢失的整数,java,算法
    删除
  • 原文地址:https://www.cnblogs.com/henley0000/p/8511077.html
Copyright © 2011-2022 走看看