Python爬蟲實戰:抓取百度15天天氣預報數據

🌐 編程基礎第一期《9-30》–使用python中的第三方模塊requests,和三個內置模塊(re、json、pprint),實現百度地圖的近15天天氣信息抓取

記得安裝

pip install requests

📑 項目介紹

網絡爬蟲是Python最受歡迎的應用場景之一,通過爬蟲技術,我們可以自動獲取互聯網上的各種數據資源。本文將帶您實現一個簡易爬蟲,抓取百度地圖的15天天氣預報數據,這是一個非常實用的入門級爬蟲項目。

🔍 爬蟲實現思路

爬蟲開發的核心步驟通常包括:網頁分析、構造請求、數據提取和數據處理。下面我們將按照這個流程來實現我們的天氣數據爬蟲。

1. 網頁結構分析

首先,我們需要分析目標網頁的結構,找出我們需要的數據在哪里。

步驟一:訪問目標頁面

在這里插入圖片描述

步驟二:查看頁面內容

在這里插入圖片描述

步驟三:打開開發者工具

進入瀏覽器控制臺,可以按F12,或者鼠標右鍵 —》檢查
在這里插入圖片描述

步驟四:定位數據元素

在這里插入圖片描述

這個案例是需要獲取天氣的【日期、溫度、天氣】,這三個字段

如果是直接搜索相應的數據的話,是搜不到的,而且有點亂【Ctrl+F:搜索】,所以就用最笨的方法查看數據了,博主也是很快定位到了數據【15_day_forecast】

在這里插入圖片描述

通過分析,我們發現天氣數據是通過JavaScript動態加載的,數據存儲在window.tplData變量中,具體是在15_day_forecast對象里。這意味著我們需要使用正則表達式從頁面源碼中提取這部分數據。

2. 獲取請求參數

為了模擬瀏覽器發送請求,我們需要獲取完整的請求參數,包括headers、cookies等。
在這里插入圖片描述

使用工具轉換請求格式

我們可以使用curlconverter.com工具,將瀏覽器復制的curl命令轉換為Python代碼:

在這里插入圖片描述

這個工具可以幫助我們快速生成請求所需的cookies、headers和params等參數,大大簡化了爬蟲開發過程。

3. 代碼實現

下面是完整的Python爬蟲代碼實現:

