python实战计划:在MongoDB中筛选房源

Date:2016-10-4
By:Black Crow

前言:

本次作业为第二周第一节的作业,使用MongoDB来筛选大于等于500的房源。
直接爬取的是列表页的几项数据,未进入房源页进行爬取。

作业效果:

python实战计划:在MongoDB中筛选房源_第1张图片
大于等于500.png

我的代码:

20161004代码

-- coding: utf-8 --

from bs4 import BeautifulSoup
from pymongo import MongoClient
import requests,time
client = MongoClient('localhost',27017)
xiaozhu = client['xiaozhu']
page_info = xiaozhu['page_info']
def get_house_data(page_url):
page_data = requests.get(page_url)
page_soup = BeautifulSoup(page_data.text,'lxml')
titles = page_soup.select('div > a > span')
imgs = page_soup.select('li > a > img')
prices = page_soup.select('span.result_price > i')
house_urls =page_soup.select('div.result_btm_con.lodgeunitname')
#需要注意下面zip函数,如果爬漏了会导致其他信息都不匹配,可能的解决方式就是去拿上一级的信息
# print(imgs)
for title,img,price,house_url in zip(titles,imgs,prices,house_urls):
house_data ={
'title':title.get_text(),
'img':img.get('lazy_src'),#直接拿src显示的是lazysrc
'price':int(price.get_text()),
'house_url':house_url.get('detailurl')#之前爬的href,有缺漏导致信息不一一匹配,换了
}
#print(house_data)
page_info.insert_one(house_data)
time.sleep(1)
def find_page_info():
for item in page_info.find({'price':{'$gte':500}}):#使用了$gte匹配数据库,答案使用的是if
print(item)#查找的是区间的话如何处理?
page_urls =['http://gz.xiaozhu.com/search-duanzufang-p{}-0/'.
format(str(i)) for i in range(4)]
for page_url in page_urls:
get_house_data(page_url)
find_page_info()


####总结:
>1. 从数据库中提取的时候写的选取方式比较方便,但是对于区间的数据如何处理,比如大于等于500小于等于700的。答案中固然采用的是if形式进行的处理,按此可以实现,但还是对于简便方式处理时的方法好奇。

你可能感兴趣的:(python实战计划:在MongoDB中筛选房源)