Scrapy框架總結(jié)

一、Scrapy框架的使用步驟:

    1. 創(chuàng)建項(xiàng)目:
      scrapy startproject project_name
    1. cd進(jìn)項(xiàng)目目錄:
      cd project_name
    1. 創(chuàng)建項(xiàng)目應(yīng)用程序:
      scrapy genspider app_name start_url
    1. 編寫(xiě)爬蟲(chóng)文件代碼、settings配置:
      codes........
    1. 執(zhí)行爬蟲(chóng)程序:
      scrapy crawl app_name

二、Scrapy初始Url的兩種寫(xiě)法:

  • 一種是常量start_urls,并且需要定義一個(gè)方法parse()
import scrapy
class simpleUrl(scrapy.Spider):
    name = "simpleUrl"
    start_urls = [  #另外一種寫(xiě)法,無(wú)需定義start_requests方法
        'http://lab.scrapyd.cn/page/1/',
        'http://lab.scrapyd.cn/page/2/',
    ]
    # 此方法名必須為:parse
    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'mingyan-%s.html' % page
        with open(filename, 'wb') as f:
          f.write(response.body)
        self.log('保存文件: %s' % filename)
  • 另一種是直接定義一個(gè)方法:star_requests()
import scrapy
class simpleUrl(scrapy.Spider):
     name = "simpleUrl"

     def start_requests(self):
         urls = [ 
            #爬取的鏈接由此方法通過(guò)下面鏈接爬取頁(yè)面
            'http://lab.scrapyd.cn/page/1/',
             'http://lab.scrapyd.cn/page/2/',
         ]
         for url in urls:
             yield scrapy.Request(url=url, callback=self.parse)

三、Scrapy調(diào)試工具之scrapy shell使用方法:

調(diào)試就是驗(yàn)證scrapy到底有木有提取到數(shù)據(jù)的工具,如果木有它你根本不知道你寫(xiě)的規(guī)則到底有木有提取到數(shù)據(jù),所以這個(gè)工具是個(gè)剛需!其實(shí)也很簡(jiǎn)單,就是在命令行輸入下面一行代碼而已:
scrapy shell start_url:注意:執(zhí)行此命令時(shí)需先cd到項(xiàng)目目錄下

屏幕快照 2018-11-19 下午8.03.38.png

比如我們想提取 http://lab.scrapyd.cntitle,我們可以在[s]: 后面輸入:response.css('title') ,然后回車(chē), 立馬就得到如下結(jié)果:
response

似不似很直觀的驗(yàn)證了你提取的數(shù)據(jù)對(duì)不對(duì)?如果正確了,我們?cè)侔焉厦娴拇a放到我們蜘蛛里面,那這樣就會(huì)正確的得到你想要的數(shù)據(jù),而不會(huì)出現(xiàn)意外了,這就是scrapy調(diào)試工具的應(yīng)用!

四、Scrapy 爬取下一頁(yè),scrapy整站爬取

接下來(lái),還是繼續(xù)爬?。?a target="_blank" rel="nofollow">http://lab.scrapyd.cn (鏈接獨(dú)白:為神馬受傷的總是我?)!我們既然要爬取下一頁(yè),那我們首先要分析鏈接格式,找到下一頁(yè)的鏈接,那爬取就簡(jiǎn)單了

image.png

主要代碼實(shí)現(xiàn)

next_page = response.css('li.next a::attr(href)').extract_first() 
    if next_page is not None:
        next_page = response.urljoin(next_page)
        yield scrapy.Request(next_page, callback=self.parse)

五、Scrapy arguments:指定蜘蛛?yún)?shù)爬取

Using spider arguments,這個(gè)東西對(duì)于許多朋友來(lái)說(shuō),簡(jiǎn)直是雪中送炭,因?yàn)橛辛藚?shù)配置爬取,就能加大我們爬取的靈活性,而不必重復(fù)修改、編寫(xiě)爬蟲(chóng)代碼了。
  比如我們要爬取http://lab.scrapyd.cn里面的數(shù)據(jù),原先我們需要全站的,過(guò)了幾天需求變了,我們只需要:“人生”這個(gè)標(biāo)簽下面的內(nèi)容,那我們又需要更改爬蟲(chóng)代碼,又過(guò)了幾天,需求又變,我們又需要標(biāo)簽:“勵(lì)志”下面的內(nèi)容,那我們又得改爬蟲(chóng)……
  如果爬蟲(chóng)量少還好,那如果有十個(gè)、一百個(gè)……那一天到晚我們只能不斷的修改、不斷的伺候這些爬蟲(chóng)了!
  那怎樣才能讓我們的爬蟲(chóng)更靈活呢?scrapy給我提供了可傳參的爬蟲(chóng),有了這么個(gè)功能,那人生就更加美麗了,上面不斷變化的爬蟲(chóng)我們就可以這樣來(lái)玩,首先按scrapy 參數(shù)格式定義好參數(shù),如下:

import scrapy