import requests
import re
import json
from pprint import pprintcookies = {'BAIDUID': 'D9390E952557E33F7CCC1A0109B7FA36:FG=1','PSTM': '1724329650','BIDUPSID': '32FE4B5E017DB09C400649766FC53D1B','H_WISE_SIDS_BFESS': '60360_60621_60630_60665_60677','BAIDUID_BFESS': 'D9390E952557E33F7CCC1A0109B7FA36:FG=1','ZFY': 'G4IF74JdDWkiPzA7wsun:A9:AdrfYQK3wASfOCR3zneJ0:C','__bid_n': '196e65bedde90245f15fbf','H_WISE_SIDS': '62325_62967_63195_63241_63247_63266','BDRCVFR[VXHUG3ZuJnT]': 'I67x6TjHwwYf0','H_PS_PSSID': '61672_62325_62967_63148_63195_63211_63241_63247_63255_63266_63325_63366_63389_63380_63186_63395_63392_63390_63403','delPer': '0','PSINO': '1','BDORZ': 'FFFB88E999055A3F8A630C64834BD6D0','BA_HECTOR': '242lah0h85202k00202lal8h0k0ga61k3b6p924','Hm_lvt_3535ee208b02ecdf4b2576fd444e8473': '1748343601','Hm_lpvt_3535ee208b02ecdf4b2576fd444e8473': '1748343601','HMACCOUNT': 'BF9680BBBCADEAE7',
}headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7','accept-language': 'zh-CN,zh;q=0.9','cache-control': 'no-cache','pragma': 'no-cache','priority': 'u=0, i','referer': 'https://www.baidu.com/link?url=ajB3uWQlmNXyVidQRV-1nepXkS-ZUJDTJP3_HkueruWRBti13-iGBZJC1qMnR8pVgkLXHUxRWG8iv9tlJZFuVD0UqvTN1KpXcH5Sjltgq93cArc4Ocpl5irtWM2zRTYi0nVOHUeSWeV3ArpliNJvgErF2AaOpuWN6Jzb_yPJd3_DDH4uDBSFAENIXFV98SgaWmQyD7eE7wSJtPaZK-Y_5a&wd=&eqid=e24cffc50001782a0000000368359b29','sec-ch-ua': '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"Windows"','sec-fetch-dest': 'document','sec-fetch-mode': 'navigate','sec-fetch-site': 'same-site','sec-fetch-user': '?1','upgrade-insecure-requests': '1','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36',# 'cookie': 'BAIDUID=D9390E952557E33F7CCC1A0109B7FA36:FG=1; PSTM=1724329650; BIDUPSID=32FE4B5E017DB09C400649766FC53D1B; H_WISE_SIDS_BFESS=60360_60621_60630_60665_60677; BAIDUID_BFESS=D9390E952557E33F7CCC1A0109B7FA36:FG=1; ZFY=G4IF74JdDWkiPzA7wsun:A9:AdrfYQK3wASfOCR3zneJ0:C; __bid_n=196e65bedde90245f15fbf; H_WISE_SIDS=62325_62967_63195_63241_63247_63266; BDRCVFR[VXHUG3ZuJnT]=I67x6TjHwwYf0; H_PS_PSSID=61672_62325_62967_63148_63195_63211_63241_63247_63255_63266_63325_63366_63389_63380_63186_63395_63392_63390_63403; delPer=0; PSINO=1; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; BA_HECTOR=242lah0h85202k00202lal8h0k0ga61k3b6p924; Hm_lvt_3535ee208b02ecdf4b2576fd444e8473=1748343601; Hm_lpvt_3535ee208b02ecdf4b2576fd444e8473=1748343601; HMACCOUNT=BF9680BBBCADEAE7',
}params = {'query': '廣東深圳天氣','srcid': '4982','forecast': 'long_day_forecast',
}response = requests.get('https://weathernew.pae.baidu.com/weathernew/pc', params=params, cookies=cookies,headers=headers)
# 獲取天氣數據
tplData = re.findall(r'window.tplData = (.*?);', response.text)[0]
# 這個數據是`str`類型,所以需要轉換成json數據類型,然后再獲取數據
tpl_15_day_forecast = json.loads(tplData)['15_day_forecast']['info']
# 定義一個空列表
recently_data = []
for tpl in tpl_15_day_forecast:date = tpl['date']temperature = tpl['temperature_night'] + ' ~ ' + tpl['temperature_day'] + '°C'weather = tpl['weather_night']recently_data.append({"date": date, "temperature": temperature, "weather": weather})# 整齊輸出
pprint(recently_data)

4. 運行效果

執行上述代碼后,我們可以得到格式化的15天天氣預報數據:

在這里插入圖片描述

🔎 代碼解析與知識點

這個簡單的爬蟲項目涵蓋了多個Python爬蟲開發的關鍵知識點,下面我們來詳細分析:

1. HTTP請求與網絡通信

  • requests模塊應用:使用Python最流行的HTTP客戶端庫發送GET請求
  • 請求參數構造:通過params、cookies和headers參數模擬瀏覽器行為
  • 防反爬策略:通過設置User-Agent、Referer等頭信息,避免被目標網站識別為爬蟲
# 發送HTTP GET請求示例
response = requests.get('https://weathernew.pae.baidu.com/weathernew/pc', params=params, cookies=cookies,headers=headers)

2. 正則表達式數據提取

  • re模塊應用:使用Python內置的正則表達式模塊提取特定模式的文本
  • 貪婪與非貪婪匹配:使用.*?進行非貪婪匹配,精確定位目標數據
  • 捕獲組:使用括號()創建捕獲組,提取匹配的內容
# 正則表達式提取示例
tplData = re.findall(r'window.tplData = (.*?);', response.text)[0]

3. JSON數據處理

  • json模塊應用:使用Python內置的JSON模塊解析字符串為Python對象
  • 數據序列化與反序列化:將字符串轉換為Python對象(反序列化)
  • 復雜數據結構訪問:通過鍵名訪問嵌套的JSON數據
# JSON解析示例
tpl_15_day_forecast = json.loads(tplData)['15_day_forecast']['info']

