Scrapy框架簡單介紹及Scrapy項目編寫詳細步驟

引言

Scrapy是一個用Python編寫的開源、功能強大的網絡爬蟲框架,專為網頁抓取和數據提取設計。它允許開發者高效地從網站上抓取所需的數據,并通過一系列可擴展和可配置的組件來處理這些數據。Scrapy框架的核心組成部分包括:

  • Scrapy Engine(引擎): 負責控制數據流,協調各個組件之間的交互,實現爬蟲的邏輯。
  • Scheduler(調度器): 負責管理待抓取的請求隊列,決定下一個要抓取的請求是什么。
  • Downloader(下載器): 負責處理調度器傳來的請求,獲取網頁內容,并將其傳遞給Spider處理。
  • Spiders(爬蟲): 自定義類,定義了如何解析下載回來的網頁內容,并提取結構化數據(Items)。每個Spider負責處理一個或一組特定的網站或頁面結構。
  • Item Pipeline(項目管道): 數據處理的流水線,負責處理Spider提取的數據,進行清洗、驗證、去重、存儲等操作。每個項目經過一系列的Pipeline組件,直至處理完成。
  • Middlewares(中間件): 分為請求/響應中間件和Spider中間件,位于引擎和其他組件之間,可以全局地處理請求、響應或改變數據流向,提供了高度的靈活性和可擴展性。

Scrapy的特點和優勢包括:

易于使用和部署: 提供了命令行工具簡化了項目的創建、運行和管理。

靈活性和可擴展性: 設計為高度模塊化,可以很容易地自定義或替換組件以滿足特定需求。

高性能: 基于Twisted異步網絡庫,支持并發下載,能夠高效處理大量請求。

廣泛的應用場景: 適用于數據挖掘、價格監控、市場研究、搜索引擎優化等領域。

Scrapy通過定義良好的API和組件模型,使得開發者能夠快速構建復雜的爬蟲,同時保持代碼的整潔和可維護性。

本篇文章參考b站視頻

【1小時學會爬取豆瓣熱門電影,快速上手Scrapy爬蟲框架,python爬蟲快速入門!】 https://www.bilibili.com/video/BV18a411777v/?share_source=copy_web&vd_source=70bc998418623a0cee8f4ac32d696e49

一、在命令窗口中使用命令創建一個scrapy項目

首先我們進行安裝有scrapy框架的虛擬環境下的scripts目錄下,用scrapy startproject項目名稱,來創建一個scrapy爬蟲項目。

在希望scrapy項目放置位置的文件夾下運行如下命令:

scrapy startproject douban_spider

在pycharm編輯器打開改項目,生成的項目結構如下:

二、在items.py文件中定義字段

這些字段用來臨時存儲我們要去抓取的結構化數據,方便后面保數據到其他地方,比如數據庫或者本地文本之類。

Item文件編寫

  • Item是保存爬取到的數據的容器;其使用方法和Python字典類似,并且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。
  • 以豆瓣電影Top250 為例,我們需要抓取每一步電影的名字,電影的評分以及電影的評分人數。
  • 豆瓣電影 Top 250 (douban.com)
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DoubanSpiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()title = scrapy.Field()  # 電影名字star = scrapy.Field()   # 評分critical = scrapy.Field()   # 評分人數pass

三、在piplines.py中存儲自己的數據,我們在此存儲為csv格式

  • 我們準備把分析提取出來的結構化數據存儲為csv格式。首先在piplines文件中創建一個類,在該類的構造函數中創建一個文件對象,然后在process_item函數中做數據存儲處理(編碼成utf-8格式),最后關閉文件。

piplines.py文件代碼如下:

class DoubanSpiderPipeline:def __init__(self):self.file = open("d:/douban.csv", "wb")def process_item(self, item, spider):str = item['title'].encode('utf-8') + b',' + item['star'].encode('utf-8') + b',' + item['critical'].encode('utf-8') + b'\n'self.file.write(str)return itemdef close_spider(self, spider):self.file.close()

四、爬蟲邏輯文件編寫

把每個文件都配置好之后,就可以自己寫一個邏輯處理文件,在spiders目錄下創建一個douban.py文件,在改文件中我們寫業務邏輯處理,主要是爬取,解析,把解析的內容結構化等等。

