五延旧、Scrapy框架之Spider模板

一谋国、安裝scrapy

首先安裝依賴庫Twisted

    pip install (依賴庫的路徑)

    在這個網(wǎng)址http://www.lfd.uci.edu/~gohlke/pythonlibs#twisted 下面去尋找符合你的python版本和系統(tǒng)版本的Twisted

然后在安裝scrapy框架

    pip install scrapy

    【注意】路徑名不能有中文,不能用管理員進入cmd迁沫,電腦系統(tǒng)用戶路徑不能是中文

二芦瘾、框架簡介

該框架是一個第三方的框架捌蚊,許多功能已經(jīng)被封裝好(比如:下載功能)

流程原理圖
由五部分構(gòu)成:

引擎、下載器近弟、爬蟲缅糟、調(diào)度器、管道(item和pipeline)

以上五部分我們只需要關(guān)系其中的兩部分:爬蟲和管道

spiders:蜘蛛或爬蟲祷愉,我們分析網(wǎng)頁的地方窗宦,我們主要的代碼寫在這里

管道:包括item和pipeline,用于處理數(shù)據(jù)

引擎:用來處理整個系統(tǒng)的數(shù)據(jù)流二鳄,觸發(fā)各種事務(wù)(框架的核心)

下載器:用于下載網(wǎng)頁內(nèi)容赴涵,并且返回給蜘蛛(下載器基于Twisted的高效異步模型)

調(diào)度器:用來接收引擎發(fā)過來的請求,壓入隊列中等處理任務(wù)

三泥从、使用

  • 創(chuàng)建項目指令
scrapy startproject 項目名
  • 項目目錄結(jié)構(gòu)
firstSpider     項目名稱
        firstSpider
            spiders           爬蟲目錄(寫代碼位置)
                __init__.py
                myspider.py       爬蟲文件,以后的爬蟲代碼寫在這里
            __init__.py
            items.py              定義數(shù)據(jù)結(jié)構(gòu)地方
            middlewares.py    中間件(了解)
            pipelines.py      管道文件
            settings.py       項目配置文件
        scrapy.cfg
  • 創(chuàng)建爬蟲指令
scrapy genspider 爬蟲名 域名
  • 運行爬蟲指令
scrapy crawl 爬蟲名
scrapy crawl 爬蟲名 -o xxx.csv\json\xml

四、執(zhí)行流程

1輸入scrapy crawl '項目名稱'
2讀取setting.py配置信息
3執(zhí)行spiders目錄下的爬蟲程序沪摄,執(zhí)行_init_()方法和parse()方法
4在parse方法里解析html躯嫉,返回一個item實4按照配置順序執(zhí)行pipelines.py(可多個)執(zhí)行邏輯,一般是存儲杨拐。
5程序結(jié)束祈餐。

五、管道包含 items and pipline

  • 作用

1哄陶、清理HTML數(shù)據(jù)帆阳。

2、驗證爬取數(shù)據(jù)屋吨,檢查爬取字段蜒谤。

3、查重并丟棄重復(fù)內(nèi)容至扰。

4鳍徽、將爬取結(jié)果保存到數(shù)據(jù)庫。

  • 幾個核心的方法

創(chuàng)建一個項目的時候都會自帶pipeline其中就實現(xiàn)了process_item(item, spider)方法

1敢课、open_spider(spider)就是打開spider時候調(diào)用的,常用于初始化操作(常見開啟數(shù)據(jù)庫連接,打開文件)
2阶祭、close_spider(spider)關(guān)閉spider時候調(diào)用,常用于關(guān)閉數(shù)據(jù)庫連接
3、from_crawler(cls, crawler)是一個類方法(需要使用@classmethod裝飾器標識),一般用來從settings.py中獲取常量的

4直秆、process_item(item, spider)是必須實現(xiàn)的,別的都是選用的濒募!
-   參數(shù)
        item是要處理的item對象
        spider當前要處理的spider對象

-   返回值
        返回item就會繼續(xù)給優(yōu)先級低的item pipeline二次處理
        如果直接拋出DropItem的異常就直接丟棄該item
  • piplines.py

進行數(shù)據(jù)存儲

# -*- coding: utf-8 -*-

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

import csv
import pymysql
# 寫入csv表格
class InterestingPipeline(object):

    # 開啟爬蟲
    def open_spider(self,spider):
        self.csv_file = open("u148.csv",'w',encoding='utf-8')
        # 創(chuàng)建一個列表用于整合csv數(shù)據(jù)
        self.csv_items = []

    def process_item(self, item, spider):
        # 整合csv數(shù)據(jù)
        # 把item字典轉(zhuǎn)化成列表
        csv_item =[]
        csv_item.append(item['title'])
        csv_item.append(item['author'])
        csv_item.append(item['intro'])
        csv_item.append(item['img'])
        csv_item.append(item['type'])
        csv_item.append(item['date'])

        self.csv_items.append(csv_item)

        # 【注意】這里每遍歷一個item以后一定要把他返回出去,如果不返回圾结,其它優(yōu)先級比這個管道低的就無法獲取到其它item
        return item

    def close_spider(self,spider):

        # 把前面整合完成的數(shù)據(jù)寫入csv文件
        writer = csv.writer(self.csv_file)
        # 寫表頭
        writer.writerow(['title','author','intro','img','type','date'])
        # 寫內(nèi)容
        writer.writerows(self.csv_items)
        self.csv_file.close()



