主頁 >  其他 > 開啟Scrapy爬蟲之路

開啟Scrapy爬蟲之路

2020-09-17 15:56:23 其他

文章目錄

  • 摘要
  • 1.scrapy安裝
  • 2.相關命令介紹
    • 2.1全域命令
    • 2.2專案命令
  • 3.scrapy框架介紹
  • 4.Scrapy中資料流的流轉
  • 5.第一個scrapy爬蟲
    • 5.1創建專案
    • 5.2創建爬蟲模塊
    • 5.3定義item
    • 5.4構建Item Pipeline
    • 5.5 激活Item Pipeline
  • 參考資料

摘要

七夜大佬的《python爬蟲開發與專案實戰》,買了好多年了,學習了好多東西,基本上爬蟲都是在這里面學的,后期的scrapy框架爬蟲一直不得門而入,前段時間補了下面向物件的知識,今天突然頓悟了!寫個筆記記錄下學習程序

1.scrapy安裝

# -i引數后跟清華鏡像源,加速下載,其他pip的包也可這么操作
pip install Scrapy -ihttps://pypi.tuna.tsinghua.edu.cn/simple

測驗如下圖表示安裝成功
在這里插入圖片描述

其他參考方法:win7安裝scrapy

2.相關命令介紹

scrapy命令分為

  • 全域命令:全域命令就是在哪都能用;
  • 專案命令:專案命令就是只能依托你的專案;

2.1全域命令

全域命令就是上圖安裝測驗時主動跳出來的那些命令

startproject、genspider、settings、runspider、shell、fetch、view、version

比較常用的有三個:

scrapy startproject project_name # 創建專案
scrapy crawl spider_name # 運行名為spider_name的爬蟲專案
# 除錯網址為https://blog.csdn.net/qq_35866846的網站
scrapy shell "https://blog.csdn.net/qq_35866846"

全域命令就是不依托專案存在的,也就是不關你有木有專案都能運行,
比如:startproject它就是創建專案的命令,肯定是沒有專案也能運行;

詳細用法說明:

  • startproject

    # 使用頻次最高,用于專案創建,eg:創建一個名為:cnblogSpider的專案
    scrapy strartproject cnblogSpider
    
  • genspider

    # 用于創建爬蟲模板,example是spider名稱,生成檔案在spiders下面,也是后面寫爬蟲的地方
    # 注意spider名稱不能和專案相同
    scrapy genspider example example.com
    

    在這里插入圖片描述

    詳情請參考scrapy命令:scrapy genspider詳解

  • settings

    # 查看scray引數設定
    scrapy settings --get DOWNLOAD_DELAY # 查看爬蟲的下載延遲
    scrapy settings --get BOT_NAME # 爬蟲的名字
    
  • runspider
    運行蜘蛛除了使用前面所說的scrapy crawl XX之外,我們還能用:runspider;
    crawl是基于專案運行,runspide是基于檔案運行,
    也就是說你按照scrapy的蜘蛛格式撰寫了一個py檔案,如果不想創建專案,就可以使用runspider,eg:撰寫了一個:test.py的蜘蛛,你要直接運行就是:

    scrapy runspider test.py
    
  • shell

    # 這個命令比較重要,主要是除錯用,里面還有很多細節的命令
    # 最簡單常用的的就是除錯,查看我們的選擇器到底有木有正確選中某個元素
    
    scrapy shell "https://www.cnblogs.com/qiyeboy/default.html?page=1"
    
    # 然后我們可以直接執行response命令,
    #比如我們要測驗我們獲取標題的選擇器正不正確:
    
    response.css("title").extract_first()
    
    # 以及測驗xpath路徑選擇是否正確
    response.xpath("//*[@id='mainContent']/div/div/div[2]/a/span").extract()
    

    在這里插入圖片描述
    在這里插入圖片描述

  • fetch
    這個命令其實也可以歸結為除錯命令的范疇!它的功效就是模擬我們的蜘蛛下載頁面,也就是說用這個命令下載的頁面就是我們蜘蛛運行時下載的頁面,這樣的好處就是能準確診斷出,我們的到的html結構到底是不是我們所看到的,然后能及時調整我們撰寫爬蟲的策略!舉個栗子,淘寶詳情頁,我們一般看得到,但你如果按常規的方法卻爬不到,為神馬?因為它使用了異步傳輸!因此但你發現獲取不到內容的時候,你就要有所警覺,感覺用fetch命令來吧它的html代碼拿下來看看,到底有木有我們想要的那個標簽節點,如果木有的話,你就要明白我們需要使用js渲染之類的技術!用法很簡單:

    scrapy fetch http://www.scrapyd.cn
    

    就這樣,如果你要把它下載的頁面保存到一個html檔案中進行分析,我們可以使用window或者linux的輸出命令,這里演示window下如下如何把下載的頁面保存:

    scrapy fetch http://www.scrapyd.cn >d:/3.html
    

    在這里插入圖片描述
    可以看到,經過這個命令,scrapy下載的html檔案已經被存盤,接下來你就全文找找,看有木有那個節點,木有的話,毫無懸念,使用了異步加載!

  • view

