Scrapy 框架基本了解以及Spiders爬蟲

Scrapy 框架基本了解以及Spiders爬蟲已旧,首先我們先了解下Scrapy 框架基本原理,然后我們用一個(gè)簡(jiǎn)單的案例來介紹Scrapy的使用张咳。

Scrapy 框架基本了解:
1现柠、Scrapy是用純Python實(shí)現(xiàn)一個(gè)為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架谷暮,用途非常廣泛。
2、框架的力量企孩,用戶只需要定制開發(fā)幾個(gè)模塊就可以輕松的實(shí)現(xiàn)一個(gè)爬蟲,用來抓取網(wǎng)頁內(nèi)容以及各種圖片袁稽,非常之方便勿璃。
3、Scrapy 使用了 Twisted'tw?st?d異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊推汽,可以加快我們的下載速度补疑,不用自己去實(shí)現(xiàn)異步框架,并且包含了各種中間件接口歹撒,可以靈活的完成各種需求莲组。
4、Scrapy框架流程圖

scrapy_all.png

① Scrapy Engine(引擎): 負(fù)責(zé)Spider暖夭、ItemPipeline锹杈、Downloader、Scheduler中間的通訊迈着,信號(hào)竭望、數(shù)據(jù)傳遞等。
② Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過來的Request請(qǐng)求寥假,并按照一定的方式進(jìn)行整理排列市框,入隊(duì),當(dāng)引擎需要時(shí)糕韧,交還給引擎枫振。
③ Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎)萤彩,由引擎交給Spider來處理粪滤。
④ Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù)雀扶,并將需要跟進(jìn)的URL提交給引擎杖小,再次進(jìn)入Scheduler(調(diào)度器)。
⑥ Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item愚墓,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析予权、過濾、存儲(chǔ)等)的地方浪册。
⑦ Downloader Middlewares(下載中間件):你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件扫腺。
⑧ Spider Middlewares(Spider中間件):你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)。

Scrapy 框架Spiders步驟:
1村象、創(chuàng)建一個(gè)Scrapy項(xiàng)目scrapy startproject mySpider
2笆环、定義提取的結(jié)構(gòu)化數(shù)據(jù)(Item)
3攒至、編寫爬取網(wǎng)站的 Spider 并提取出結(jié)構(gòu)化數(shù)據(jù)(Item)
scrapy genspider example example.com

scrapy.cfg :項(xiàng)目的配置文件
mySpider/ :項(xiàng)目的Python模塊,將會(huì)從這里引用代碼
mySpider/items.py :項(xiàng)目的目標(biāo)文件
mySpider/pipelines.py :項(xiàng)目的管道文件
mySpider/settings.py :項(xiàng)目的設(shè)置文件
mySpider/spiders/ :存儲(chǔ)爬蟲代碼目錄

4躁劣、編寫 Item Pipelines 來存儲(chǔ)提取到的Item(即結(jié)構(gòu)化數(shù)據(jù))

在mySpider目錄下執(zhí)行:scrapy crawl itcast

保存數(shù)據(jù):
scrapy保存信息的最簡(jiǎn)單的方法主要有四種迫吐,-o 輸出指定格式的文件,命令如下:

# json格式账忘,默認(rèn)為Unicode編碼
scrapy crawl itcast -o teachers.json
# json lines格式志膀,默認(rèn)為Unicode編碼
scrapy crawl itcast -o teachers.jsonl
# csv 逗號(hào)表達(dá)式,可用Excel打開
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml

5闪萄、Spiders爬取某個(gè)培訓(xùn)結(jié)構(gòu)老師的信息
items.py

模型類

import scrapy
# Item 定義結(jié)構(gòu)化數(shù)據(jù)字段,用來保存爬取到的數(shù)據(jù)
class TeacherinfoItem(scrapy.Item):
    # 獲取名字
    name = scrapy.Field()
    # 職稱
    position = scrapy.Field()
    # 個(gè)人信息
    info = scrapy.Field()

myteacher.py

爬蟲文件