# 定義一個管道類瑰剃,用于寫入數(shù)據(jù)庫
class MysqlPipeline(object):

    def open_spider(self,spider):
        self.db =pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123456',db='u148',charset='utf8')
        self.cursor =self.db.cursor()
        # self.db.begin()


    def process_item(self,item,spider):
        # 定義sql語句
        sql = "INSERT INTO music VALUES(NULL,'%s','%s','%s','%s','%s','%s')"%(item['title'],item['author'],item['img'],item['intro'],item['type'],item['date'])
        self.cursor.execute(sql)
        self.db.commit()
        return  item

    def close_spider(self,spider):
        self.cursor.close()
        self.db.close()
  • items.py
import scrapy
# 主要是對待爬取的數(shù)據(jù)進行模型化,并且對接需求分析

class InterestingItem(scrapy.Item):
    # 本質(zhì)是一個字典對象筝野,


    # define the fields for your item here like:
    # name = scrapy.Field()
    # 網(wǎng)頁里面需要爬取那些內(nèi)容
    # title
    title = scrapy.Field()
    # 圖片
    img = scrapy.Field()

    # 簡介
    intro = scrapy.Field()
    # 作者
    author = scrapy.Field()
    # 類型
    type = scrapy.Field()
    # 日期
    date = scrapy.Field()

五培他、settings配置

  • 代理設(shè)置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
  • 是否遵循robots協(xié)議
ROBOTSTXT_OBEY = False
  • 下載延時
# 單位:秒
DOWNLOAD_DELAY = 2
  • 默認請求頭
DEFAULT_REQUEST_HEADERS = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Connection': 'keep-alive',
    # 'Host': 'passport.weibo.cn',
    'Origin': 'https://passport.weibo.cn',
    'Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F%3Fluicode%3D20000174&backTitle=%CE%A2%B2%A9&vt='

}
  • 開啟管道
ITEM_PIPELINES = {
    #300表示優(yōu)先級鹃两,范圍(0-1000),越小級別越高
   'Weibo.pipelines.WeiboPipeline': 300,
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舀凛,一起剝皮案震驚了整個濱河市俊扳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猛遍,老刑警劉巖馋记,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懊烤,居然都是意外死亡梯醒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門腌紧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來茸习,“玉大人,你說我怎么就攤上這事壁肋『排撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵浸遗,是天一觀的道長猫胁。 經(jīng)常有香客問我,道長跛锌,這世上最難降的妖魔是什么弃秆? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮髓帽,結(jié)果婚禮上菠赚,老公的妹妹穿的比我還像新娘。我一直安慰自己郑藏,他們只是感情好锈至,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布译秦。 她就那樣靜靜地躺著峡捡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筑悴。 梳的紋絲不亂的頭發(fā)上们拙,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音阁吝,去河邊找鬼砚婆。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的装盯。 我是一名探鬼主播坷虑,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼埂奈!你這毒婦竟也來了迄损?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤账磺,失蹤者是張志新(化名)和其女友劉穎芹敌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垮抗,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡氏捞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冒版。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液茎。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖辞嗡,靈堂內(nèi)的尸體忽然破棺而出捆等,到底是詐尸還是另有隱情,我是刑警寧澤欲间,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布楚里,位于F島的核電站断部,受9級特大地震影響猎贴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝴光,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一她渴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔑祟,春花似錦趁耗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至径簿,卻和暖如春罢屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篇亭。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工缠捌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人译蒂。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓曼月,卻偏偏與公主長得像谊却,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哑芹,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 用兩張圖告訴你炎辨,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評論 2 59
  • 這個項目也是初窺python爬蟲的一個項目绩衷,也是我的畢業(yè)設(shè)計蹦魔,當時選題的時候,發(fā)現(xiàn)大多數(shù)人選擇的都是網(wǎng)站類咳燕,實在是...
    夢航韓語閱讀 3,001評論 2 37
  • Scrapy是一個為了爬取網(wǎng)站數(shù)據(jù)勿决,提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架。 可以應(yīng)用在包括數(shù)據(jù)挖掘招盲,信息處理或存儲歷史數(shù)...
    c9af2eadd50d閱讀 999評論 0 3
  • 一個C程序就是由若干頭文件(#include)和函數(shù)組成低缩,并有且只有一個主函數(shù) 在最新的C標準中,main函數(shù)前的...
    Bangys閱讀 205評論 0 0
  • 四川西南航空職業(yè)學院迎來了新一屆的18級小可愛們,此次歌手大賽的目的是:1顶籽、為大一新生提供一個展示自己玩般,實現(xiàn)自我的...
    木吶y閱讀 489評論 0 0