1. 程式人生 > >Python爬蟲獲取樓盤資訊

Python爬蟲獲取樓盤資訊

    在一家線上租房的公司已經實習兩週了。作為實習生,所以日常的工作主要是收集和整理全國各小區的資訊,比如小區的建成年代,是否有電梯,小區的門牌數等。因為我不太喜歡用複製貼上這種效率低的工作方式,所以寫了一個簡單的Python程式,相對那些高階爬蟲比較簡單,但是還挺實用。通過以下的程式碼可以爬取網站上的相關資訊啦。

def get_shanghai_beike_info(key):
    url1 = 'https://sh.ke.com/ershoufang/rs'+urp.quote(key) **這裡key是小區的名稱,也是函式的引數,這句語句可以生成進入搜尋對應的小區的網址
    req1 = request.urlopen(url1)  **request這條語句,如果發現結果中包括沒有找到,其實就是指沒有找到這個小區的資訊,那麼函式返回'None'
    res1 = req1.read()
    bs1 = BeautifulSoup(res1,'lxml')
    condition = bs1.get_text().find('沒有找到')
    if condition < 0: ##如果發現沒有 '沒有找到',也就是搜尋頁面中有這個小區,那麼在這個解析下來的lxml中找到對應Tag中電梯、建成年代和樓層高度的資訊
        info_lift_1 = bs1.find_all('div',class_ = 'houseInfo')
        if len(info_lift_1) > 1:
            info_lift_2 = str()
            for i in np.arange(len(info_lift_1)): ##這段程式碼我最喜歡,因為現在很多網站不知道是不是有意的,故意把資訊的佈局弄成隨機的。這條語句把所有搜尋到的小區的資訊 
                info_lift_2 += info_lift_1[i].get_text()
            info_lift_3 = re.search(r'[有無]電梯',info_lift_2) ##詳情組合成一個完整的string,然後用正則表示式找其中是否包含'有電梯'或者'沒電梯'
            if info_lift_3 == None:
                lift = 'None'
            else:
                lift = info_lift_3.group()
        elif len(info_lift_1) == 1:
            info_lift_2 = info_lift_1[0].get_text()
            info_lift_3 = re.search(r'[有無]電梯',info_lift_2)
            if info_lift_3 == None:
                lift = 'None'
            else:
                lift = info_lift_3.group()
            
        else:
            lift = 'None'
        info_year_1 = bs1.find_all('div',class_='positionInfo')
        if len(info_year_1)>=1:
            info_year_2 = info_year_1[0].get_text()
            info_year_3 = re.search(r'([12]...)年建',info_year_2)
            if info_year_3 == None:
                year = 'None'
            else:
                year = pd.to_numeric(re.findall(r'\d\d\d\d',info_year_3.group())[0])
            info_floor_1 = re.search(r'共[0-9].*層',info_year_2)
            if info_floor_1 == None:
                floor = 'None'
            else:
                floor2 = info_floor_1.group()
                floor = pd.to_numeric(re.findall(r'\d?\d',floor2)[0])
        return lift,year,floor  ##最後返回值就是是否有電梯、建成年代和樓層高度。樓層高度用來判斷那些電梯資訊不全的小區,如果樓層大於8,就判定為有電梯
    else:
        return 'None','None','None'