爬蟲入門—靜態(tài)網(wǎng)頁(鏈家北京二手房)

1 引言

  • 最近寫了一些簡單的爬蟲,感覺到爬蟲這個(gè)東西實(shí)踐大于理論,需要實(shí)際操作才能體會(huì)更深仲翎,寫下這篇短文壶辜,希望給有需要的同學(xué)在爬蟲入門的時(shí)候一點(diǎn)小小的幫助悯舟。
  • 本文適合具備一定Python基礎(chǔ)的同學(xué),需要用到包括列表砸民,循環(huán)抵怎,函數(shù)奋救,文件讀寫等基礎(chǔ)知識,沒有接觸過Python的同學(xué)突擊了解一下即可反惕,動(dòng)手為先尝艘。

2 環(huán)境

  • Python3.6
  • IDE: Pycharm
  • 操作系統(tǒng):Windows

3 基礎(chǔ)知識

本節(jié)介紹Requests庫和BeautifulSoup庫的基本用法,已經(jīng)有了解的同學(xué)可以直接跳過承璃。


我們的目標(biāo)網(wǎng)頁如下圖所示利耍,我們想要把紅色方框里的數(shù)據(jù)爬下來,單獨(dú)整理成一行盔粹,這樣就形成了每個(gè)樓盤一條記錄隘梨,就方便后續(xù)作分析了。


1.png

其實(shí)舷嗡,這些數(shù)據(jù)都在網(wǎng)頁源代碼里躺著轴猎,我們第一步需要做的得到源代碼,然后再去源代碼里找數(shù)據(jù)进萄,想要得到網(wǎng)頁源代碼捻脖,本文介紹使用python的requests庫:

  • Requests
    在Chrome瀏覽器中,適用Ctrl+u快捷鍵可以看到網(wǎng)頁的源代碼中鼠,我們的目標(biāo)數(shù)據(jù)就在那一大串源代碼里可婶。日常瀏覽的時(shí)候,我們通過瀏覽器獲得網(wǎng)頁的源代碼援雇,經(jīng)瀏覽器解析和渲染后矛渴,就成了我們看到的模樣。
    現(xiàn)在我們需要在Python里同樣獲得源代碼惫搏,本文使用第三方庫Requests具温,通過以下命令,就可以獲得我們需要的源代碼了筐赔。
# requests.get可以返回一個(gè)python response對象
response = requests.get("https://bj.lianjia.com/ershoufang/")

# response對象是二進(jìn)制的铣猩,我們需要通過.text方法將它轉(zhuǎn)化成文本,轉(zhuǎn)化之后就是Ctrl+u看到的樣子
response_text = response.text

獲得源代碼以后茴丰,我們要進(jìn)一步在源代碼里找到我們需要的數(shù)據(jù)达皿,網(wǎng)頁的源代碼是有一定的結(jié)構(gòu)的,類似

<li class="sellListContent"> 目標(biāo)數(shù)據(jù) </li>

這樣的結(jié)構(gòu)是一個(gè)個(gè)標(biāo)簽较沪,但是我們在上一步獲得的源代碼是一個(gè)超長的字符串鳞绕,我們需要將字符串重新轉(zhuǎn)化為有結(jié)構(gòu)的模式,這里使用第三方庫BeautifulSoup尸曼。

  • BeautifulSoup

BeautifulSoup庫可以將源代碼轉(zhuǎn)化為BeautifulSoup對象们何,我們需要在BeautifulSoup對象中找到我們的目標(biāo)標(biāo)簽,然后提取目標(biāo)數(shù)據(jù)控轿,代碼如下

from bs4 import BeautifulSoup # python3已將BeautifulSoup庫集成到bs4中冤竹,需要先import

# 將上述文本轉(zhuǎn)化為BeautifulSoup對象拂封,"html.parser"是一種解剖器
bsobj = BeautifulSoup(response_text,"html.parser")
   
# 在BeautifulSoup對象里找到目標(biāo)內(nèi)容所在的標(biāo)簽
ul = bsobj.find("ul",{"class":"sellListContent"}) # 這里.find返回找到的第一個(gè)標(biāo)簽

# 由于標(biāo)簽是有層級結(jié)構(gòu)的,所以我們可以繼續(xù)在標(biāo)簽里找鹦蠕,這里.find_all則返回找到的所有符合要求的標(biāo)簽組成的列表
all_li = ul.find_all("li",{"class":"clear"})

基礎(chǔ)知識介紹到這里冒签,下面開始實(shí)戰(zhàn)。

4 開始爬蟲

本節(jié)定義了幾個(gè)函數(shù)钟病,實(shí)現(xiàn)了從標(biāo)簽里提取數(shù)據(jù)萧恕,并拼接成我們需要的格式,然后寫入文本文件肠阱。下面分別介紹:

  • 函數(shù)getdata()票唆,從網(wǎng)頁爬取數(shù)據(jù)
    我們期望實(shí)現(xiàn)以下效果:給函數(shù)一個(gè)網(wǎng)址,函數(shù)就返回我們需要的數(shù)據(jù)屹徘,代碼如下
import requests
from bs4 import BeautifulSoup

