python爬取安居客二手房網站數據

来源:http://www.cnblogs.com/gkf0103/archive/2017/10/18/7689600.html
-Advertisement-
Play Games

之前沒課的時候寫過安居客的爬蟲,但那也是小打小鬧,那這次呢, 還是小打小鬧 哈哈,現在開始正式進行爬蟲書寫 首先,需要分析一下要爬取的網站的結構: 作為一名河南的學生,那就看看鄭州的二手房信息吧! 在上面這個頁面中,我們可以看到一條條的房源信息,從中我們發現了什麼,發現了連鄭州的二手房都是這麼的貴, ...


之前沒課的時候寫過安居客的爬蟲,但那也是小打小鬧,那這次呢,

還是小打小鬧

哈哈,現在開始正式進行爬蟲書寫

首先,需要分析一下要爬取的網站的結構:

作為一名河南的學生,那就看看鄭州的二手房信息吧!

在上面這個頁面中,我們可以看到一條條的房源信息,從中我們發現了什麼,發現了連鄭州的二手房都是這麼的貴,作為即將畢業的學生狗惹不起啊惹不起

還是正文吧!!!

由上可以看到網頁一條條的房源信息,點擊進去後就會發現:

房源的詳細信息。

OK!那麼我們要幹嘛呢,就是把鄭州這個地區的二手房房源信息都能拿到手,可以保存到資料庫中,用來幹嘛呢,作為一個地理人,還是有點用處的,這次就不說了

好,正式開始,首先我採用python3.6 中的requests,BeautifulSoup模塊來進行爬取頁面,

首先由requests模塊進行請求:

# 網頁的請求頭
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}
# url鏈接
url = 'https://zhengzhou.anjuke.com/sale/'
response = requests.get(url, headers=header)
print(response.text)

執行後就會得到這個網站的html代碼了

通過分析可以得到每個房源都在class="list-item"的 li 標簽中,那麼我們就可以根據BeautifulSoup包進行提取

# 通過BeautifulSoup進行解析出每個房源詳細列表併進行列印
soup = BeautifulSoup(response.text, 'html.parser')
result_li = soup.find_all('li', {'class': 'list-item'})
for i in result_li:
    print(i)

 通過列印就能進一步減少了code量,好,繼續提取

# 通過BeautifulSoup進行解析出每個房源詳細列表併進行列印
soup = BeautifulSoup(response.text, 'html.parser')
result_li = soup.find_all('li', {'class': 'list-item'})
# 進行迴圈遍歷其中的房源詳細列表
for i in result_li:
    # 由於BeautifulSoup傳入的必須為字元串,所以進行轉換
    page_url = str(i)
    soup = BeautifulSoup(page_url, 'html.parser')
    # 由於通過class解析的為一個列表,所以只需要第一個參數
    result_href = soup.find_all('a', {'class': 'houseListTitle'})[0]
    print(result_href.attrs['href'])

這樣,我們就能看到一個個的url了,是不是很喜歡

好了,按正常的邏輯就要進入頁面開始分析詳細頁面了,但是爬取完後如何進行下一頁的爬取呢

所以,我們就需要先分析該頁面是否有下一頁

同樣的方法就可以發現下一頁同樣是如此的簡單,那麼咱們就可以還是按原來的配方原來的味道繼續

# 進行下一頁的爬取
result_next_page = soup.find_all('a', {'class': 'aNxt'})
if len(result_next_page) != 0:
    print(result_next_page[0].attrs['href'])
else:
    print('沒有下一頁了')

因為當存在下一頁的時候,網頁中就是一個a標簽,如果沒有的話,就會成為i標簽了,所以這樣的就行,因此,我們就能完善一下,將以上這些封裝為一個函數

import requests
from bs4 import BeautifulSoup

# 網頁的請求頭
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}

