Python爬取上海鏈家網(wǎng)房源數(shù)據(jù)并存入MongoDB數(shù)據(jù)庫(kù)

以下是我爬取上海鏈家網(wǎng)寶山區(qū)房源信息的學(xué)習(xí)總結(jié)

準(zhǔn)備工作

用到的Python模塊:

  • requests
  • bs4
  • pymongo
  • datetime
  • time
  • random

分析網(wǎng)頁(yè)

登陸http://sh.lianjia.com/ershoufang/baoshan 用Chrome打開(kāi)開(kāi)發(fā)者工具

image

每條房源信息都在li元素中,我們?cè)賮?lái)看一下翻頁(yè)鏈接
image

試著點(diǎn)擊下一頁(yè),我們?yōu)g覽器上的鏈接是有規(guī)律可循的

http://sh.lianjia.com/ershoufang/baoshan/d1
http://sh.lianjia.com/ershoufang/baoshan/d2
http://sh.lianjia.com/ershoufang/baoshan/d3
.........
http://sh.lianjia.com/ershoufang/baoshan/100

現(xiàn)在我們?cè)囍廊∏?0頁(yè)的鏈接

import requests
for i in range(1, 11):
    r = requests.get('http://sh.lianjia.com/ershoufang/baoshan/d' + str(i))
    print(r.url)
  

爬取結(jié)果

http://sh.lianjia.com/ershoufang/baoshan/d1
http://sh.lianjia.com/ershoufang/baoshan/d2
http://sh.lianjia.com/ershoufang/baoshan/d3
http://sh.lianjia.com/ershoufang/baoshan/d4
http://sh.lianjia.com/ershoufang/baoshan/d5
http://sh.lianjia.com/ershoufang/baoshan/d6
http://sh.lianjia.com/ershoufang/baoshan/d7
http://sh.lianjia.com/ershoufang/baoshan/d8
http://sh.lianjia.com/ershoufang/baoshan/d9
http://sh.lianjia.com/ershoufang/baoshan/d10

解析網(wǎng)頁(yè)

image

要抓取的信息如下:

  • 標(biāo)題:room_title = room.find('div', attrs={'class': 'prop-title'})
  • 房屋信息:room_info = room.find('span', attrs={'class': 'info-col row1-text'})
  • 位置:room_location = room.find('span', attrs={'class': 'info-col row2-text'})
  • 附加信息:extra_info = room.find('div', attrs={'class': 'property-tag-container'})
  • 總價(jià):room_price = room.find('span', attrs={'class': 'total-price strong-num'})
  • 單價(jià):room_unit_price = room.find('span', attrs={'class': 'info-col price-item minor'})
soup = BeautifulSoup(r.text, 'html.parser')
rooms = soup.find('ul', attrs={'class': 'js_fang_list'})
for room in rooms.find_all('li'):
    room_title = room.find('div', attrs={'class': 'prop-title'}).get_text()
    room_info = room.find('span', attrs={'class': 'info-col row1-text'}).get_text()
    room_location = room.find('span', attrs={'class': 'info-col row2-text'}).find('a').get_text()
    room_price = room.find('span', attrs={'class': 'total-price strong-num'}).get_text()
    room_unit_price = room.find('span', attrs={'class': 'info-col price-item minor'}).get_text()
    extra_info = room.find('div', attrs={'class': 'property-tag-container'}).get_text()


    print(room_title, room_info, room_location, room_price, room_unit_price, extra_info)

下面是網(wǎng)頁(yè)解析下來(lái)的一個(gè)房源信息


廚衛(wèi)全明,臥室?guī)ш?yáng)臺(tái)固歪,地鐵房砌们,高區(qū)采光好
 
                            1室1廳 | 44.73平
                            
                                | 高區(qū)/6層
                            
                            
                                | 朝南
                            
                         葑潤(rùn)華庭 255 
                            單價(jià)57008元/平
                         
距離7號(hào)線祁華路站698米
滿二
有鑰匙

存入MongoDB數(shù)據(jù)庫(kù)

