爬蟲(chóng)----scrapy基礎(chǔ)

1.scrapy概述

使用Python開(kāi)發(fā)的主要進(jìn)行數(shù)據(jù)采集的一個(gè)應(yīng)用程序框架,核心使用它來(lái)進(jìn)行爬蟲(chóng)程序的快速開(kāi)發(fā),底層使用了twisted異步模塊,所以在進(jìn)行數(shù)據(jù)采集下載時(shí)效率非常高!

2.安裝

    pip install scrapy
    或者
    easy_install scrapy

    PS:在windows上運(yùn)行項(xiàng)目會(huì)出現(xiàn)問(wèn)題,
    #如果出現(xiàn)類似于WinError這樣的的問(wèn)題,請(qǐng)安裝下面的模塊
    # 安裝pypiwin32模塊,用于scrapy模塊可能調(diào)用win底層C庫(kù)進(jìn)行函數(shù)操作
    pip install pypiwin32

3.創(chuàng)建項(xiàng)目

scrapy startproject <spider_name>

創(chuàng)建好的項(xiàng)目文件結(jié)構(gòu)如下:

|-- myspider/ 項(xiàng)目根目錄
  |-- scrapy.cfg 項(xiàng)目配置文件 [cfg: config]
  |-- myspider/ 爬蟲(chóng)模塊->爬蟲(chóng)程序開(kāi)發(fā)都在這個(gè)模塊中
    |-- spiders/ 爬蟲(chóng)程序所在的目錄
    |-- items.py 采集的數(shù)據(jù)->定義封裝模型類的模塊
    |-- pipelines.py 采集的數(shù)據(jù)->采集完成之后進(jìn)行數(shù)據(jù)驗(yàn)證、存儲(chǔ)的模塊
    |-- middlewares.py 中間件定義的模塊
    |-- settings.py 項(xiàng)目設(shè)置模塊

4.爬蟲(chóng)開(kāi)發(fā)

    1. 明確自己爬取網(wǎng)頁(yè)獲取的信息定義item類型,封裝字段。
      items.py文件
        import scrapy
    
        class ZhilianItem(scrapy.Item):
            # 定義屬性字段
            job = scrapy.Field()
            company = scrapy.Field()
            salary = scrapy.Field()
    
    1. 開(kāi)發(fā)具體爬蟲(chóng)代碼
    • 執(zhí)行命令自動(dòng)創(chuàng)建爬蟲(chóng)文件
      scrapy genspider zhilain "zhilian.cn"
      將創(chuàng)建一個(gè)名為zhilian的爬蟲(chóng),并指定爬取域的范圍:"zhilian.cn"

    • 在spiders文件夾里手動(dòng)新建爬蟲(chóng)文件 zhilain.py

    代碼:

      import scrapy
    
      class ZhilianSpider(scrapy.Spider):
          #修改設(shè)置,設(shè)置符合自己需求
          name = "zhilain"
          allowed_domains = ["zhilian.cn"]
          start_urls = (
              'http://www.itcast.cn/',
          )
    
          def parse(self, response):
              pass
    

    在spiders/zhilianspider.py模塊中定義ZhilianSpider類型
    繼承自scrapy.Spider
    類型中的屬性:name屬性~爬蟲(chóng)名稱,用于在命令行啟動(dòng)爬蟲(chóng)時(shí)調(diào)用
    類型中的屬性:start_urls屬性~采集數(shù)據(jù)的初始url地址[列表、元組]
    類型中的屬性:allowed_domains屬性~采集數(shù)據(jù)的網(wǎng)站域名限制
    類型中的方法:parse(self, response)采集完數(shù)據(jù)之后自動(dòng)執(zhí)行的函數(shù)

    1. 數(shù)據(jù)處理
      parse(self, response)函數(shù)自動(dòng)獲取爬取的數(shù)據(jù),通過(guò)自己編寫(xiě)篩選獲取具體需要的數(shù)據(jù)部分。
      代碼:
        #先引入之前寫(xiě)好的item模塊的封裝類型函數(shù)
        from .. import items
    
        #在parse(self, response)函數(shù)里處理得到response,
        #通過(guò)xpath、css等技術(shù)篩選得到具體數(shù)據(jù)
            job_items = []
                # 將得到的數(shù)據(jù)封裝成item對(duì)象
                item = items.ZhilianItem()
                item['job'] = job
                item['company'] = company
                item['salary'] = salary
                #將數(shù)據(jù)添加保存在列表里
                job_items.append(item)
            
            #這樣直接保存在列表,不經(jīng)過(guò)pipeline
            return job_items
            #不推薦這樣,一般用管道存儲(chǔ)在數(shù)據(jù)庫(kù)里
    
  • 用命令直接將數(shù)據(jù)保存成文件

  • json格式,默認(rèn)為Unicode編碼
    scrapy crawl zhilian -o zhilian.json
  • json lines格式,默認(rèn)為Unicode編碼
    scrapy crawl zhilian -o zhilian.jsonl
  • csv 逗號(hào)表達(dá)式,可用Excel打開(kāi)
    scrapy crawl zhilian -o zhilian.csv
  • xml格式
    scrapy crawl zhilian -o zhilian.xml