def get_page(url):
    response = requests.get(url, headers=header)

    # 通過BeautifulSoup進行解析出每個房源詳細列表併進行列印
    soup = BeautifulSoup(response.text, 'html.parser')
    result_li = soup.find_all('li', {'class': 'list-item'})

    # 進行下一頁的爬取
    result_next_page = soup.find_all('a', {'class': 'aNxt'})
    if len(result_next_page) != 0:
        # 函數進行遞歸
        get_page(result_next_page[0].attrs['href'])
    else:
        print('沒有下一頁了')

    # 進行迴圈遍歷其中的房源詳細列表
    for i in result_li:
        # 由於BeautifulSoup傳入的必須為字元串,所以進行轉換
        page_url = str(i)
        soup = BeautifulSoup(page_url, 'html.parser')
        # 由於通過class解析的為一個列表,所以只需要第一個參數
        result_href = soup.find_all('a', {'class': 'houseListTitle'})[0]
        # 先不做分析,等一會進行詳細頁面函數完成後進行調用
        print(result_href.attrs['href'])


if __name__ == '__main__':
    # url鏈接
    url = 'https://zhengzhou.anjuke.com/sale/'
    # 頁面爬取函數調用
    get_page(url)

好了,那麼咱們就開始詳細頁面的爬取了

哎,怎麼動不動就要斷電了,大學的坑啊,先把結果附上,閑了在補充,

import requests
from bs4 import BeautifulSoup

# 網頁的請求頭
header = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
}

def get_page(url):
    response = requests.get(url, headers=header)

    # 通過BeautifulSoup進行解析出每個房源詳細列表併進行列印
    soup_idex = BeautifulSoup(response.text, 'html.parser')
    result_li = soup_idex.find_all('li', {'class': 'list-item'})

    # 進行迴圈遍歷其中的房源詳細列表
    for i in result_li:
        # 由於BeautifulSoup傳入的必須為字元串,所以進行轉換
        page_url = str(i)
        soup = BeautifulSoup(page_url, 'html.parser')
        # 由於通過class解析的為一個列表,所以只需要第一個參數
        result_href = soup.find_all('a', {'class': 'houseListTitle'})[0]
        # 詳細頁面的函數調用
        get_page_detail(result_href.attrs['href'])


    # 進行下一頁的爬取
    result_next_page = soup_idex.find_all('a', {'class': 'aNxt'})
    if len(result_next_page) != 0:
        # 函數進行遞歸
        get_page(result_next_page[0].attrs['href'])
    else:
        print('沒有下一頁了')

# 進行字元串中空格,換行,tab鍵的替換及刪除字元串兩邊的空格刪除
def my_strip(s):
    return str(s).replace(" ", "").replace("\n", "").replace("\t", "").strip()
# 由於頻繁進行BeautifulSoup的使用,封裝一下,很雞肋
def my_Beautifulsoup(response):
    return BeautifulSoup(str(response), 'html.parser')



# 詳細頁面的爬取
def get_page_detail(url):
    response = requests.get(url, headers=header)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # 標題什麼的一大堆,哈哈
        result_title = soup.find_all('h3', {'class': 'long-title'})[0]
        result_price = soup.find_all('span', {'class': 'light info-tag'})[0]
        result_house_1 = soup.find_all('div', {'class': 'first-col detail-col'})
        result_house_2 = soup.find_all('div', {'class': 'second-col detail-col'})
        result_house_3 = soup.find_all('div', {'class': 'third-col detail-col'})
        soup_1 = my_Beautifulsoup(result_house_1)
        soup_2 = my_Beautifulsoup(result_house_2)
        soup_3 = my_Beautifulsoup(result_house_3)
        result_house_tar_1 = soup_1.find_all('dd')
        result_house_tar_2 = soup_2.find_all('dd')
        result_house_tar_3 = soup_3.find_all('dd')
        '''
        文博公寓,省實驗中學,首付只需70萬,大三房,誠心賣,價可談 270萬
        宇泰文博公寓 金水-花園路-文博東路4號 2010年 普通住宅
        3室2廳2衛 140平方米 南北 中層(共32層)
        精裝修 19285元/m² 81.00萬
        '''
        print(my_strip(result_title.text), my_strip(result_price.text))
        print(my_strip(result_house_tar_1[0].text),
              my_strip(my_Beautifulsoup(result_house_tar_1[1]).find_all('p')[0].text),
              my_strip(result_house_tar_1[2].text), my_strip(result_house_tar_1[3].text))
        print(my_strip(result_house_tar_2[0].text), my_strip(result_house_tar_2[1].text),
              my_strip(result_house_tar_2[2].text), my_strip(result_house_tar_2[3].text))
        print(my_strip(result_house_tar_3[0].text), my_strip(result_house_tar_3[1].text),
              my_strip(result_house_tar_3[2].text))