# 和fetch類似都是查看spider看到的是否和你看到的一致,便于排錯
scrapy view https://blog.csdn.net/qq_35866846
  • version
# 查看scrapy版本
scrapy version

2.2專案命令

專案命令比較簡單,感覺沒什么好說的,我也沒怎么詳細測驗,
直接參考這篇【scrapy 命令列:scrpay專案命令】

3.scrapy框架介紹

Scrapy 是一個用python寫的Crawler Framework,簡單輕巧,并且十分方便,使用Twisted這個一部網路庫來處理網路通信,架構清晰,并包含了各種中間件介面,可以靈活地完成各種需求,整體架構組成如下圖
在這里插入圖片描述

  • Scrapy引擎(Engine): 引擎負責控制資料流在系統的所有組件中流動,并在相應動作發生時觸發事件;
  • 調度器(Scheduler): 調度器從引擎接收request 并將他們入隊,以便之后引擎請求request時提供引擎;
  • 下載器(Downloader): 下載器負責獲取頁面資料并提供給引擎,而后提供給Spider;
  • Spider: Spider是Scrapy用戶撰寫用于分析Response 并提取Item(即獲取到的Item)或額外跟進的URL的類,每個Spider負責處理一個特定(或一些)網站
  • Item Pipeline: Item Pipeline 負責處理被Spider提取出來的Item .典型的處理有清理驗證及持久化(例如存盤到資料庫中);
  • 下載器中間件(Downloader middlewares): 下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的Response,其提供了一個簡單的機制,通過插入自定義代碼來擴展Scrapy功能;
  • Spider中間件(Spider middlwares): Spider中間件是在引擎及Spider之間的特定鉤子(specific hook), 處理Spider的輸入(response)和輸出(items 及request)其中提供了一個簡便的機制,通過插入自定義代碼來實作Scrapy功能,

4.Scrapy中資料流的流轉

  1. 引擎打開一個網站(open a domain),找到處理該網站的Spider 并向該Spider請求第一個要爬取的URL

  2. 引擎從Spider中獲取第一個要爬取的URL并通過調度器(Schedule)以Request進行調度

  3. 引擎向調度器請求下一個要爬取的URL

  4. 調度器回傳下一個要爬取的URL給引擎,引擎降URL通過下載中間件(請求(request)方向)轉發給下載器(Downloader)

  5. 一旦頁面下載完畢,下載器生成一個該頁面的Response,并將其通過下載中間件(回傳(response)方向)發送給引擎

  6. 引擎從下載器中接收到Response并通過Spider中間件(輸入方向)發送給Spider處理

  7. Spider處理Response并回傳爬取到的Item及(跟進的)新的Request給引擎

  8. 引擎將(Spider回傳的)爬取到的Item 給Item Pipeline,將(Spider回傳的)Request給調度器

  9. (從第二步)重復直到調度器中沒有更多的Request,引擎關閉網站