4. 數據結構與處理

  • 列表操作:創建空列表并使用append方法添加元素
  • 字典操作:創建包含多個鍵值對的字典對象
  • 循環遍歷:使用for循環遍歷列表中的每個元素
  • 字符串拼接:使用+運算符連接多個字符串
# 數據處理示例
recently_data = []
for tpl in tpl_15_day_forecast:date = tpl['date']temperature = tpl['temperature_night'] + ' ~ ' + tpl['temperature_day'] + '°C'weather = tpl['weather_night']recently_data.append({"date": date, "temperature": temperature, "weather": weather})

5. 格式化輸出

  • pprint模塊應用:使用Python的美化打印模塊,以更易讀的方式顯示復雜數據結構
  • 數據可視化:將提取的數據以結構化、易讀的方式展示
# 格式化輸出示例
pprint(recently_data)

📚 學習要點總結

  1. 網絡爬蟲基礎:HTTP請求、響應處理、模擬瀏覽器行為
  2. 數據提取技術:正則表達式、JSON解析
  3. Python模塊應用:requests、re、json、pprint
  4. 網頁分析方法:使用開發者工具定位數據元素
  5. 數據處理技巧:列表、字典操作,數據結構轉換
  6. 爬蟲倫理與合規:遵守網站robots.txt規則,合理控制請求頻率

通過這個項目,您可以掌握Python爬蟲開發的基本流程和技術要點,為進一步學習更復雜的爬蟲項目打下堅實基礎。

今日分享語錄

與其攀比他人,不如攀比昨天的自己

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907544.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML常見事件詳解:從入門到實戰應用

前言 在Web開發中,事件是用戶與網頁交互的核心機制。HTML事件讓我們能夠響應用戶的各種操作,如點擊、鼠標移動、鍵盤輸入等。掌握HTML事件是前端開發的基礎技能之一,本文將深入探討HTML中的常見事件類型及其實際應用。 HTML事件概覽總結 H…

模具制造業數字化轉型:精密模塑,以數字之力鑄就制造基石

模具被譽為 “工業之母”,是制造業的重要基石,其精度直接決定了工業產品的質量與性能。在工業制造向高精度、智能化發展的當下,《模具制造業數字化轉型:精密模塑,以數字之力鑄就制造基石》這一主題,精準點明…

深度解讀漏洞掃描:原理、類型與應用實踐

在網絡安全領域,漏洞就像隱藏在系統中的定時炸彈,隨時可能被攻擊者利用,導致數據泄露、服務癱瘓等嚴重后果。而漏洞掃描作為發現這些潛在威脅的 “偵察兵”,是保障網絡安全的重要防線。本文將全面介紹漏洞掃描的相關知識&#xff…

[HNCTF 2022 Week1]silly_zip

下載附件 解壓發現需要密碼 用010打開看看,發現是偽加密 改成00點擊保存 解壓后得到圖片 感覺圖片看著怪怪的,修改一下高度看看有沒有其他線索 把47改成78 最后得到flag

Facebook 的隱私保護措施是否足夠?技術觀點

在數字時代,隱私保護成為了公眾關注的焦點,尤其是對于擁有數十億用戶的社交媒體巨頭 Facebook 來說,其隱私保護措施的有效性更是備受矚目。本文將從技術角度探討 Facebook 的隱私保護措施是否足夠。 數據收集與使用 Facebook 收集用戶數據的…

cocosCreator 1.8 升級到 2.4

現在負責的一個運營中的商業項目,使用的是 cocosCreator1.8,之前沒有做好設計,所以東西都是直接加載在內存中的,到了現在性能問題逐漸暴露出來,討論之后想進行引擎升級,升級到cocosCreator 2.4。 官方的升…

ubuntu 制作 ssl 證書

安裝 openssl sudo apt install openssl 生成 SSL 證書 # 生成私鑰 (Private Key) openssl genrsa -out private.key 2048 在當前目錄生成 private.key # 生成證書簽名請求 (CSR - Certificate Signing Request) openssl req -new -key private.key -out certificate.csr -…

【Java基礎-環境搭建-創建項目】IntelliJ IDEA創建Java項目的詳細步驟