class ArgsspiderSpider(scrapy.Spider):
    name = "argsSpider"

    def start_requests(self):
        url = 'http://lab.scrapyd.cn/'
        # 獲取tag值,也就是爬取時(shí)傳過(guò)來(lái)的參數(shù)
        tag = getattr(self, 'tag', None)
        # 判斷是否存在tag,若存在,重新構(gòu)造url
        if tag is not None:
            # 構(gòu)造url若tag=愛(ài)情,url= "http://lab.scrapyd.cn/tag/愛(ài)情"
            url = url + 'tag/' + tag
            # 發(fā)送請(qǐng)求爬取參數(shù)內(nèi)容
            yield scrapy.Request(url, self.parse)

    def parse(self, response):
        mingyan = response.css('div.quote')
        
        for v in mingyan:
            text = v.css('.text::text').extract_first()
            tags = v.css('.tags .tag::text').extract()
            tags = ','.join(tags)
            fileName = '%s-語(yǔ)錄.txt' % tags
            with open(fileName, "a+") as f:
                f.write(text)
                f.write('\n')
                f.write('標(biāo)簽:' + tags)
                f.write('\n-------\n')
                f.close()

        next_page = response.css('li.next a::attr(href)').extract_first()
        
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)

代碼寫(xiě)好之后,那我們要如何傳參呢?如何運(yùn)行呢?
比如我們要爬取標(biāo)簽:愛(ài)情,我們可以這樣:
scrapy crawl argsSpider -a tag=愛(ài)情
要爬取標(biāo)簽:勵(lì)志,我們可以這樣:
scrapy crawl argsSpider -a tag=勵(lì)志
參數(shù):tag=愛(ài)情、tag=勵(lì)志就可以在爬取的時(shí)候傳進(jìn)去我們蜘蛛里面,我們就可以不修改蜘蛛,愉快的爬取了!

六、scrapy命令明細(xì):

1. Scrapy框架的命令也就十四五個(gè),最常用的命令也就三個(gè),即:
  scrapy startproject(創(chuàng)建項(xiàng)目)、
  scrapy crawl XX(運(yùn)行XX蜘蛛)、
  scrapy shell http://www.scrapyd.cn(調(diào)試網(wǎng)址為http://www.scrapyd.cn的網(wǎng)站)

2. scrapy命令分為:全局命令、項(xiàng)目命令;
  很好理解,全局命令就是在哪都能用;項(xiàng)目命令就是只能依托你的項(xiàng)目

全局命令

  • startproject:
    創(chuàng)建項(xiàng)目
    scrapy startproject(創(chuàng)建項(xiàng)目)
  • genspider:
    這個(gè)命令的話是根據(jù)爬蟲(chóng)模板創(chuàng)建爬蟲(chóng)py文件的命令
    scrapy genspider spider_app_name start_url
  • settings:
    看字面意思,相信聰明的你已經(jīng)知道它是干嘛的了!其實(shí)它就是方便你查看到你對(duì)你的scray設(shè)置了些神馬參數(shù)!
    比如我們想得到爬蟲(chóng)項(xiàng)目的下載延遲,我們可以使用:
    scrapy settings --get DOWNLOAD_DELAY
    比如我們想得到爬蟲(chóng)項(xiàng)目的名字:
    scrapy settings --get BOT_NAME
  • runspider:
    這個(gè)命令有意思,之前我們運(yùn)行爬蟲(chóng)項(xiàng)目除了使用:scrapy crawl XX之外,我們還能用:runspider,前者是基于項(xiàng)目運(yùn)行,后者是基于文件運(yùn)行,也就是說(shuō)你按照scrapy的爬蟲(chóng)項(xiàng)目格式編寫(xiě)了一個(gè)py文件,那你不想創(chuàng)建項(xiàng)目,那你就可以使用runspider,比如你編寫(xiě)了一個(gè):scrapyd_cn.py的爬蟲(chóng)文件,你要直接運(yùn)行就是:
    scrapy runspider scrapy_cn.py
  • shell:
    這個(gè)命令比較重要,主要是調(diào)試用
    scrapy shell [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • fetch:
    這個(gè)命令其實(shí)也可以歸結(jié)為調(diào)試命令的范疇!它的功效就是模擬我們的蜘蛛下載頁(yè)面,也就是說(shuō)用這個(gè)命令下載的頁(yè)面就是我們蜘蛛運(yùn)行時(shí)下載的頁(yè)面,這樣的好處就是能準(zhǔn)確診斷出,我們的到的html結(jié)構(gòu)到底是不是我們所看到的,然后能及時(shí)調(diào)整我們編寫(xiě)爬蟲(chóng)的策略!
    scrapy fetch [http://www.scrapyd.cn](http://www.scrapyd.cn/)
  • version:
    查看scrapy版本
    scrapy version

項(xiàng)目命令

  • crawl:
    運(yùn)行爬蟲(chóng)文件
    scrapy crawl my_project
  • check:
    檢查爬蟲(chóng)文件
    scrapy check my_project
  • list:
    顯示有多少個(gè)爬蟲(chóng)文件
    scrapy list
  • edit:
    編輯文件(類似于linux系統(tǒng)下的vim)
    scrapy edit my_project
  • parse
    常用參數(shù)預(yù)覽
    scrapy parse my_project
  • bench
    項(xiàng)目詳細(xì)運(yùn)行情況
    scrapy bench my_project

參考Scrapy中文網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容