if __name__ == '__main__':
    # url鏈接
    url = 'https://zhengzhou.anjuke.com/sale/'
    # 頁面爬取函數調用
    get_page(url)

由於自己邊寫博客,邊寫的代碼,所以get_page函數中進行了一些改變,就是下一頁的遞歸調用需要放在函數後面,以及進行封裝了兩個函數沒有介紹,

而且數據存儲到mysql也沒有寫,所以後期會繼續跟進的,thank you!!!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉自:http://blog.csdn.net/jxufewbt/article/details/1769312 應用程式之間的數據交換(互相通訊)一直是困擾廣大程式員的難題,儘管已經出現了各式各樣的解決方案,但迄今為止沒有哪一種方案是完美無缺的。因此,只有學習並瞭解了它們的優缺點後,才能在特定的情 ...
  • string param = "<xml>" +"<ToUserName><![CDATA[toUser]]></ToUserName>" +"<FromUserName><![CDATA[fromUser]] ></FromUserName>" +"<CreateTime> 1348831860 ...
  • 很多C 的初學者都會有這麼一個疑問, .Net程式代碼是如何被機器載入執行的? 最簡單的解答是, C 會通過編譯器(CodeDom, Roslyn)編譯成IL代碼, 然後CLR(.Net Framework, .Net Core, Mono)會把這些IL代碼編譯成目標機器的機器代碼並執行. 相信大多 ...
  • 30分鐘?不需要,輕鬆讀懂IL http://www.cnblogs.com/brookshi/p/5225801.html IL指令詳細 http://www.cnblogs.com/zery/p/3368460.html 進階篇:以IL為劍,直指async/await http://www.cn ...
  • 前言:去年剛工作的時候,也是剛剛正式接觸.net,當時瞭解了EF以及三種開發模式,Database First、Model First 、Code First。公司用的開發模式是Database First,由於公司有一套成熟的框架,我只需要按部就班的開發即可,因此就沒有詳細學習過這些開發模式,總覺 ...
  • C#多線程 一、使用線程的理由 1、可以使用線程將代碼同其他代碼隔離,提高應用程式的可靠性。 2、可以使用線程來簡化編碼。 3、可以使用線程來實現併發執行。 二、基本知識 1、進程與線程:進程作為操作系統執行程式的基本單位,擁有應用程式的資源,進程包含線程,進程的資源被線程共用,線程不擁有資源。 2 ...
  • 自己上網查了好多種方法,最後還是選了這種不收費,還挺好用的方法 為了用戶有一個好的體驗我將word、excel、ppt轉Pdf,Pdf轉Swf寫在服務上,因為我當時做的時候Pdf轉Swf會執行pdf2swf.exe彈出黑框,對用戶體驗不好,還有就是ppt轉swf時會有一個彈出框,提示正在發佈,我沒搞 ...
  • 1. JMS基本概念 JMS(Java Message Service) 即Java消息服務。它提供標準的產生、發送、接收消息的介面簡化企業應用的開發。 它支持兩種消息通信模型:點到點(point-to-point)(P2P)模型和發佈/訂閱(Pub/Sub)模型。 P2P 模型規定了一個消息只能有 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...