Python多線程爬取鏈家房源,保存表格,實現數據可視化分析!

来源:https://www.cnblogs.com/hahaa/archive/2023/05/16/17406006.html
-Advertisement-
Play Games

使用Python來爬取二手房源數據,並保存表格,實現數據分析! 軟體環境 Python 3.8 Pycharm 代碼展示 模塊 # 數據請求模塊 --> 第三方模塊, 需要安裝 pip install requests import requests # 解析數據模塊 --> 第三方模塊, 需要安裝 ...


使用Python來爬取二手房源數據,並保存表格,實現數據分析!

軟體環境

Python 3.8

Pycharm

代碼展示

模塊

# 數據請求模塊 --> 第三方模塊, 需要安裝 pip install requests
import requests
# 解析數據模塊 --> 第三方模塊, 需要安裝 pip install parsel
import parsel
# csv模塊
import csv

 

創建文件

f = open('data.csv', mode='w', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '標題',
    '小區',
    '區域',
    '售價',
    '單價',
    '戶型',
    '面積',
    '朝向',
    '裝修',
    '樓層',
    '年份',
    '建築類型',
    '詳情頁',
])
csv_writer.writeheader()

 

發送請求, 模擬瀏覽器 對於 url地址 發送請求

模擬瀏覽器

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}

 

請求網址/網站

url = 'https://cs.lianjia.com/ershoufang/'

# 完整源碼,視頻講解直接+這個扣裙:279199867 免費領取

 

發送請求

response = requests.get(url=url, headers=headers)
# <Response [200]> 響應對象 200 狀態碼 表示請求成功
print(response)

 

獲取數據, 獲取網頁源代碼 <獲取伺服器返迴響應數據>

解析數據, 提取我們想要的數據內容

解析方法:

  • re: 對於字元串數據直接進行解析提取

  • css: 根據標簽屬性提取數據內容

  • xpath: 根據標簽節點提取數據內容

使用css: 根據標簽屬性提取數據內容

把獲取到html字元串數據, 轉成可解析對象

selector = parsel.Selector(response.text)

 

獲取所有房源信息所在li標簽

lis = selector.css('.sellListContent li.clear')

 

for迴圈遍歷

for li in lis:
    """
提取具體房源信息: 標題 / 價格 / 位置 / 戶型... .title a --> 表示定位class類名為title下麵a標簽 """ title = li.css('.title a::text').get() # 標題 info_list = li.css('.positionInfo a::text').getall() area = info_list[0] # 小區名字 area_1 = info_list[1] # 地區 totalPrice = li.css('.totalPrice span::text').get() # 售價 unitPrice = li.css('.unitPrice span::text').get().replace('元/平', '').replace(',', '') # 單價 houseInfo = li.css('.houseInfo::text').get().split(' | ') # 信息 houseType = houseInfo[0] # 戶型 houseArea = houseInfo[1].replace('平米', '') # 面積 houseFace = houseInfo[2] # 朝向 fitment = houseInfo[3] # 裝修 fool = houseInfo[4] # 樓層 if len(houseInfo) == 7 and '' in houseInfo[5]: year = houseInfo[5].replace('年建', '') else: year = '' house = houseInfo[-1] # 建築類型 href = li.css('.title a::attr(href)').get() # 詳情頁 dit = { '標題': title, '小區': area, '區域': area_1, '售價': totalPrice, '單價': unitPrice, '戶型': houseType, '面積': houseArea, '朝向': houseFace, '裝修': fitment, '樓層': fool, '年份': year, '建築類型': house, '詳情頁': href, } csv_writer.writerow(dit) print(dit) # print(title, area, area_1, totalPrice, unitPrice, houseType, houseArea, houseFace, fitment, fool, year, house, href)

 

多線程

導入模塊

import requests
import parsel
import re
import csv
# 線程池模塊
import concurrent.futures
import time

 

發送請求函數

def get_response(html_url):