# encoding:utf-8
import scrapy
from scrapy.spiders import CrawlSpider
from scrapy.http import Request
from scrapy.selector import Selector
from douban_spider.items import DoubanSpiderItem# 定義一個類 繼承
class Douban(CrawlSpider):name = "douban"  # 爬蟲項目名allowed_domains = ['douban.com']  # 爬取的域名start_urls = ['https://movie.douban.com/top250']  # 爬取的頁面網址# 請求是分布式的def start_requests(self):for url in self.start_urls:yield Request(url=url, callback=self.parse)def parse(self, response):item = DoubanSpiderItem()selector = Selector(response)Movies = selector.xpath('//div[@class="info"]')for eachMovie in Movies:title = eachMovie.xpath('div[@class="hd"]/a/span/text()').extract()[0]star = eachMovie.xpath('div[@class="bd"]/div/span[@class="rating_num"]/text()').extract()[0]critical = eachMovie.xpath('div[@class="bd"]/div/span/text()').extract()[1]item['title'] = titleitem['star'] = staritem['critical'] = criticalyield itemnextLink = selector.xpath('//span[@class="next"]/a/@href').get()# 確保nextLink有效且不是最后一頁if nextLink and 'javascript:void(0)' not in nextLink:# 注意處理相對路徑if not nextLink.startswith(('http:', 'https:')):nextLink = response.urljoin(nextLink)yield Request(url=nextLink, callback=self.parse)

運行程序

得到的csv文件如下:

*Settings文件編寫

  • 該文件不是必須要編寫,我們完全可以把配置放在其他相應的文件中,比如headers放在頁面邏輯抓取文件中,文件或數據庫配置放在Pipeline文件中等等。

*如果需要轉存到數據庫方法

import csv
import mysql.connector
from mysql.connector import Error# MySQL數據庫連接參數
db_config = {'host': '127.0.0.1',  # 數據庫主機地址'user': 'root',  # 數據庫用戶名'password': '021211',  # 數據庫密碼'database': 'douban'  # 數據庫名稱
}# CSV文件路徑
csv_file_path = 'd:/douban.csv'try:# 連接到MySQL數據庫connection = mysql.connector.connect(**db_config)if connection.is_connected():db_info = connection.get_server_info()print(f"Successfully connected to MySQL Server version {db_info}")cursor = connection.cursor()columns = ["title", "star", "critical"]  # 替換為你的列名# 讀取CSV文件并插入數據with open(csv_file_path, mode='r', encoding='utf-8') as file:csv_reader = csv.reader(file)next(csv_reader) for row in csv_reader:placeholders = ', '.join(['%s'] * len(row))query = f"INSERT INTO douban_spider ({', '.join(columns)}) VALUES ({placeholders})"cursor.execute(query, tuple(row))# 提交事務connection.commit()print(f"{cursor.rowcount} rows were inserted successfully.")except Error as e:print(f"Error while connecting to MySQL: {e}")
finally:# 關閉連接if connection.is_connected():cursor.close()connection.close()print("MySQL connection is closed.")

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

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

相關文章

aws glue配置讀取本地kafka數據源

創建連接時填寫本地私有ip地址,選擇網絡配置 配置任務選擇kafka作為數據源 但是執行任務時日志顯示連接失敗 文檔提到只能用加密通信 如果您希望與 Kafka 數據源建立安全連接,請選擇 Require SSL connection (需要 SSL 連接),并在 Kafka priv…

python批發模塊的調試之旅:從新手到專家的蛻變

新書上架~👇全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目錄 一、調試技巧的重要性 二、批發模塊調試的實戰演練 1. 設置斷點 2. 逐行執行代碼 3. 觀察…

Android+SQLiteOpenHelper實現登錄記住密碼小案例

實現自動登錄,在數據庫中存 注冊的賬號信息 package com.example.databases_text;import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import andro…

運維行業中的堆疊交換機監控與配置管理策略

隨著信息技術的迅猛發展,企業網絡架構日趨復雜,交換機作為網絡基礎設施的核心設備,其穩定性和安全性對于企業業務的運行至關重要。在運維實踐中,堆疊交換機(Stacked Switches)因其高可靠性、靈活擴展性等特…

SM2258G專用SSD開卡工具(三星閃存),后附工具下載

工具下載: https://download.csdn.net/download/weixin_43097956/89354302

「貪心算法」檸檬水找零

力扣原題鏈接,點擊跳轉。 假設你的手里沒有錢。你要賣檸檬水,每杯5塊錢。每個顧客有可能會給你5塊錢、10塊錢或20塊錢,你要拿手中的錢找零。如何判斷你能否成功找零呢? 如果一上來就有顧客花10塊錢或20塊錢,你手中沒…

python中特殊的靜態方法__new__

