【python】Python爬蟲入門教程:使用requests庫

Python爬蟲入門教程:使用requests庫

爬蟲是數據獲取的重要手段,下面我將通過一個完整的示例,教你如何使用Python的requests庫編寫一個簡單的爬蟲。我們將以爬取豆瓣電影Top250為例。

【python】網絡爬蟲教程 - 教你用python爬取豆瓣電影 Top250

1. 環境準備

首先需要安裝必要的庫:

pip install requests beautifulsoup4

2. 項目結構規劃

一個簡單的爬蟲項目通常包含以下模塊:

  • 發送HTTP請求獲取頁面內容
  • 解析HTML提取數據
  • 數據存儲
  • 控制爬蟲行為(如翻頁、延時)

3. 編寫爬蟲代碼

下面是一個完整的爬蟲示例:

import requests
from bs4 import BeautifulSoup
import time
import random
import csvclass DoubanSpider:def __init__(self):# 設置請求頭,模擬瀏覽器訪問self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}# 存儲結果的列表self.movies = []def get_page(self, page_num):"""獲取指定頁數的HTML內容"""url = f'https://movie.douban.com/top250?start={page_num*25}'try:response = requests.get(url, headers=self.headers, timeout=10)# 檢查響應狀態碼if response.status_code == 200:return response.textelse:print(f"請求失敗,狀態碼: {response.status_code}")return Noneexcept requests.exceptions.RequestException as e:print(f"請求異常: {e}")return Nonedef parse_page(self, html_content):"""解析HTML內容,提取電影信息"""if not html_content:returnsoup = BeautifulSoup(html_content, 'html.parser')# 查找所有電影項movie_items = soup.select('div.item')for item in movie_items:try:# 提取電影標題title = item.select_one('span.title').text# 提取評分rating = item.select_one('span.rating_num').text# 提取簡介quote = item.select_one('span.inq')quote = quote.text if quote else '無簡介'# 提取導演和主演info = item.select_one('div.bd p').text.strip()# 添加到結果列表self.movies.append({'title': title,'rating': rating,'quote': quote,'info': info})except Exception as e:print(f"解析錯誤: {e}")def save_to_csv(self, filename='douban_movies.csv'):"""將結果保存為CSV文件"""if not self.movies:print("沒有數據可保存")returnwith open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:fieldnames = ['title', 'rating', 'quote', 'info']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)# 寫入表頭writer.writeheader()# 寫入數據writer.writerows(self.movies)print(f"數據已保存到 {filename}")def run(self, pages=10):"""運行爬蟲,爬取指定頁數的數據"""for page in range(pages):print(f"正在爬取第 {page+1} 頁...")html_content = self.get_page(page)self.parse_page(html_content)# 設置隨機延時,避免頻繁請求delay = random.uniform(1, 3)print(f"等待 {delay:.2f} 秒后繼續...")time.sleep(delay)# 保存數據self.save_to_csv()print(f"共爬取 {len(self.movies)} 條電影數據")# 運行爬蟲
if __name__ == "__main__":spider = DoubanSpider()# 爬取前10頁數據,共250條spider.run(pages=10)

4. 代碼解析

這個爬蟲程序包含以下關鍵部分:

  1. 請求處理

    • get_page 方法發送HTTP請求獲取網頁內容
    • 設置了請求頭和超時時間,提高穩定性
    • 處理了可能的請求異常
  2. 數據解析

    • parse_page 方法使用BeautifulSoup解析HTML
    • 通過CSS選擇器定位電影信息元素
    • 提取標題、評分、簡介等關鍵信息
  3. 數據存儲

    • save_to_csv 方法將結果保存為CSV文件
    • 使用UTF-8-sig編碼確保中文正常顯示
  4. 爬蟲控制

    • run 方法控制爬取流程
    • 設置隨機延時避免被封IP
    • 支持指定爬取頁數

5. 進階優化建議

  1. 添加異常處理:可以增強錯誤處理機制,例如失敗重試功能

  2. 使用代理IP:爬取大量數據時,使用代理IP避免被封

  3. 數據清洗:提取數據后進行清洗和驗證

  4. 存儲優化:可以使用數據庫存儲數據,如SQLite、MySQL等

  5. 異步請求:對于大規模爬取,可以考慮使用aiohttp提高效率

