python爬蟲實戰訓練

前言:哇,今天終于能訪問豆瓣了,前幾天爬太多次了,網頁都不讓我訪問了(要登錄)。

先來個小練習試試手吧!

爬取豆瓣第一頁(多頁同上篇文章)所有電影的排名、電影名稱、星級和評分,并用Excel存儲

網址是:豆瓣電影 Top 250? 大家先自己嘗試一下吧,還是簡單的,我就直接放代碼了

import requests
from bs4 import BeautifulSoup
import pandas as pd
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
r=requests.get("https://movie.douban.com/top250",headers=headers)
if r.status_code!=200:raise Exception("error")
soup=BeautifulSoup(r.text,"html.parser")
datas=[['排名','電影名稱','星級','評分']]
articles=soup.find_all('div',class_='item')
for article in articles:rank=article.find('em').get_text()title=article.find('span',class_='title').get_text()    #星級在class屬性里,get('class')返回的是列表,因為HTML的class屬性可以包含多個類名,因此BeautifulSoup將其存儲為一個列表star=article.find('div',class_='bd').find('span').get('class')[0].replace('rating','').replace('-t','') #string的replace方法,只保留數字score=article.find('span',class_='rating_num').get_text()datas.append([rank,title,star,score])
df=pd.DataFrame(datas)
df.to_excel('doubanTop25.xlsx')

easy吧,不過,值得提一下的是,網頁帶小數星級的表示不準確,4.5星級為45

可以觀察到star與score都在同一個div標簽下,所以還可以用這兩行代碼代替

data=article.find('div',class_='bd').find('div').find_all('span')
star,score=data[0]['class'][0],data[1].get_text()      #這樣star就是一整個字符

?爬取動態加載的網頁

我們來試著爬取杭州今年5個月的天氣數據(最近都是下雨,有點不喜歡哦,小小的毛毛細雨我覺得還好,但是大暴雨真是什么都不方便)

我們選擇不同的月份,可以發現網頁的url都沒有發生改變,說明這個網頁不是靜態網頁,它是后臺異步加載的動態網頁,我們表面不能知道它實際的鏈接的,那么我們需要抓包來進行分析。

右鍵,點擊“檢查”,點擊“網絡”

不要直接點擊“重新加載頁面”,那會加載大量頁面彈出來一大堆。我們再次查詢一個月份信息,發現后臺會發送一個請求“GetHistoty……”(或者點擊Fecth/XHR這是發送異步請求的意思,里面就是我們要抓的包)

?點擊“請求”進去看一下,可以發現“請求URL”與網頁上方的url不是同一個,這個就是異步加載的,請求方式為“GET”。復制URL“?”前面的部分(后面是參數部分,都在負載里)為url

復制“請求標頭”里的User-Agent,設置為headers用于反爬

這個網站的反爬做的有點好啊,還需要設置headers的Referer屬性 ,也在請求標頭里面,復制下來

?點擊“負載”,前兩項是杭州地區有關的編碼,都是不會變的,下面兩項就是查詢的year與month。復制里面的內容為請求的參數(設為字典類型)

點擊“響應”,看一下返回的結果是怎樣的

可以看到響應是json類型的數據(JSON (JavaScript Object Notation)數據由鍵值對組成,類似于字典,是一種輕量級的數據交換格式)?

點擊“預覽”,可以看到格式化的展示,將鼠標移到data的值可以看到html的數據(截圖沒法展示,自行看),可以發現里面有個<table>標簽?

“響應”里也能看到,不過“預覽”可視化更好?

表格數據用pandas可以很容易地解析?

