• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Python進階之Scrapy框架入門

    標簽: Python進階  PYTHON爬蟲  python

    1. Scrapy入門

    1.1 什么是Scrapy

    • Scrapy是一個適用爬取網站數據、提取結構性數據的應用程序框架,它可以應用在廣泛領域:Scrapy 常應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。通常我們可以很簡單的通過 Scrapy 框架實現一個爬蟲,抓取指定網站的內容或圖片。
    • Scrapy使用了Twisted異步網絡框架,可以大大提高數據抓取的效率
      Twisted異步框架
      • 異步:調用在發出之后,這個調用就直接返回,不管有無結果
      • 非阻塞:關注的是程序在等待調用結果時的狀態,指在不能立刻得到結果之前,該調用不會阻塞當前線程
      • 異步過程使得程序充分利用了阻塞等待的時間,使得程序在同樣的時間可以干更多的事情,從而提高了執行效率

    1.2 Scrapy架構

    • 一個標準的Scrapy架構由Scrapy Engine(引擎),Scheduler(調度器),Downloader(下載器),Spider(爬蟲),Item Pipeline(管道),Downloader Middlewares(下載中間件),Spider Middlewares(Spider中間件)組成,如下圖:
      Scrapy框架

    • Scrapy Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

    • Scheduler(調度器):它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

    • Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理。

    • Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)。

    • Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析、過濾、存儲等)的地方。

    • Downloader Middlewares(下載中間件):一個可以自定義擴展下載功能的組件。

    • Spider Middlewares(Spider中間件):一個可以自定擴展和操作引擎和Spider中間通信的功能組件。

    1.3 安裝Scrapy

    2. Scrapy項目初探

    2.1 創建一個Scrapy項目

    • 創建Scrapy項目,startproject后的項目名稱可以按照需要指定

      scrapy startproject mySpider 
      

      運行后提示:
      You can start your first spider with:
      cd mySpider
      scrapy genspider example example.com

    • 創建爬蟲,命令行運行cd mySpider進入爬蟲目錄后

      scrapy genspider demo "demo.cn"
      
      • demo為爬蟲項目名稱,在”./mySpider/spiders/“目錄生成一個名為demo.py的文件
      • "demo.cn"為需要爬取的網站域名

      運行后提示:
      Created spider ‘demo’ using template ‘basic’ in module:
      mySpider.spiders.demo

    • 完善數據,完善爬蟲項目數據,把爬蟲代碼添加到demo.py中

    • 保存數據,修改pipelines.py,把數據保存的代碼添加到文件中

      • 1 可能會有多個spider,不同的pipeline處理不同的item的內容
      • 2 一個spider的內容可以要做不同的操作,比如存入不同的數據庫中
        注意
        • pipeline的權重越小優先級越高
        • pipeline中process_item方法名不能修改為其他的名稱

    2.2 運行爬蟲

    • 在命令中運行爬蟲, # xxx是爬蟲的名字,與爬蟲項目名保持一致

      scrapy crawl XXX
      
    • 在pycharm中運行爬蟲,

      from scrapy import cmdline
      
      cmdline.execute("scrapy crawl xxx".split())
      

    3. Scrapy抓取豆瓣數據實例

    • 通過一個抓取豆瓣的scrapy項目,簡單介紹scrapy項目的開發邏輯

    3.1 創建項目和爬蟲

    • 創建scrapy項目

    scrapy startproject spider

    • 進入項目目錄

    cd spider

    • 創建爬蟲項目

    scrapy genspider douban “douban.com”

    3.2 douban.py

    • 注意:
    • parse中的response是一個可以使用xpath的對象,可以直接獲取html數據
    • 利用Scrapy里邊的extract_first()或get()取數據
      - get()獲取有標簽的數據
      - extract_first()獲取文本數據,注意加(),否則會輸出錯誤數據
      - bound method SelectorList.get of
    • 抓取結果保存成字典方便引用和保存
    • 返回數據用生成器形式yield返回,盡量不用return.這樣可以節省內存資源
    import scrapy
    # from scrapy.http.response.html import HtmlResponse
    
    class DoubanSpider(scrapy.Spider):
        name = 'douban'
        # 允許的域名范圍,不需要加協議名
        allowed_domains = ['douban.com']
        # 可以修改
        start_urls = ['http://douban.com/']
    
        def parse(self, response):
    
            # print('-' * 50)
            # print(response)
            # print(type(response))
            # print('-' * 50)
            # response狀態碼200,說明已經抓到了html
            li_list = response.xpath('//div[@class="side-links nav-anon"]/ul//li')
            # 定義字典收集數據
            item = {}
            for li in li_list:
    
                # 利用Scrapy里邊的extract_first()和get()取數據
                # get()獲取有標簽的數據
                # extract_first()獲取文本數據,注意加(),否則會輸出錯
                # bound method SelectorList.get of
    
                # 發現輸出缺少購書單,購書單在em標簽下
                item['name'] = li.xpath('a/em/text()').extract_first()
                # 增加判斷,如果找不到則執行下邊的代碼
                if item['name'] == None:
                    # 其他標簽都在a標簽下
                    item['name'] = li.xpath('a/text()').extract_first()
                # print(item)
                # 用yield生成器返回數據,節省內存資源
                yield item
            # print(li_list)
    
    

    3.3 settings.py

    • 注意:
    • 設定LOG-LEVEL可以簡化日志輸出內容,調試時更為方便
    • 設定DEFAULT_REQUEST_HEADERS請求頭
    • 根據實際需要確定ROBOTSTXT_OBEY = True是否要注釋掉
    • 使用pipeline的時候要在settings里把# Configure item pipelines下邊的ITEM_PIPELINES代碼打開
    BOT_NAME = 'spider'
    
    SPIDER_MODULES = ['spider.spiders']
    NEWSPIDER_MODULE = 'spider.spiders'
    # 日志輸出簡化
    LOG_LEVEL = 'WARNING'
    # Override the default request headers:
    DEFAULT_REQUEST_HEADERS = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3820.400 QQBrowser/10.6.4255.400',
      'Accept-Language': 'en',
    }
    # Obey robots.txt rules
    # 注釋掉了遵守robots協議
    # ROBOTSTXT_OBEY = True
    
    # Configure item pipelines
    # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
    ITEM_PIPELINES = {
       'spider.pipelines.SpiderPipeline': 300,
    }
    

    3.4 pipeline.py

    • 注意:
    • 使用pipeline的時候要在settings里把# Configure item pipelines下邊的ITEM_PIPELINES代碼打開
    # 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
    
    # 注意使用pipeline要在設置里邊打開ITEM_PIPELINES setting
    class SpiderPipeline:
        def process_item(self, item, spider):
            print(item)
            return item
    
    

    3.5 start.py

    • 可以通過windows命令行輸入scrapy crawl douban運行程序
    • 也可以調用scrapy中的cmdline.execute()創建python啟動程序,注意后邊有個.split()分隔
    # !/usr/bin/python
    # Filename: start.py
    # Data    : 2020/08/25
    # Author  : --king--
    # ctrl+alt+L自動加空格格式化
    
    from scrapy import cmdline
    
    # cmdline.execute(['scrapy','crawl','douban'])
    cmdline.execute('scrapy crawl douban'.split())
    
    
    版權聲明:本文為kingx3原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/kingx3/article/details/108222164

    智能推薦

    Python 爬蟲:Scrapy 框架入門初探【 Xpath 改寫】

    目錄 安裝 Scrapy 初試 Scrapy 第1步:創建項目 第2步:編寫代碼 第3步:運行爬蟲 第4步:保存數據 結果展示 Scrapy 是一種用于抓取網站和提取結構化數據的應用程序框架,可用于廣泛的有用應用程序,如數據挖掘、信息處理或歷史存檔等。 安裝 Scrapy 從 PyPI 安裝: 使用 Anaconda 或 Miniconda 安裝: 安裝后可在命令行查看是否成功: 初試 Scrap...

    python——爬蟲學習——Scrapy爬蟲框架入門-(6)

    Scrapy,Python開發的一個快速,高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結構化的數據。Scrapy用途廣泛,可以用于數據挖掘、監測和自動化測試。 一、”5+2”結構 1.Engine(引擎) 不需要用戶修改 2.Downloader(下載器) 不需要用戶修改 3.Scheduler(調度器) 不需要用戶修改 4.Downloader Mi...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