這個爬蟲示例展示了基本的爬蟲架構和實現方法。實際應用中,你可以根據目標網站的結構調整解析邏輯,或者添加更多功能如圖片下載、數據可視化等。

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

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

相關文章

OpenCV圖像縮放:resize

圖像縮放是圖像處理中的基礎操作之一。無論是圖像預處理、數據增強還是圖像金字塔構建,cv::resize 都是我們最常用的函數之一。但你是否注意到,在 OpenCV 中同時還存在一個名為 cv::Mat::resize 的方法?這兩個函數雖然名字類似,但…

汽車、航空航天、適用工業虛擬裝配解決方案

一、現狀在制造業數字化轉型浪潮中,傳統裝配過程仍面臨諸多挑戰:物理樣機試錯成本高、裝配周期冗長、工藝優化依賴經驗、跨部門協作效率低下……如何打破“試錯-返工”的惡性循環?目前總裝工藝通過DELMIA、NX、Creo等工程軟件進行工藝裝配驗證…

頁面跳轉和前端路由的區別

傳統方式&#xff1a;通過改變瀏覽器地址欄的 URL 來實現window.location.href /new-page<a href"/new-page">跳轉到新頁面</a>會導致整個頁面重新加載會觸發瀏覽器向服務器發送新的請求頁面狀態不會保留&#xff0c;所有資源重新加載可以避免新上線的內…

C/C++核心知識點詳解

C/C核心知識點詳解 1. 變量的聲明與定義&#xff1a;內存分配的本質區別 核心概念 在C/C中&#xff0c;變量的聲明和定義是兩個完全不同的概念&#xff1a; 聲明&#xff08;Declaration&#xff09;&#xff1a;告訴編譯器變量的名稱和類型&#xff0c;但不分配內存空間定義&a…

物聯網發展:從概念到應用的演變歷程

物聯網的發展歷程是一部技術革新與社會需求共同驅動的進化史&#xff0c;其演變可劃分為概念萌芽、技術積累、應用拓展和智能融合四個階段&#xff0c;每個階段均以關鍵技術突破或社會需求變革為標志&#xff0c;最終形成萬物互聯的智能生態。以下是具體演變歷程&#xff1a;一…

一個人開發一個App(數據庫)

后端要保存數據&#xff0c;我還是選擇了關系型數據庫Mysql, 因為其它的不熟悉。 flutter端這次我選擇的是ObjectBox&#xff0c;以前都是直接用的sqlite3&#xff0c;看對比ObjectBox效率比sqlite3高許多&#xff0c;這次前端為了用戶體驗&#xff0c;我需要緩存數據&#xff…

天銘科技×藍卓 | “1+2+N”打造AI驅動的汽車零部件行業智能工廠

7月24日&#xff0c;杭州天銘科技股份有限公司&#xff08;簡稱 “天銘科技”&#xff09;與藍卓數字科技有限公司&#xff08;簡稱 “藍卓”&#xff09;簽訂全面戰略合作協議。天銘科技董事長張松、副總經理艾鴻冰&#xff0c;藍卓副董事長譚彰等領導出席簽約儀式&#xff0c…

技術復盤報告:Vue表格中多行文本字段數據保存丟失問題

1. 問題背景 在一個基于 Vue 2.0 和 ElementUI 的復雜數據維護頁面中&#xff0c;用戶報告了一個偶發但嚴重的問題&#xff1a;在表格中編輯一個多行文本&#xff08;textarea&#xff09;字段時&#xff0c;輸入的內容有時會在點擊“保存”后丟失。 具體表現&#xff1a; 前端…

#C語言——學習攻略:深挖指針路線(四)--字符指針變量,數組指針變量,二維數組傳參的本質,函數指針變量,函數指針數組

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言學習》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"暴力解法是上帝給的&#xff0c;優化解法是魔鬼教的。" 目錄 1. 字符指針變量 1.1 使…

SpringBoot收尾+myBatis plus