注意:
Python2.x默認(rèn)編碼環(huán)境是ASCII,當(dāng)和取回的數(shù)據(jù)編碼格式不一致時(shí),可能會(huì)造成亂碼;

    # 可以指定保存內(nèi)容的編碼格式,一般情況下,添加:
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")

    # 這三行代碼是Python2.x里解決中文編碼的萬(wàn)能鑰匙,  
    # Python3學(xué)乖了,默認(rèn)編碼是Unicode了...
  • 數(shù)據(jù)庫(kù)存儲(chǔ)
    不在使用 job_items = [] 存儲(chǔ)數(shù)據(jù)
    直接將獲取封裝的數(shù)據(jù)item交給pipelines
       #將原來(lái)的添加到列表替換
       job_items.append(item)   #刪除這個(gè)換為yield
       yield item
    

當(dāng)Item在Spider中被收集之后,它將會(huì)被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。
pipelines.py文件

    # 導(dǎo)入數(shù)據(jù)庫(kù)引擎對(duì)象
    from sqlalchemy import create_engine
    # 導(dǎo)入會(huì)話構(gòu)建對(duì)象
    from sqlalchemy.orm import sessionmaker
    # 替換mysqldb模塊
    import pymysql
    pymysql.install_as_MySQLdb()

    class MyspiderPipeline(object):
        def process_item(self, item, spider):
            return item
    #自定義的Pipeline處理模塊
    class ZhilianPipeline(object):
        '''
        處理智聯(lián)招聘數(shù)據(jù)的pipeline,負(fù)責(zé)最終的數(shù)據(jù)驗(yàn)證和數(shù)據(jù)存儲(chǔ)
        '''
        def __init__(self):
            #初始化對(duì)象數(shù)據(jù):可以用于初始化資源
                #如:打開(kāi)文件、打開(kāi)數(shù)據(jù)庫(kù)連接等等操作
            self.engine = create_engine("mysql://數(shù)據(jù)庫(kù)連接?charset=utf8")
            Session = sessionmaker(bind=self.engine)
            self.session = Session()

        def open_spider(self, spider):
            #爬蟲(chóng)開(kāi)啟時(shí)需要調(diào)用的函數(shù),經(jīng)常用于數(shù)據(jù)初始化
            pass

        def close_spider(self, spider):
            '''
            爬蟲(chóng)程序關(guān)閉時(shí)自動(dòng)調(diào)用的函數(shù)
            經(jīng)常用于做一些資源回收的工作,如:關(guān)閉和數(shù)據(jù)庫(kù)的會(huì)話連接
            '''
             # 提交數(shù)據(jù),斷開(kāi)連接
            self.session.commit()
            self.session.close()

        def process_item(self, item, spider):
            '''
            該函數(shù)會(huì)在爬蟲(chóng)采集并封裝好Item對(duì)象時(shí)自動(dòng)調(diào)用
            函數(shù)中針對(duì)item數(shù)據(jù)進(jìn)行驗(yàn)證和存儲(chǔ)
            '''
            print ">>>>>>>>>zhilian pipelines invoking......."
            # 定義sql語(yǔ)句
            sql = "insert into job(job, company, salary) values('%s', '%s', '%s')"\
                % (item['job'], item['company'], item['salary'])
            # 執(zhí)行sql語(yǔ)句
            self.session.execute(sql)

settings.py文件

    #更改初始設(shè)置,將我們自己定義的添加到設(shè)置里
    ITEM_PIPELINES = {
        #'mySpider.pipelines.SomePipeline': 300,
        "mySpider.pipelines.ZhilianPipeline":300,
    }

只需啟動(dòng)爬蟲(chóng) scrapy crawl zhilain 即可在數(shù)據(jù)庫(kù)查看獲取數(shù)據(jù)。

樣圖:

1.png
最后編輯于
?著作權(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)容