5.第一個scrapy爬蟲

七夜大佬《》的案例專案,由于書買的比較早,里面用的還是python2
自己動手在python3的環境下實作一下

5.1創建專案

# 創建一個名為cnblogSpider 的Scrapy專案
scrapy startproject cnblogSpider

在這里插入圖片描述
創建好專案之后,直接使用pycharm打開,繼續作業即可
結構性檔案自動生成,把框架填充起來即可
在這里插入圖片描述

  • scrapy.cfg: 專案部署檔案
  • cnblogSpider/ : 給專案的python模塊,之后可以在此加入代碼
  • cnblogSpider/items.py:專案中的Item檔案
  • cnblogSpider/pipelines.py:專案中的Pipelines檔案
  • cnblogSpider/settings.py:專案的組態檔
  • cnblogSpider/spiders/:放置Spider代碼的目錄

5.2創建爬蟲模塊

from ..items import CnblogspiderItem
class CnblogsSpider(scrapy.Spider):
    name = "cnblogs"  # 爬蟲的名稱
    allowed_domains = ["cnblogs.com"]  # 允許的域名
    start_urls = [
        "https://www.cnblogs.com/qiyeboy/default.html?page=1"
    ]

    def parse(self, response):
        # 實作網頁決議
        # 首先抽取所有文章
        papers = response.xpath("//*[@class='day']")
        # 從每篇文章中抽取資料
        for paper in papers:
            url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
            title = paper.xpath(".//*[@class='postTitle']/a/span/text()").extract()[0]
            time = paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
            content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
            # print(url, title, time, content)
            item = CnblogspiderItem(url=url, title=title, time=time, content=content)
            yield item
        next_page = Selector(response).re(u'<a href="(\S*)">下一頁</a>')
        if next_page:
            yield scrapy.Request(url=next_page[0], callback=self.parse)

5.3定義item

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class CnblogspiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    url = scrapy.Field()
    time = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()


class newCnblogsItem(CnblogspiderItem):
    body = scrapy.Field()
    # title = scrapy.Field(CnblogspiderItem.Fields['title'], serializer = my_serializer)

5.4構建Item Pipeline

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter
import json
from scrapy.exceptions import DropItem
from .items import CnblogspiderItem


class CnblogspiderPipeline(object):
    def __init__(self):
        self.file = open('papers.json', 'w', encoding='UTF-8')

    def process_item(self, item, spider):
        if item['title']:
            line = json.dumps(dict(item)) + '\n'
            # print(type(line))
            # self.file.write(line.encode())
            # 注意open "wb" 寫入的是位元組流,“w”寫入的是str
            # 使用decode 和 encode進行位元組流和str的相互轉化
            self.file.write(line)
            return item
        else:
            raise DropItem(f"Missing title in {item}")

5.5 激活Item Pipeline

定制完Item Pipeline ,它是無法作業的需要進行激活,要啟用一個Item Pipeline組件
必須將它的類添加到settings.py中的ITEM_PIPELINES 變數中

自動創建的Scrapy直接把settings.py中的該行取消注釋即可

TEM_PIPELINES 變數中可以配置很多個Item Pipeline組件,分配給每個類的整型值確定了他們的運行順序,item 按數字從低到高的順序通過Item Pipeline,取值范圍0 ~1000

ITEM_PIPELINES = {
   'cnblogSpider.pipelines.CnblogspiderPipeline': 300,
}

激活完成后,將命令列切換到專案目錄下執行

scrapy crawl cnblogs

在這里插入圖片描述

參考資料

【1】書《python爬蟲開發與專案實戰》和 隨書代碼
【2】scrapy1.5中文檔案

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/66681.html

標籤:其他

上一篇:python基礎(生產者與消費者模式、threadingLocal)

下一篇:python可視化(案例)水果分類(香蕉、蘋果大戰)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more