爬蟲之scrapy入門

1.介紹

Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 其能夠應用在數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
其最初是爲了頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。python

Scrapy 使用了 Twisted異步網絡庫來處理網絡通信。總體架構大體以下網絡

Scrapy主要包括瞭如下組件:架構

  • 引擎(Scrapy)
    用來處理整個系統的數據流處理, 觸發事務(框架核心)
  • 調度器(Scheduler)
    用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL(抓取網頁的網址或者說是連接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
  • 下載器(Downloader)
    用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是創建在twisted這個高效的異步模型上的)
  • 爬蟲(Spiders)
    爬蟲是主要幹活的, 用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。用戶也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面
  • 項目管道(Pipeline)
    負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。
  • 下載器中間件(Downloader Middlewares)
    位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares)
    介於Scrapy引擎和爬蟲之間的框架,主要工做是處理蜘蛛的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middewares)
    介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

Scrapy運行流程大概以下:併發

    1. 引擎從調度器中取出一個連接(URL)用於接下來的抓取
    2. 引擎把URL封裝成一個請求(Request)傳給下載器
    3. 下載器把資源下載下來,並封裝成應答包(Response)
    4. 爬蟲解析Response
    5. 解析出實體(Item),則交給實體管道進行進一步的處理
    6. 解析出的是連接(URL),則把URL交給調度器等待抓取

 

2.下載

 1 Linux
 2       pip3 install scrapy
 3  
 4  
 5 Windows
 6       a. pip3 install wheel
 7       b. 下載twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
 8       c. 進入下載目錄,執行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
 9       d.pyOpenSSL  https://pypi.python.org/pypi/pyOpenSSL#downloads
10       d. 下載並安裝pywin32:https://sourceforge.net/projects/pywin32/files/
11       e. pip3 install scrapy

 

3.基礎使用

 1 1. scrapy startproject 項目名稱
 2    - 在當前目錄中建立中建立一個項目文件(相似於Django)
 3  
 4 2. scrapy genspider [-t template] <name> <domain>
 5    - 建立爬蟲應用
 6    如:
 7       scrapy gensipider -t basic oldboy oldboy.com
 8       scrapy gensipider -t xmlfeed autohome autohome.com.cn
 9    PS:
10       查看全部命令:scrapy gensipider -l
11       查看模板命令:scrapy gensipider -d 模板名稱
12  
13 3. scrapy list
14    - 展現爬蟲應用列表
15  
16 4. scrapy crawl 爬蟲應用名稱
17    - 運行單獨爬蟲應用

項目結構框架

 1 project_name/
 2    scrapy.cfg
 3    project_name/
 4        __init__.py
 5        items.py
 6        pipelines.py
 7        settings.py
 8        spiders/
 9            __init__.py
10            spider1.py
11            spider2.py
12            spider3.py

♢   scrapy.cfg  項目的主配置信息。(真正爬蟲相關的配置信息在settings.py文件中)dom

♢   items.py    設置數據存儲模板,用於結構化數據,如:Django的Model異步

♢   pipelines    數據處理行爲,如:通常結構化的數據持久化scrapy

♢   settings.py 配置文件,如:遞歸的層數、併發數,延遲下載等ide

♢   spiders      爬蟲目錄,如:建立文件,編寫爬蟲規則測試

 

4.小試牛刀例子

 1 import scrapy
 2 from scrapy.selector import Selector
 3 from test1.items import Test1Item
 4 
 5 
 6 class XiaohuaSpider(scrapy.Spider):
 7     name = 'xiaohua'
 8     allowed_domains = ['xiaohuar.com']
 9     start_urls = ['http://www.xiaohuar.com/hua/']
10 
11     def parse(self, response):
12         xph = Selector(response=response).xpath('//div[@id="list_img"]//div[@class="item_t"]')
13         for i in xph:
14             item = Test1Item()
15             item['img_url'] = i.xpath('./div[@class="img"]/a/img/@src').extract_first()
16             item['name'] = i.xpath('./div[@class="img"]/a/img/@alt').extract_first()
17             yield item
18         next = Selector(response=response).xpath('//div[@id="page"]//a[17]/@href').extract_first()
19         if next:
20             yield scrapy.Request(url=next, callback=self.parse)
spider.py/xiaohua.py
import os,requests


class Test1Pipeline(object):

    def process_item(self, item, spider):
        if item['img_url'][0] == '/':
            item['img_url'] = 'http://www.xiaohuar.com/' + item['img_url']
        filename = os.path.join('xiaohua', item['name']) + '.png'
        img = requests.get(item['img_url'])
        if img.status_code == 200:
            if os.path.exists('xiaohua'):
                pass
            else:
                os.mkdir('xiaohua')
            with open(filename, 'wb')as f:
                f.write(img.content)
        else:
            print('保存失敗')
pipelines.py
import scrapy


class Test1Item(scrapy.Item):
    
    img_url = scrapy.Field()
    name = scrapy.Field()
item.py
相關文章
相關標籤/搜索