def getdata(url):
    
    # 模擬一個(gè)請求頭走趋,目的是假裝我們是通過瀏覽器訪問的網(wǎng)頁
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"}
    
    # 通過requests.get可以獲得網(wǎng)址為url的網(wǎng)頁的返回的一些數(shù)據(jù)
    response = requests.get(url,headers=header)
    
    # 由于返回的是二進(jìn)制,需要通過response.text轉(zhuǎn)化為文本
    response_text = response.text
   
    # 將上述文本轉(zhuǎn)化為BeautifulSoup對象噪伊,"html.parser"是一種解剖器
    bsobj = BeautifulSoup(response_text,"html.parser")
   
    # 在BeautifulSoup對象里找到目標(biāo)內(nèi)容所在的標(biāo)簽
    ul = bsobj.find("ul",{"class":"sellListContent"})
    
    # 再在標(biāo)簽里找到下級標(biāo)簽簿煌,返回的是所有標(biāo)簽組成的一個(gè)列表(也可以在上一步直接找,不過有可能找到一些包含我們不需要的數(shù)據(jù)的標(biāo)簽)
    all_li = ul.find_all("li",{"class":"clear"})
    
    housdata = []
    # 由于每一個(gè)"li"都是一條記錄鉴吹,我們要循環(huán)將"li"里面的內(nèi)容取出來
    for li in all_li:
        record = ""
        
        # 由于每一個(gè)"li"里面又有很多"div"姨伟,"div"里的內(nèi)容才是我們真正想要的,因此繼續(xù)找
        all_div = li.find("div",{"class":"info clear"}).find_all("div")
        
        # 將每個(gè)"div"里的內(nèi)容通過.get_text()方法取出來
        for j in all_div:
            j_text = j.get_text().strip().strip("\n") # 兩個(gè)strip先后去除取出來文本兩端的空格和換行符
            # 然后將每個(gè)"div"里取出來的文本拼接起來
            record = record + "@" + j_text
        
        # 每個(gè)"li"都會(huì)返回一個(gè)record豆励,即一條記錄
        # 將每個(gè)record都添加到housdata這個(gè)列表里
        housdata.append(record)
    
    # 最后返回整個(gè)housdata列表
    return housdata

??定義好這個(gè)函數(shù)之后授滓,我們每輸入一個(gè)url,函數(shù)就可以返回包括該網(wǎng)頁中所有記錄的列表了。
??當(dāng)然,一個(gè)頁面并不能滿足要求耿芹,我們的目標(biāo)是所有網(wǎng)頁怠硼,因此只需要得到所有網(wǎng)頁,然后一個(gè)一個(gè)喂給getdata函數(shù)就可以了私沮,下面定義一個(gè)構(gòu)造網(wǎng)頁的函數(shù)始赎,我們給該函數(shù)一個(gè)數(shù)字(代表第幾頁),該函數(shù)就返回該頁的網(wǎng)址仔燕。

  • 函數(shù)geturl()造垛,獲取頁面url
def geturl(num):
    if num ==1 :
        url = r"https://bj.lianjia.com/ershoufang/"
    else:
        url = "https://bj.lianjia.com/ershoufang/pg" + str(num) +"/"
    return url
  • 最后的工作
    最后就是使用我們定義好的函數(shù),然后一頁一頁爬取晰搀,并寫入txt文本文件了五辽。
lianjia = open(r"C:\Users\lianjia.txt","a",encoding="utf-8")
for i in range(1, 940):
    url = geturl(i)
    housdata = getdata(url)
    for line in housdata:
        lianjia.write(line + "\n")
    time.sleep(1)
    print(i)
lianjia.close()

轉(zhuǎn)載請注明出處,有任何問題外恕,請聯(lián)系我的郵箱:oythonhill@163.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杆逗,一起剝皮案震驚了整個(gè)濱河市乡翅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罪郊,老刑警劉巖蠕蚜,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異悔橄,居然都是意外死亡靶累,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門癣疟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挣柬,“玉大人,你說我怎么就攤上這事争舞×莘蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵竞川,是天一觀的道長店溢。 經(jīng)常有香客問我,道長委乌,這世上最難降的妖魔是什么床牧? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮遭贸,結(jié)果婚禮上戈咳,老公的妹妹穿的比我還像新娘。我一直安慰自己壕吹,他們只是感情好著蛙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耳贬,像睡著了一般踏堡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咒劲,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天顷蟆,我揣著相機(jī)與錄音,去河邊找鬼腐魂。 笑死帐偎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛔屹。 我是一名探鬼主播削樊,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兔毒!你這毒婦竟也來了嫉父?” 一聲冷哼從身側(cè)響起沛硅,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绕辖,沒想到半個(gè)月后摇肌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仪际,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年围小,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片树碱。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肯适,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出成榜,到底是詐尸還是另有隱情框舔,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布赎婚,位于F島的核電站刘绣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挣输。R本人自食惡果不足惜纬凤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撩嚼。 院中可真熱鬧停士,春花似錦、人聲如沸完丽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逻族。三九已至猖任,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓷耙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工刁赖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留搁痛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓宇弛,卻偏偏與公主長得像鸡典,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子枪芒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355