# -*- coding: utf-8 -*-
import scrapy
from teacherInfo.items import TeacherinfoItem
class MyteacherSpider(scrapy.Spider):
    name = 'myteacher'
    allowed_domains = ['itcast.cn']
    # start_urls = ("http://www.itcast.cn/channel/teacher.shtml",) 元組也可以
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ac',
                  'http://www.itcast.cn/channel/teacher.shtml#acloud',
                  'http://www.itcast.cn/channel/teacher.shtml#adesign',
                  'http://www.itcast.cn/channel/teacher.shtml#ads',
                  'http://www.itcast.cn/channel/teacher.shtml#ajavaee',
                  'http://www.itcast.cn/channel/teacher.shtml#anetmarket',
                  'http://www.itcast.cn/channel/teacher.shtml#aphp',
                  'http://www.itcast.cn/channel/teacher.shtml#apm',
                  'http://www.itcast.cn/channel/teacher.shtml#apython',
                  'http://www.itcast.cn/channel/teacher.shtml#astack',
                  'http://www.itcast.cn/channel/teacher.shtml#atest',
                  'http://www.itcast.cn/channel/teacher.shtml#aui',
                  'http://www.itcast.cn/channel/teacher.shtml#auijp',
                  'http://www.itcast.cn/channel/teacher.shtml#aweb']
    # 爬蟲的約束區(qū)域
    def parse(self, response):
        # 存放老師信息的集合
        items = []
        print(response.body)
        for each in response.xpath("http://div[@class='li_txt']"):
            # 將我們得到的數(shù)據(jù)封裝到一個(gè) `ItcastItem` 對(duì)象
            item = TeacherinfoItem()
            # extract()方法返回的都是unicode字符串
            name = each.xpath("h3/text()").extract()
            position = each.xpath("h4/text()").extract()
            info = each.xpath("p/text()").extract()
            # xpath返回的是包含一個(gè)元素的列表
            item['name'] = name[0]
            item['position'] = position[0]
            item['info'] = info[0]
            items.append(item)
            yield item
        # 直接返回最后數(shù)據(jù)
        # return items

pipelines.py

管道

import json
import codecs
class TeacherinfoPipeline(object):
    def __init__(self):
        self.filename = codecs.open('teacher.json','wb','utf-8')
    def process_item(self, item, spider):
        print(item)
        html = json.dumps(dict(item),ensure_ascii=False)
        self.filename.write(html + '\n')
        return item

    def open_spider(self, spider):
        pass
        # self.filename.close()

settings.py

基本設(shè)置

BOT_NAME = 'teacherInfo'
SPIDER_MODULES = ['teacherInfo.spiders']
NEWSPIDER_MODULE = 'teacherInfo.spiders'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0)'
ROBOTSTXT_OBEY = True
SPIDER_MIDDLEWARES = {
   'teacherInfo.middlewares.TeacherinfoSpiderMiddleware': 543,
}
ITEM_PIPELINES = {
   'teacherInfo.pipelines.TeacherinfoPipeline': 300,
}

begin.py

運(yùn)行和調(diào)試文件

from scrapy import cmdline
cmdline.execute('scrapy crawl myteacher'.split())

配置begin.py文件請(qǐng)移步PyCharm運(yùn)行和調(diào)試Scrapy
了解這么多梧却,就可以使用Scrapy框架爬蟲了,一起學(xué)習(xí)败去。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末放航,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子圆裕,更是在濱河造成了極大的恐慌广鳍,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吓妆,死亡現(xiàn)場(chǎng)離奇詭異赊时,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)行拢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門祖秒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舟奠,你說我怎么就攤上這事竭缝。” “怎么了沼瘫?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵抬纸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我耿戚,道長(zhǎng)湿故,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任膜蛔,我火速辦了婚禮坛猪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皂股。我一直安慰自己墅茉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躁锁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卵史。 梳的紋絲不亂的頭發(fā)上战转,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音以躯,去河邊找鬼槐秧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛忧设,可吹牛的內(nèi)容都是我干的刁标。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼址晕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膀懈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谨垃,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤启搂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刘陶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胳赌,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年匙隔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疑苫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纷责,死狀恐怖捍掺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碰逸,我是刑警寧澤乡小,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站饵史,受9級(jí)特大地震影響满钟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胳喷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一湃番、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吭露,春花似錦吠撮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弄屡。三九已至,卻和暖如春鞋诗,著一層夾襖步出監(jiān)牢的瞬間膀捷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工削彬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留全庸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓融痛,卻偏偏與公主長(zhǎng)得像壶笼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雁刷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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