一、關于new方法 在Python中,__new__方法是一個特殊的靜態方法,用于實例化對象。通常不需要直接調用__new__方法,Python會自動調用它來分配內存空間并返回一個新對象(或者更具體地說,是對象的引用)。然而&…

視頻怎么轉換成二維碼圖片?視頻做成二維碼播放的方法

怎樣在電腦上制作可以播放視頻的二維碼呢?很多日常生活中,很多的場景或者物品都會有自己的二維碼,其他人通過掃碼就可以獲取對應的內容。有很多場景下會把視頻轉換二維碼,通過掃碼在手機上查看視頻內容,比如產品介紹、…

水表電表遠程抄表是什么?

1.簡述:水表電表遠程抄表技術性 隨著時代的發展,傳統式手動抄表方法早已被更為高效、智能化的遠程抄表系統所替代。水表電表遠程抄表,說白了,就是利用互聯網技術完成對水表和電表讀數的遠程數據采集管理方法,大大提升…

效果炸裂!使用 GPT-4o 快速實現LLM OS

▼最近直播超級多,預約保你有收獲 —1— 什么是 LLM OS? 關于 LLM OS 的最初構想源自karpathy 在2023年11月11日發布的一條Twitter 動態,這是 LLM OS 概念的最早出處,如下圖所示: LLM OS 主要有以下5個部分組成&#x…

基于SA模擬退火優化算法的TSP問題求解matlab仿真,并對比ACO蟻群優化算法

目錄 1.程序功能描述 2.測試軟件版本以及運行結果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模擬退火優化算法的TSP問題求解matlab仿真,并對比ACO蟻群優化算法,對比兩個算法的仿真時間,收斂曲線,以及路徑規劃的結果&#xff0…

中間件的概念及示例

什么是中間件? 中間件是一種軟件技術,它在分布式系統中起著至關重要的作用。以下是關于中間件的詳細解釋: 定義與位置: 中間件是位于應用系統和系統軟件之間的一類軟件。它使用系統軟件提供的基礎服務(功能&#xff0…

Flask+Vue+MySQL天水麻辣燙管理系統設計與實現(附源碼 配置 文檔)

背景: 同學找到我期望做一個天水麻辣燙的網頁,想復用以前做過的課設,結合他的實際需求,讓我們來看看這個系統吧~ 項目功能與使用技術概述: 里面嵌入了6個子系統,其中餐飲系統可以進行餐館信息添加、修改…

TypeScript體操類型練習

歷史小劇場 這個世界上,有兩種人最痛苦,第一種是身居高位者,第二種是身居底層者,第一種人很少,第二種人很多。第一種人叫崇禎,第二種人叫百姓。 而最幸福的,就是中間那撥人,主要工作…

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各種社會和貿易網絡的不斷出現,網絡影響力分析引起了研究者的極大興趣。基于不同的影響力傳播模型,人們提出了許多網絡影響力最大化的新模型和方法。作為傳統影響力最大化問題的延伸和擴展,影響力封鎖最大化問題已成為研究熱點&…

借助 CloudFlare 增強站點內容保護防采集

今天在一位站長的幫助下實測了 CloudFlare 增強站點內容保護實現防采集的功能,效果那是杠杠的,如果您的站點原創內容比較多的話,明月強烈建議試試 CloudFlare 這個內容保護,無論是 WordPress 、Typecho 都有非常好的效果,并且幾乎沒有任何誤傷,搜索引擎爬蟲蜘蛛更是不會影…

【圖論】單源最短路

前言 今天&#xff0c;我們來講最短路&#xff0c;首先看只有一個起點&#xff08;單源&#xff09;的情況。 為了書寫方便&#xff0c;我們約定以下內容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 鄰接表(ve…

集中抄表電表是什么?

1.集中抄表電表&#xff1a;簡述 集中抄表電表&#xff0c;又稱為遠程抄表系統&#xff0c;是一種現代化電力計量技術&#xff0c;為提升電力行業的經營效率和客戶服務質量。它通過自動化的形式&#xff0c;取代了傳統人工抄水表&#xff0c;完成了數據信息實時、精確、高效率…

進制轉換【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;現在要回爐重造 十進制->二進制 基本思想&#xff1a; 開始寫的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

Spring -- DI

文章目錄 一、什么是DI二、注入的三種方式2.1 屬性注入 Autowired使用方法Autowired存在的問題以及解決方法Autowired問題的解決方法 2.2 構造方法注入2.3 setter方法注入2.4 三種注入方式優缺點分析 一、什么是DI 概念&#xff1a;DI(依賴注入)就是當我們把依賴對象取出來(創…