import requests
import pandas as pd
from io import StringIO
url='https://tianqi.2345.com/Pc/GetHistory'
headers={"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 Edg/136.0.0.0','Referer':'https://tianqi.2345.com/wea_history/58457.htm'}
params={
"areaInfo[areaId]":58457,
"areaInfo[areaType]":2,
"date[year]":2025,
"date[month]":4
}
r=requests.get(url,headers=headers,params=params)     #請求頭和參數都為字典類型
if r.status_code!=200:raise Exception('error')
data=r.json()["data"]         #r.json()方法會將返回的JSON格式的響應解析為一個Python對象(一般為字典/列表),我們取出‘data’鍵的值(是字符串)
data=StringIO(data)           #使用StringIO對象來包裝HTML字符串,可以將字符串視為文件來讀取
df=pd.read_html(data)[0]      #pd.read_html()方法可以解析一個網頁中所有的表格,返回一個列表,里面的元素是DataFrame的數據結構
print(df)

這樣我們單個的網頁就爬取成功了,輸出如下

?我們現在來爬取1-5月的數據,根據前面的分析,只需要將參數改一下就可以了

import requests
import pandas as pd
from io import StringIO
url='https://tianqi.2345.com/Pc/GetHistory'
headers={"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 Edg/136.0.0.0','Referer':'https://tianqi.2345.com/wea_history/58457.htm'}
def craw_weather(month):params={"areaInfo[areaId]":58457,"areaInfo[areaType]":2,"date[year]":2025,"date[month]":month}r=requests.get(url,headers=headers,params=params)     if r.status_code!=200:raise Exception('error')data=r.json()["data"]data=StringIO(data)          df=pd.read_html(data)[0]      return df
lst=[]                #里面是每個月的df數據
for n in range(1,6):df=craw_weather(n)lst.append(df)
datas=pd.concat(lst)        #pd.concat()方法用于將多個Pandas對象(DataFrame或Series)沿著特定軸連接起來,非常靈活,可以用于行連接、列連接等多種操作
datas.to_excel('杭州1-5月天氣數據.xlsx',index=False) #Pandas在將df保存為Excel時,會將df的索引作為單獨的一列寫入文件,設置index=False可以不包含索引列

展示如下,昨天的數據都有了

批量爬取正本小說

整本小說稍微有點多了,我們就拿番茄小說的top1為例吧,爬取前10章的內容,先批量爬取每一章的鏈接和章節名稱,再根據鏈接爬取正文,最后將文章寫到文件中去

網頁地址為十日終焉完整版在線免費閱讀_十日終焉小說_番茄小說官網

直接檢索元素哈,可以發現所有章節都在特定的<div>標簽下

文章內容也在特定<div>標簽下

代碼如下

import requests
from bs4 import BeautifulSoup
def get_urls():root_url='https://fanqienovel.com/page/7143038691944959011'r=requests.get(root_url)if r.status_code!=200:raise Exception('error')soup=BeautifulSoup(r.text,"html.parser")datas=[]n=0for chapter in soup.find('div',class_='chapter').find_all('a'):if n==10:breakdatas.append(['https://fanqienovel.com'+chapter['href'],chapter.get_text()])n+=1return datas
def get_chapter(url):r=requests.get(url)if r.status_code!=200:raise Exception('error')soup=BeautifulSoup(r.text,"html.parser")content=soup.find('div',"muye-reader-content noselect").get_text()return content
for urls in get_urls():url,title=urlswith open(f'{title}.txt','w',encoding='utf-8') as ch:      #寫入文件ch.write(get_chapter(url))

展示如下

最后文章字符是亂碼,因為網頁源代碼就是亂碼的,查看<head>標簽里的charset,編碼就是‘utf-8’每錯,主包也嘗試了幾種方法還是不能正常顯示,可能瀏覽器可能會對顯示的內容進行一些渲染或轉換,我們講到后面再來嘗試

那爬這個有什么用呢??有些盜版網站不是小廣告很多嘛,那你就可以把文章爬下來看咯~

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

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

相關文章

Go語言實現生產者-消費者問題的多種方法

Go語言實現生產者-消費者問題的多種方法 生產者-消費者問題是并發編程中的經典問題&#xff0c;涉及多個生產者生成數據&#xff0c;多個消費者消費數據&#xff0c;二者通過緩沖區&#xff08;隊列&#xff09;進行協調&#xff0c;保證數據的正確傳遞和同步。本文將從簡單到…

【Opencv】canny邊緣檢測提取中心坐標

采用opencv 對圖像中的小球通過canny邊緣檢測的方式進行提取坐標 本文介紹了如何使用OpenCV對圖像中的小球進行Canny邊緣檢測&#xff0c;并通過Zernike矩進行亞像素邊緣檢測&#xff0c;最終擬合橢圓以獲取小球的精確坐標。首先&#xff0c;圖像被轉換為灰度圖并進行高斯平滑…

藍橋杯12屆國B 123

題目描述 小藍發現了一個有趣的數列&#xff0c;這個數列的前幾項如下&#xff1a; 1,1,2,1,2,3,1,2,3,4,? 小藍發現&#xff0c;這個數列前 1 項是整數 1&#xff0c;接下來 2 項是整數 1 至 2&#xff0c;接下來 3 項是整數 1 至 3&#xff0c;接下來 4 項是整數 1 至 4&…

鴻蒙OSUniApp 制作動態加載的瀑布流布局#三方框架 #Uniapp

使用 UniApp 制作動態加載的瀑布流布局 前言 最近在開發一個小程序項目時&#xff0c;遇到了需要實現瀑布流布局的需求。眾所周知&#xff0c;瀑布流布局在展示不規則尺寸內容&#xff08;如圖片、商品卡片等&#xff09;時非常美觀和實用。但在實際開發過程中&#xff0c;我…

ThinkStation圖形工作站進入BIOS方法

首先視頻線需要接在獨立顯卡上&#xff0c;重新開機&#xff0c;持續按F1&#xff0c;或者顯示器出來lenovo的logo的時候按F1&#xff0c;這樣就進到bios里了。聯*想*坑&#xff0c;戴爾貴。靠。

【源碼級開發】Qwen3接入MCP,企業級智能體開發實戰!

Qwen3接入MCP智能體開發實戰&#xff08;上&#xff09; 一、MCP技術與Qwen3原生MCP能力介紹 1.智能體開發核心技術—MCP 1.1 Function calling技術回顧 如何快速開發一款智能體應用&#xff0c;最關鍵的技術難點就在于如何讓大模型高效穩定的接入一些外部工具。而在MCP技術…

Linux下載與安裝

一、YUM 1.1 什么是YUM 在CentOS系統中&#xff0c;軟件管理方式通常有三種方式&#xff1a;rpm安裝、yum安裝以及編譯&#xff08;源碼&#xff09;安裝。 編譯安裝&#xff0c;從過程上來講比較麻煩&#xff0c;包需要用戶自行下載&#xff0c;下載的是源碼包&#xff0c;需…

PostgreSQL中的全頁寫

一、概述 在PGSQL數據庫中&#xff0c;默認的頁面大小為8KB&#xff0c;但是磁盤buffer的大小為4KB&#xff0c;扇區大小為512B。這就導致在操作系統的角度看數據庫的寫操作&#xff0c;其實并不是一種原子操作。如果操作系統發生了系統級別的故障&#xff0c;此時正好操作系統…

WEB安全--Java安全--shiro550反序列化漏洞

一、前言 什么是shiro&#xff1f; shiro是一個Apache的Java安全框架 它的作用是什么&#xff1f; Apache Shiro 是一個強大且靈活的 Java 安全框架&#xff0c;用于處理身份驗證、授權、密碼管理以及會話管理等功能 二、shiro550反序列化原理 1、用戶首次登錄并勾選記住密碼…

2024 睿抗機器人開發者大賽CAIP-編程技能賽-專科組(國賽)解題報告 | 珂學家

前言 題解 2024 睿抗機器人開發者大賽CAIP-編程技能賽-專科組&#xff08;國賽&#xff09;&#xff0c;陳越姐姐出題。 國賽比省賽&#xff0c;難度增強了不少&#xff0c;題目就剩下4個題了。 涉及堆棧&#xff0c;hash表&#xff0c;優先隊列等高階數據結構的使用&#x…

15 C 語言字符類型詳解:轉義字符、格式化輸出、字符類型本質、ASCII 碼編程實戰、最值宏匯總

1 字符類型概述 在 C 語言中&#xff0c;字符類型 char 用于表示單個字符&#xff0c;例如一個數字、一個字母或一個符號。 char 類型的字面量是用單引號括起來的單個字符&#xff0c;例如 A、5 或 #。 當需要表示多個字符組成的序列時&#xff0c;就涉及到了字符串。在 C 語言…

操作系統-鎖/內存/中斷/IO

文章目錄 鎖自旋鎖互斥鎖悲觀鎖和樂觀鎖 內存管理物理/虛擬內存頁表段表虛擬內存布局寫時復制copy on writebrk&#xff0c;mmap頁面置換算法 中斷中斷分類中斷流程 網絡I/OI/O模型服務器處理并發請求 鎖 自旋鎖 自旋鎖是一種基于忙等待&#xff08;Busy-Waiting&#xff09;…

割點與其例題

割點 定義&#xff1a; 若一個點在圖中被去掉后&#xff0c;圖的連通塊個數增加&#xff0c;那么這個點就被稱為“割點”。如下圖所示紅點。 定義說白了就是若去掉一個點&#xff0c;圖被“斷開”的點稱為割點。 樸素算法&#xff1a; 枚舉每個點 u。遍歷圖&#xff0c;如果…

圖卷積神經網絡(Graph Convolutional Network, GCN)

最近看論文看到了圖卷積神經網絡的內容&#xff0c;之前整理過圖神經網絡的內容&#xff0c;這里再補充一下&#xff0c;方便以后查閱。 圖卷積神經網絡&#xff08;Graph Convolutional Network, GCN&#xff09; 圖卷積神經網絡1. 什么是圖卷積神經網絡&#xff08;GCN&#…

安裝win11硬盤分區MBR還是GPT_裝win11系統分區及安裝教程

最近有網友問我,裝win11系統分區有什么要求裝win11系統硬盤分區用mbr還是GPT&#xff1f;我們知道現在的引導模式有uefi和legacy兩種引導模式&#xff0c;如果采用的是uefi引導模式&#xff0c;分區類型對應的就是gpt分區(guid)&#xff0c;如果引導模式采用的是legacy&#xf…

服務培訓QDA 的安裝調試方法,硬件模塊的講解和軟件控制臺使用及系統測試

#服務培訓##質譜儀##軟件控制##硬件模塊# 以下是關于Waters QDa單桿液質質譜儀的安裝調試、硬件模塊講解以及軟件控制臺使用培訓的相關內容&#xff1a; 安裝調試 場地準備&#xff1a;用戶需要提前準備好實驗室&#xff0c;確保實驗室環境符合儀器的要求&#xff0c;如溫度、…

在K8S集群中部署EFK日志收集

目錄 引言環境準備安裝自定義資源部署ElasticsearchMaster 節點與 Data 節點的區別生產優化建議安裝好以后測試ES是否正常部署Fluentd測試filebeat是否正常推送日志部署Kibana獲取賬號密碼&#xff0c;賬號是&#xff1a;elastic集群測試 引言 系統版本為 Centos7.9內核版本為…

polarctf-web-[rce1]

考點&#xff1a; (1)RCE(exec函數) (2)空格繞過 (3)執行函數(exec函數) (4)閉合(ping命令閉合) 題目來源&#xff1a;Polarctf-web-[rce1] 解題&#xff1a; 這段代碼實現了一個簡單的 Ping 測試工具&#xff0c;用戶可以通過表單提交一個 IP 地址&#xff0c;服務器會執…

【串流VR手勢】Pico 4 Ultra Enterprise 在 SteamVR 企業串流中無法識別手勢的問題排查與解決過程(Pico4UE串流手勢問題)

寫在前面的話 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;現項目落地需要部署&#xff0c;發現串流場景中&#xff0c;Pico4UE的企業串流無法正常識別手勢。&#xff08;一體機方式部署使用無問題&#xff09; 花了半小時解決&#xff0c;怕忘&#xff0c;…

ES(Elasticsearch)的應用與代碼示例

Elasticsearch應用與代碼示例技術文章大綱 一、引言 Elasticsearch在現代化應用中的核心作用典型應用場景分析&#xff08;日志分析/全文檢索/數據聚合&#xff09; 二、環境準備(前提條件) Elasticsearch 8.x集群部署要點IK中文分詞插件配置指南Ingest Attachment插件安裝…