在Java開發的世界里,選擇一個強大的集成開發環境(IDE)是邁向高效編程的第一步。而IntelliJ IDEA無疑是Java開發者中最受歡迎的選擇之一。它以其強大的功能、智能的代碼輔助和簡潔的用戶界面,幫助無數開發者快速構建和部署Java項目…

WEB3——什么是ABI

怎么獲得ABI? 在編譯完合約后,可以在左邊下面點擊復制ABI ABI(Application Binary Interface,應用二進制接口)是用來讓前端或服務端 JavaScript 代碼與智能合約進行交互的橋梁,它描述了合約的函數、事件和…

移動安全Android——客戶端數據安全

本地文件權限配置 測試流程 (1)手機運行待測APP應用,adb執行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY (2)adb shell 進入設備,以Root權限進入/data/data/package包名目錄下 c…

拉普拉斯噪聲

1. 概念 拉普拉斯噪聲是一種連續概率分布生成的隨機噪聲,其核心特點是符合拉普拉斯分布。這種噪聲被特意添加到數據(尤其是查詢結果或統計量)中,以實現差分隱私這一嚴格的隱私保護框架。 核心目的: 在保護數據集中的個…

django項目開啟debug頁面操作有數據操作記錄

在項目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…

【科研繪圖系列】R語言繪制森林圖(forest plot)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息介紹 本文介紹使用R語言繪制森林圖(forest plot)的方法。首先加載必要的R包(grid、forestploter、openxlsx、stringr),導入并預處…

MySQL-8.0.42 主從延遲常見原因及解決方法

目錄 1 查看從庫延時方法 2 如何分析主從延遲 3 主從延遲的常見原因及解決方法 1 查看從庫延時方法 mysql> show slave status \G *************************** 1. row *************************** Slave_IO_Running: Yes #兩個yes說明主從復制正常 …

Kotlin 活動事件通訊跳轉深度講解

在 Android 開發的浩瀚海洋中,活動(Activity)間的事件通訊與跳轉猶如構建復雜應用程序的橋梁與紐帶,而 Kotlin 語言的加入,更是為這一過程注入了簡潔、優雅與高效的活力。本文將深入剖析 Kotlin 開發中安卓活動事件通訊跳轉的方方面面,從基礎概念到高級技巧,從代碼示例到…

[FreeRTOS- 野火] - - - 臨界段

一、介紹 臨界段最常出現在對一些全局變量進行操作的場景。 1.1 臨界段的定義 臨界段是指在多任務系統中,一段需要獨占訪問共享資源的代碼。在這段代碼執行期間,必須確保沒有任何其他任務或中斷可以訪問或修改相同的共享資源。 臨界段的主要目的是防…

Vad-R1:通過從感知到認知的思維鏈進行視頻異常推理

文章目錄 速覽摘要1 引言2 相關工作視頻異常檢測與數據集視頻多模態大語言模型具備推理能力的多模態大語言模型 3 方法:Vad-R13.1 從感知到認知的思維鏈(Perception-to-Cognition Chain-of-Thought)3.2 數據集:Vad-Reasoning3.3 A…

CSS Day07

1.搭建項目目錄 2.網頁頭部SEO三大標簽 3.Favicon圖標與版心 (1)Favicon圖標 (2)版心 4.快捷導航 5.頭部-布局 6.頭部-logo 7.頭部-導航 8.頭部-搜索 9頭部-購物車 10.底部-布局 11.底部-服務區域 12.底部-幫助中心 13.底部-版權…

Flutter圖片Image、本地圖片、程程圖片、圓片剪切、圓形圖片

目錄 圖片組件的介紹 1.Image.network加載圖片 1.1 Image scale圖片縮小一倍 1.2 Image alignment使用 1.3 Image fit 屬性的取值及說明 1.3.1 Contain 默認效果 1.3.2 Fill 圖片會縮放至完全填滿目標區域(寬高) 1.3.3 Fill 圖片會縮放至完全填滿目…

Prometheus學習之pushgateway和altermanager組件

[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# pwd /usr/local/alertmanager-0.28.1.linux-amd64[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# cat alertmanager.yml # 通用配置 global:resolve_timeout: 5msmtp_from: 914XXXXX…