Web Crawler Practice :: Dynamic Webpage (591)¶

Dr. Chan, Chun-Hsiang
Department of Geography, National Taiwan Normal University

In [6]:
# import packages
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
In [7]:
# set parameters
url = 'https://rent.591.com.tw/'
In [167]:
# start a webdriver
browser = webdriver.Chrome()
# enter url
browser.get(url)
In [168]:
# fetch the textbox for searching a location
searchTextBox = browser.find_element(By.CSS_SELECTOR, "input[class*='searchInput form-control']")
# send the searching criteria "師大"
searchTextBox.send_keys('師大')
In [169]:
# fetch the dropdown list
dropDownList_Search = browser.find_elements(By.CSS_SELECTOR, "ul[class*='search-input-list dropdown-menu']")[1]
In [170]:
# fetch the dropdown list info. and print them out
whole_list = dropDownList_Search.find_elements(By.CSS_SELECTOR, "li")

for i in range(len(whole_list)):
    # index to the specific item from the dropdown list
    tmp_list = whole_list[i]
    # fetch the location data
    house_district_info = tmp_list.find_element(By.CSS_SELECTOR, "div[class='kwordsLeft']").text
    # split by space and fetch the zero-index info. => apartment info
    house_info = house_district_info.split(' ')[0]
    # split by space and fetch the one-index info. => district info
    district_info = house_district_info.split(' ')[1]
    
    # fetch the number of available items
    num_available = tmp_list.find_element(By.CSS_SELECTOR, "span[class='kwordsRight']").text
    # delete the space and fetch the number of available items
    num_available = num_available.replace(' ', '')
    # print all info
    print(house_info+'('+district_info+'): '+num_available)
師大路師大金棧(大安區): 約2間
師大隱大樓(大安區): 約1間
大師大(大安區): 約23間
師大麗水(大安區): 約9間
師大金棧(大安區): 約2間
師大金冠(大安區): 約1間
華豐師大名廈(大安區): 約1間
In [171]:
# select 大師大(大安區): 約26間
whole_list[2].click()
In [172]:
# click the SEARCH button
browser.find_element(By.CSS_SELECTOR, "div[data-gtm-stat='新版租屋列表頁_搜尋_搜尋']").click()
In [173]:
# clean the searching textbox
searchTextBox.clear()
# send a blank (space) to the searching textbox
searchTextBox.send_keys(' ')
In [178]:
# fetch the dropdown list info. and print them out
whole_list = dropDownList_Search.find_elements(By.CSS_SELECTOR, "li")

for i in range(len(whole_list)):
    # index to the specific item from the dropdown list
    tmp_list = whole_list[i]
    # fetch the location data
    house_district_info = tmp_list.find_element(By.CSS_SELECTOR, "div[class='kwordsLeft']").text
    # split by space and fetch the one-index info. => district info
    district_info = house_district_info.split(' ')[0]
    
    # fetch the number of available items
    num_available = tmp_list.find_element(By.CSS_SELECTOR, "span[class='kwordsRight']").text
    # delete the space and fetch the number of available items
    num_available = num_available.replace(' ', '')
    # print all info
    print(district_info+': '+num_available)
中山區: 約1961間
大安區: 約1637間
信義區: 約1525間
士林區: 約1235間
內湖區: 約1145間
中正區: 約808間
松山區: 約790間
大同區: 約633間
萬華區: 約601間
北投區: 約578間
In [179]:
# click on "大安區"
whole_list[1].click()
In [180]:
# click the SEARCH button
browser.find_element(By.CSS_SELECTOR, "div[data-gtm-stat='新版租屋列表頁_搜尋_搜尋']").click()
In [181]:
# create an empty list
filter_info = []

# get all conditional filters
for index in range(5):
    # wait a moment
    time.sleep(1)
    # fetch conditional filter info
    tmp_info = browser.find_elements(By.CSS_SELECTOR, "ul[class*='vue-filter-content']")[index].text
    # print conditional filter info
    print(index, '-->', tmp_info)
    # save conditional filter info
    filter_info.append(tmp_info)
    