:param html_url:
:return:
"""
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
response = requests.get(url=html_url, headers=headers)
return response

 

獲取數據函數

def get_content(html_url):
    """
    :param html_url:
    :return:
    """
    response = get_response(html_url)
    html_data = get_response(link).text
    selector = parsel.Selector(response.text)
    select = parsel.Selector(html_data)
    lis = selector.css('.sellListContent li')
    content_list = []
    for li in lis:

        title = li.css('.title a::text').get()  # 標題
        area = '-'.join(li.css('.positionInfo a::text').getall())  # 小區
        Price = li.css('.totalPrice span::text').get()  # 總價
        Price_1 = li.css('.unitPrice span::text').get().replace('元/平', '')  # 單價
        houseInfo = li.css('.houseInfo::text').get()  # 信息
        HouseType = houseInfo.split(' | ')[0]  # 戶型
        HouseArea = houseInfo.split(' | ')[1].replace('平米', '')  # 面積
        direction = houseInfo.split(' | ')[2].replace(' ', '')  # 朝向
        renovation = houseInfo.split(' | ')[3]  # 裝修
        floor_info = houseInfo.split(' | ')[4]
        floor = floor_info[:3]  # 樓層
        floor_num = re.findall('(\d+)層', floor_info)[0]  # 層數
        BuildingType = houseInfo.split(' | ')[-1]
        string = select.css('.comments div:nth-child(7) .comment_text::text').get()
        href = li.css('.title a::attr(href)').get()  # 詳情頁
        if len(houseInfo.split(' | ')) == 6:
            date = 'None'
        else:
            date = houseInfo.split(' | ')[5].replace('年建', '')  # 日期
        print(string)
        dit = {
            '標題': title,
            '內容': string,
            '小區': area,
            '總價': Price,
            '單價': Price_1,
            '戶型': HouseType,
            '面積': HouseArea,
            '朝向': direction,
            '裝修': renovation,
            '樓層': floor,
            '層數': floor_num,
            '建築日期': date,
            '建築類型': BuildingType,
            '詳情頁': href,
        }
        content_list.append(dit)
    return content_list

 

主函數

def main(page):
    """
    :param page:
    :return:
    """
    print(f'===============正在採集第{page}頁的數據內容===============')
    url = f'https:///ershoufang/yuelu/p{page}/'
    content_list = get_content(html_url=url)
    for content in content_list:
        csv_writer.writerow(content)


if __name__ == '__main__':
    time_1 = time.time()
    link = 'http://******/article/149'
    # 創建文件
    f = open('data多線程.csv', mode='a', encoding='utf-8', newline='')
    csv_writer = csv.DictWriter(f, fieldnames=[
        '標題',
        '內容',
        '小區',
        '總價',
        '單價',
        '戶型',
        '面積',
        '朝向',
        '裝修',
        '樓層',
        '層數',
        '建築日期',
        '建築類型',
        '詳情頁',
    ])
    csv_writer.writeheader()

    # 線程池執行器 max_workers 最大線程數
    exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)
    for page in range(1, 11):
        exe.submit(main, page)
    exe.shutdown()
    time_2 = time.time()
    use_time = int(time_2 - time_1)
    # 總計耗時: 9
    print('總計耗時:', use_time)

 


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

-Advertisement-
Play Games
更多相關文章
  • 偏函數是一種在函數式編程中常見的編程技巧。在 JavaScript 中,偏函數指的是一種創建新函數的方法,通過預設一個或多個參數,從而實現對原始函數的封裝和定製。偏函數的主要作用是降低函數調用時的參數複雜度,使函數更具有可重用性。 在 JavaScript 中,我們可以通過閉包來實現偏函數。以下是一 ...
  • 最近幾天大家應該發現天涯社區網站打不開了。 天涯社區創辦於1999年,此時的中國,互聯網產業方興未艾,那時天涯社區相當火爆。 2007年時,天涯社區的註冊用戶就突破了2000萬,號稱是全球最大的中文互聯網社區。到了2013年中國網民規模才6億多,也就是說當年平均7個中國網民就有1個是天涯用戶。 當時 ...
  • 一、web應用模式 Django框架就是一種web框架,專門用來寫web項目,之前學的,寫的BBS項目,圖書管理系統,用的都是前後端混合開發 -後端人員,寫後端,也要寫【模板語法】 》xx.html的python代碼 -全棧開發-->前後端混合時代,比較多 從今天開始,學的是前後端分離 -後端人員, ...
  • 我是 javapub,一名 Markdown 程式員從👨‍💻,八股文種子選手。 面試官:小伙子,說實話,泛型這個機制一開始我也是一頭霧水,搞不太明白它到底要解決什麼問題。你能不能不那麼書呆子,給我普普通通地講一講泛型? 候選人: 好嘞,我們來聊聊泛型。首先,泛型要解決的最主要的問題就是類型不安全 ...
  • 1、系統清理工具 去年騰訊開源了一個系統清理工具:騰訊檸檬清理,該軟體可以系統性解決 macOS 設備空間問題。 重點聚焦清理功能,對上百款軟體提供定製化的清理方案,提供專業的清理建議,幫助用戶輕鬆完成一鍵式的清理。 主要功能包括:深度掃描清理、大文件清理、重覆文件清理、相似照片清理、瀏覽器隱私清理 ...
  • Java 緩衝流和flush()的作用 哪些流是緩衝流,哪些流帶有緩衝區? 根據Java官方文檔關於Buffered Streams的介紹,緩衝流有四種: BufferedInputStream:包裝位元組輸入流 BufferedOutputStream:包裝位元組輸出流 BufferedReader: ...
  • 獲取ip信息 public static String getRealIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == ...
  • pandas 作為一種常用的數據分析工具,提供了廣泛的數據修改方法。 既可以針對行或者列的數據進行修改,也可以對具體單個元素進行修改,還可以基於條件選擇要修改的行或者列的數據。 1. 增加數據 1.1 增加行數據 pandas的DataFrame增加一行或者多行數據之前是使用append方法。 im ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...