主頁 > 前端設計 > 開啟Scrapy爬蟲之路

開啟Scrapy爬蟲之路

2020-09-17 19:18:34 前端設計

文章目錄

  • 摘要
  • 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/qianduan/67997.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)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more