# show conditional filter info
filter_info
0 --> 按鄉鎮 按捷運 按學校 按商圈
清空條件
保存搜尋
1 --> 不限 整層住家 獨立套房 分租套房 雅房 車位 其他
2 --> 不限 5000元以下 5000-10000元 10000-20000元 20000-30000元 30000-40000元 40000元以上
- 元
3 --> 不限 1房 2房 3房 4房以上
4 --> 不限 新上架 近捷運 可養寵物 可開伙 有車位 有電梯 有陽台 可短期租賃
Out[181]:
['按鄉鎮 按捷運 按學校 按商圈\n清空條件\n保存搜尋',
 '不限 整層住家 獨立套房 分租套房 雅房 車位 其他',
 '不限 5000元以下 5000-10000元 10000-20000元 20000-30000元 30000-40000元 40000元以上\n- 元',
 '不限 1房 2房 3房 4房以上',
 '不限 新上架 近捷運 可養寵物 可開伙 有車位 有電梯 有陽台 可短期租賃']

Search Conditions

wish_district = '大安區'
wish_type = '整層住家'
wish_price = '20000-30000元'
wish_room = '2房 or 3房'
wish_condition = '可開伙'
In [183]:
# wish_district => 大安區
wish_district = browser.find_elements(By.CSS_SELECTOR,
                                      "ul[class*='town-list clearfix']>li[class*='vue-filter-item']")[2]
print(wish_district.text)
# checked
wish_district.find_elements(By.CSS_SELECTOR, "i[class='fa fa-check']")[0].click()
大安區
In [184]:
# wish_type => 整層住家
wish_type = browser.find_elements(By.CSS_SELECTOR, 
                                  "ul[class*='vue-filter-content']>li[class*='vue-filter-item']")[1]
print(wish_type.text)
# checked
wish_type.click()
整層住家
In [185]:
# wish_type => 20000-30000元
wish_price = browser.find_elements(By.CSS_SELECTOR, "ul[class*='vue-filter-content']")[2]
print(wish_price.text)
# checked
wish_price.click()
不限 5000元以下 5000-10000元 10000-20000元 20000-30000元 30000-40000元 40000元以上
- 元
In [186]:
# wish_room => 2房 or 3房
wish_room = browser.find_elements(By.CSS_SELECTOR, "ul[class*='vue-filter-content']")[3]
print(wish_room.text)
wish_room1 = wish_room.find_elements(By.CSS_SELECTOR, "li[class='vue-filter-item']")[1]
print(wish_room1.text)
wish_room2 = wish_room.find_elements(By.CSS_SELECTOR, "li[class='vue-filter-item']")[2]
print(wish_room2.text)
# checked
wish_room1.click()
time.sleep(2)
wish_room2.click()
time.sleep(2)
不限 1房 2房 3房 4房以上
2房
3房
In [187]:
wish_condition = browser.find_elements(By.CSS_SELECTOR, "ul[class*='vue-filter-content']")[4]
print(wish_condition.text)
wish_condition_ = wish_condition.find_elements(By.CSS_SELECTOR, "li[class='vue-filter-item']")[3]
print(wish_condition_.text)
time.sleep(2)
wish_condition.click()
不限 新上架 近捷運 可養寵物 可開伙 有車位 有電梯 有陽台 可短期租賃
可開伙
In [85]:
# fetch all list info
list_info_ = browser.find_elements(By.CSS_SELECTOR, "section[class*='vue-list-rent-item']")

