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

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

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

image

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

2 抓取所需的信息

image

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

image

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

image

# 创建Mongodb数据库
client = pymongo.MongoClient()
db = client.rent
collection = db.roomInfo
# 创建一条新的记录
new_data = {
        'title': title,
        'district': district,
         …
         'reshuiqi':reshuiqi
    }
# 使用update_one 而不是insert,是因为发现不同时间重复录入信息
    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’]]
去除异常的数据

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

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

result = pandas.pivot_table(
        data1,
        values = ['size','price'],
        index = ['district'],
        aggfunc = {'size':(numpy.sum,numpy.size),'price':(numpy.sum)}
        )
result.columns = ['price','count','size']
result['average'] = result['price']/result['size']
result = result.sort_values(by='average',ascending = False)
result.to_csv('C:/Users/Henley/Desktop/district.csv',index=True)

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

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

image

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

image

image

image

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

image

image

image

image


本文转载:CSDN博客