MongoDB數(shù)據(jù)結(jié)構(gòu)是以鍵值對(duì){key:value}形式組成,有點(diǎn)類似于JSON


image
# 鏈接數(shù)據(jù)庫(kù)
client = MongoClient('localhost', 27017)
# 建立數(shù)據(jù)庫(kù)
db = client.tests
# 建立集合
homes = db.homes

rooms_list = []

# 先將爬下來(lái)的數(shù)據(jù)賦值為字典
rooms_info ={
                'title': room_title,
                'info': room_info,
                'location': room_location,
                'price': room_price,
                'unit_proce': room_unit_price,
                'message': extra_info,
                'time': datetime.datetime.now()
            }

rooms_list.append(rooms_info)
# 存入數(shù)據(jù)庫(kù)
result = homes.insert_many(rooms_list)
print(result)

運(yùn)行代碼,我們可以看到數(shù)據(jù)存入了MongoDB

<pymongo.results.InsertManyResult object at 0x00000260C536AB8>
<pymongo.results.InsertManyResult object at 0x00000260C536AAC>
<pymongo.results.InsertManyResult object at 0x00000260C536AA0>
<pymongo.results.InsertManyResult object at 0x00000260C536AB4>
<pymongo.results.InsertManyResult object at 0x00000260C536AB0>
<pymongo.results.InsertManyResult object at 0x00000260C536A28>
<pymongo.results.InsertManyResult object at 0x00000260C536AC8>
<pymongo.results.InsertManyResult object at 0x00000260C536A08>
<pymongo.results.InsertManyResult object at 0x00000260C536A88>
<pymongo.results.InsertManyResult object at 0x00000260C536A88>
<pymongo.results.InsertManyResult object at 0x00000260C536888>
<pymongo.results.InsertManyResult object at 0x00000260C536A08>
<pymongo.results.InsertManyResult object at 0x00000260C536AC8>
<pymongo.results.InsertManyResult object at 0x00000260C536A48>
<pymongo.results.InsertManyResult object at 0x00000260C536A88>

可以下載一個(gè)MongoDB可視化工具,我用的是Robo3T,數(shù)據(jù)就這樣存入了

image

總共有100頁(yè)的數(shù)據(jù)雹舀,用time.sleep()來(lái)控制速度防止被封掉,但爬取效率實(shí)在很低粗俱,這兩天準(zhǔn)備學(xué)習(xí)pandas

完整代碼在GitHub
簡(jiǎn)書(shū)
歡迎訪問(wèn)博客Treehl的博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末说榆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌签财,老刑警劉巖串慰,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異唱蒸,居然都是意外死亡邦鲫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)神汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庆捺,“玉大人,你說(shuō)我怎么就攤上這事屁魏√弦裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵氓拼,是天一觀的道長(zhǎng)你画。 經(jīng)常有香客問(wèn)我,道長(zhǎng)桃漾,這世上最難降的妖魔是什么撬即? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮呈队,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唱歧。我一直安慰自己宪摧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布颅崩。 她就那樣靜靜地躺著几于,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沿后。 梳的紋絲不亂的頭發(fā)上沿彭,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音尖滚,去河邊找鬼喉刘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛漆弄,可吹牛的內(nèi)容都是我干的睦裳。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撼唾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼廉邑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蛛蒙,失蹤者是張志新(化名)和其女友劉穎糙箍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體牵祟,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡深夯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了课舍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塌西。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖筝尾,靈堂內(nèi)的尸體忽然破棺而出捡需,到底是詐尸還是另有隱情,我是刑警寧澤筹淫,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布站辉,位于F島的核電站,受9級(jí)特大地震影響损姜,放射性物質(zhì)發(fā)生泄漏饰剥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一摧阅、第九天 我趴在偏房一處隱蔽的房頂上張望汰蓉。 院中可真熱鬧,春花似錦棒卷、人聲如沸顾孽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)若厚。三九已至,卻和暖如春蜒什,著一層夾襖步出監(jiān)牢的瞬間测秸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工灾常, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎冯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓岗憋,卻偏偏與公主長(zhǎng)得像肃晚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仔戈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容