# get data
for idx_list in range(len(list_ls)):
    # fetch title info
    print('======= #'+str(idx_list)+"- list =======")
    item_title = list_info_[idx_list].find_element(By.CSS_SELECTOR, "div[class='item-title']").text
    print(item_title)
    
    # fetch tag info
    item_tags = list_info_[idx_list].find_element(By.CSS_SELECTOR, "ul[class='item-tags']").text
    item_tags = item_tags.split(' ')
    print(item_tags)
    
    # fetch style info
    item_style = list_info_[idx_list].find_element(By.CSS_SELECTOR, "ul[class='item-style']").text
    item_style = item_style.split(' ')
    print(item_style)

    # fetch area info
    item_area = list_info_[idx_list].find_element(By.CSS_SELECTOR, "div[class='item-area']").text
    item_area = item_area.split(' ')
    print(item_area)
    
    # fetch public transportation info
    try:
        item_tip_subway = list_info_[idx_list].find_element(By.CSS_SELECTOR, "div[class='item-tip subway']").text
        print(item_tip_subway)
    except:
        item_tip_bus = list_info_[idx_list].find_element(By.CSS_SELECTOR, "div[class='item-tip bus']").text
        print(item_tip_bus)

    # fetch message info (identity, agent, last update, and number of views)
    item_msg = list_info_[idx_list].find_element(By.CSS_SELECTOR, "div[class='item-msg']").text
    item_msg = item_msg.split(' ')
    print(item_msg)
    
    time.sleep(1)