一、數據傳遞返回值為:字符串package com.apesource.springboot_web_04.controller;import com.apesource.springboot_web_04.pojo.Emp; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;/*** 返回值為:字符…

基于 Spring Boot 實現動態路由加載:從數據庫到前端菜單的完整方案

在后臺管理系統中&#xff0c;不同用戶角色往往擁有不同的操作權限&#xff0c;對應的菜單展示也需動態調整。動態路由加載正是解決這一問題的核心方案 —— 根據登錄用戶的權限&#xff0c;從數據庫查詢其可訪問的菜單&#xff0c;封裝成前端所需的路由結構并返回。本文將詳細…

VitePress學習-自定義主題

VitePress-自定義主題 代碼倉庫 基礎了解 初始化項目的時候選擇 custom theme 運行后會發現頁面挺丑的。 如果想要用默認主題怎么辦呢&#xff0c;修改Layout。 使用默認主題的Layout <script setup lang"ts"> import { useData } from vitepress; impo…

【GEO從入門到精通】生成式引擎與其他 AI 技術的關系

2.1.3 生成式引擎與其他 AI 技術的關系生成式引擎作為人工智能領域的創新力量&#xff0c;與其他 AI 技術緊密相連&#xff0c;相互促進&#xff0c;共同推動 生成式引擎優化&#xff08;GEO&#xff09; 的發展。這些技術使生成式引擎能夠為消費者提供更加個性化和精準的內容。…

JAVAEE--4.多線程案例

設計模式1.單例模式1.1餓漢模式1.2懶漢模式(單線程版)1.3懶漢模式(多線程版本)1.4懶漢模式(多線程版本進階版)2.阻塞隊列3.定時器4.線程池1.單例模式設計模式是"軟性約束",不是強制的,可以遵守也可以不遵守,按照設計模式寫代碼使代碼不會太差框架是"硬性約束&qu…

量化感知訓練(QAT)流程

WHAT&#xff1a;量化感知訓練&#xff08;Quantization-Aware Training, QAT&#xff09; 是一種在模型訓練階段引入量化誤差的技術。它的核心思想是&#xff1a;通過在前向傳播時插入“偽量化節點”引入量化誤差&#xff0c;將權重和激活模擬為低精度&#xff08;如 int8&…

docker 用于將鏡像打包為 tar 文件

docker save 是 Docker 中用于將鏡像打包為 tar 文件的命令&#xff0c;常用于鏡像的備份、遷移或離線傳輸。以下是其核心用法和注意事項&#xff1a;一、基本語法bashdocker save [選項] IMAGE [IMAGE...] > 文件名.tar # 或 docker save -o 文件名.tar IMAGE [IMAGE...]IM…

設計模式(六)創建型:單例模式詳解

設計模式&#xff08;六&#xff09;創建型&#xff1a;單例模式詳解單例模式&#xff08;Singleton Pattern&#xff09;是 GoF 23 種設計模式中最簡單卻最常被誤用的創建型模式。其核心價值在于確保一個類在整個應用程序生命周期中僅存在一個實例&#xff0c;并提供一個全局訪…

PostgreSQL AND OR 操作符詳解

PostgreSQL AND & OR 操作符詳解 在數據庫查詢中,AND 和 OR 是兩種常見的邏輯操作符,用于組合多個查詢條件。PostgreSQL 作為一款功能強大的開源關系型數據庫管理系統,同樣支持這些操作符。本文將詳細介紹 PostgreSQL 中的 AND 和 OR 操作符,并探討它們在查詢中的應用…

RabbiteMQ安裝-ubuntu

Ubuntu 1.安裝Erlang RabbitMQ需要Erlang語言的支持&#xff0c;在安裝RabbitMQ之前需要安裝Erlang #更新軟件包 sudo apt-get update#安裝erlang sudo apt-get install erlang查看erlang版本 roothcss-ecs-027f:/# erl Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [sm…

Linux驅動20 --- FFMPEG視頻API

目錄 一、FFMPEG 視頻 API 的使用 1.1 介紹 1.2 整體編程過程 獲取核心上下文指針 打開輸入流文件 獲取輸入流 獲取編碼器 初始化解碼器 申請輸出流指針 獲取顯示數據空間大小 申請輸出顯示空間 綁定輸出流和輸出顯示空間 申請格式轉換上下文 申請輸入流指針 讀取一幀數據 發…