======= #0- list =======
*通化街靜巷明亮美寓*~住商儀居小紀
['近捷運', '隨時可遷入', '可開伙', '可養寵物', '有車位', '免管理費']
['整層住家', '2房1廳', '16坪', '頂樓加蓋/5F']
['通化街公寓', '大安區-通化街175巷10弄']
距六張犁站 358公尺
['仲介', '紀冠群', '17天前更新', '昨日140人瀏覽']
======= #1- list =======
龍門國中大安森林公園中國文化大學
['屋主直租', '近捷運', '拎包入住', '隨時可遷入', '可開伙', '免管理費']
['整層住家', '2房1廳', '15坪', '2F/4F']
['大安區-和平東路二段']
距科技大樓站 491公尺
['屋主', '丁小姐', '16分鐘內更新', '昨日145人瀏覽']
======= #2- list =======
Cozy六張犛站歐風俏麗2房1廳4樓頂加 優選好屋
['屋主直租', '近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '23坪', '5F/5F']
['大安區-基隆路二段159巷']
距六張犁站 147公尺
['屋主', '鄭小姐', '16分鐘內更新', '昨日204人瀏覽']
======= #3- list =======
台電大樓站.低樓層.獨立陽台.兩房一廳 優選好屋
['近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '18坪', '2F/5F']
['大安區-雲和街']
距台電大樓站 394公尺
['代理人', '曾小姐', '16分鐘內更新', '昨日111人瀏覽']
======= #4- list =======
生活機能極佳、交通便利
['屋主直租', '近捷運', '新上架', '拎包入住', '近商圈', '隨時可遷入']
['整層住家', '2房1廳', '25坪', '頂樓加蓋/4F']
['大安區-信義路四段265巷21弄']
距信義安和站 221公尺
['屋主', '關小姐', '16分鐘內更新', '昨日186人瀏覽']
======= #5- list =======
古亭捷運/台電大樓捷運/兩房/可養寵物
['近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙', '可養寵物']
['整層住家', '2房1廳', '12坪', '頂樓加蓋/4F']
['大安區-羅斯福路三段']
距古亭站 365公尺
['仲介', '劉小姐', '3小時內更新', '昨日79人瀏覽']
======= #6- list =======
近臨江夜市,二樓整層(三房兩廳兩衛)出租 優選好屋
['屋主直租', '近捷運', '新上架', '拎包入住', '隨時可遷入', '可開伙']
['整層住家', '3房2廳', '33坪', '2F/3F']
['大安區-通化街39巷62弄']
距信義安和站 483公尺
['屋主', '吳太太', '3小時內更新', '昨日144人瀏覽']
======= #7- list =======
信義安和、租補、新裝潢
['近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '18坪', '5F/5F']
['@970lvjys', '大安區-通化街140巷']
距六張犁站 499公尺
['仲介', '高先生', '3小時內更新', '昨日58人瀏覽']
======= #8- list =======
全新裝潢信義安和獨立陽台兩房可寵 優選好屋
['近捷運', '新上架', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '15坪', '3F/4F']
['大安區-臨江街']
距信義安和站 439公尺
['仲介', '沈先生', '3小時內更新', '昨日65人瀏覽']
======= #9- list =======
信義安和,臨江夜市,新裝修1+1房,獨洗 優選好屋
['近捷運', '新上架', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '15坪', '3F/3F']
['大安區-光復南路692巷4弄']
距信義安和站 511公尺
['仲介', '顏小姐', '7小時內更新', '昨日64人瀏覽']
======= #10- list =======
信義安和,臨江夜市,新裝修1+1房,通風 優選好屋
['近捷運', '新上架', '拎包入住', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '15坪', '3F/3F']
['大安區-光復南路692巷4弄']
距信義安和站 511公尺
['仲介', '潘先生', '3小時內更新', '昨日5人瀏覽']
======= #11- list =======
麟光站、三房、機能好、採光通風、天然氣
['近捷運', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '3房1廳', '20.6坪', '4F/5F']
['大安區-和平東路三段']
距麟光站 234公尺
['仲介', '林先生', '9小時內更新', '昨日36人瀏覽']
======= #12- list =======
泰順雅寓2房
['近捷運', '拎包入住', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '17坪', '3F/4F']
['大安區-泰順街44巷']
距台電大樓站 413公尺
['代理人', '陳先生', '11小時內更新', '昨日12人瀏覽']
======= #13- list =======
超值電梯1+1房🌵東門&大安森林公園站
['近捷運', '近商圈', '有電梯', '可開伙']
['整層住家', '2房2廳', '13.7坪', '5F/6F']
['大安區-信義路二段198巷']
距東門站 507公尺
['仲介', '吳小姐', '14小時內更新', '昨日103人瀏覽']
======= #14- list =======
SOGO美兩房♥️租補♥️雙捷運♥️快約
['影片賞屋', '近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '13坪', '4F/4F']
['大安區-敦化南路一段160巷']
距忠孝敦化站 378公尺
['仲介', '陳先生', '15小時內更新', '昨日62人瀏覽']
======= #15- list =======
信義安和站,機能強,新裝潢,東區 優選好屋
['近捷運', '新上架', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '25.5坪', '頂樓加蓋/4F']
['大安區-信義路四段265巷21弄']
距信義安和站 230公尺
['仲介', '江先生', '16小時內更新', '昨日22人瀏覽']
======= #16- list =======
真正✨東門&大安森林公園站✨電梯1+1房
['近捷運', '近商圈', '有電梯', '隨時可遷入', '可開伙']
['整層住家', '2房2廳', '13.7坪', '5F/6F']
['大安區-信義路二段198巷']
距東門站 507公尺
['仲介', '高先生', '16小時內更新', '昨日70人瀏覽']
======= #17- list =======
鉑斯✨東門&大安森林公園站✨電梯1+1房 優選好屋
['近捷運', '新上架', '近商圈', '有電梯', '隨時可遷入', '可開伙']
['整層住家', '2房2廳', '13.7坪', '5F/6F']
['大安區-信義路二段198巷']
距東門站 507公尺
['仲介', '值班人員', '16小時內更新', '昨日70人瀏覽']
======= #18- list =======
麟光站,雙陽台,採光佳,新裝潢,秒殺 優選好屋
['近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '3房1廳', '24.4坪', '3F/4F']
['大安區-富陽街158巷']
距麟光站 212公尺
['仲介', '江先生', '17小時內更新', '昨日44人瀏覽']
======= #19- list =======
信義安和❤️六張犁⭐️大空間❤️寵可談
['近捷運', '近商圈', '隨時可遷入', '可開伙', '可養寵物']
['整層住家', '3房1廳', '32坪', '3F/4F']
['@vv6688', '大安區-通化街']
距信義安和站 420公尺
['仲介', '吳小姐', '17小時內更新', '昨日73人瀏覽']
======= #20- list =======
科技大樓、大安森林公園✨新裝潢陽台大套房 優選好屋
['近捷運', '新上架', '拎包入住', '近商圈', '可開伙']
['整層住家', '2房1廳', '6坪', '3F/4F']
['大安區-瑞安街208巷14弄']
距科技大樓站 419公尺
['仲介', '田小姐', '17小時內更新', '昨日47人瀏覽']
======= #21- list =======
大安站電梯2+1房/大露台使用/天然瓦斯
['近捷運', '近商圈', '有電梯', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '20坪', '頂樓加蓋/15F']
['景德大廈', '大安區-復興南路一段']
距大安站 466公尺
['仲介', '郭先生', '17小時內更新', '昨日120人瀏覽']
======= #22- list =======
免仲介費,近世貿站信義安和站2房1廳1衛 優選好屋
['近捷運', '新上架', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '15坪', '3F/3F']
['大安區-光復南路692巷4弄']
距信義安和站 511公尺
['代理人', '劉先生', '19小時內更新', '昨日42人瀏覽']
======= #23- list =======
仲介勿擾,台大公寓3房1衛出租
['屋主直租', '近捷運', '可開伙', '有車位']
['整層住家', '3房0廳', '20坪', '3F/4F']
['大安區-羅斯福路三段333巷']
距公館站 293公尺
['屋主', '劉先生', '21小時內更新', '昨日55人瀏覽']
======= #24- list =======
信義安和、101捷運、商圈,靜巷2房
['近捷運', '拎包入住', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房2廳', '23坪', '4F/4F']
['大安區-臨江街2巷']
距信義安和站 587公尺
['仲介', '陳小姐', '2天前更新', '昨日47人瀏覽']
======= #25- list =======
泰順街靜巷2房鼎家
['新上架', '拎包入住', '隨時可遷入', '可開伙', '南北通透', '免管理費']
['整層住家', '2房1廳', '20坪', '5F/5F']
['泰順街26巷', '大安區-泰順街26巷29號']
距師大綜合大樓 133公尺
['仲介', '游先生', '3天前更新', '昨日72人瀏覽']
======= #26- list =======
好宅包租代管【可租補】公園旁(新裝修中)
['近捷運', '新上架', '可開伙']
['整層住家', '2房1廳', '14.6坪', '3F/4F']
['大安區-和平東路三段308巷1弄6號']
距麟光站 303公尺
['仲介', '林先生', '3天前更新', '昨日54人瀏覽']
======= #27- list =======
好宅社宅可租補/大兩房/公園旁(裝修中)
['近捷運', '新上架', '可開伙', '免服務費']
['整層住家', '2房1廳', '14.6坪', '3F/4F']
['大安區-和平東路三段30巷1弄6號']
距六張犁站 499公尺
['仲介', '林先生', '3天前更新', '昨日45人瀏覽']
======= #28- list =======
捷運古亭走路3分鐘/生活機能佳/頂加2房 優選好屋
['近捷運', '新上架', '近商圈', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '22.2坪', '5F/5F']
['大安區-羅斯福路二段81弄5號']
距古亭站 129公尺
['仲介', '陳先生', '4天前更新', '昨日56人瀏覽']
======= #29- list =======
頂加2房新翻修大客廳近六張犁站 優選好屋
['近捷運', '新上架', '拎包入住', '隨時可遷入', '可開伙']
['整層住家', '2房1廳', '21坪', '頂樓加蓋/4F']
['六張犁頂加大兩房', '大安區-和平東路三段228巷']
距六張犁站 225公尺
['仲介', '賴小姐', '6天前更新', '昨日55人瀏覽']
In [ ]: