1. 程式人生 > >scrapy初探之爬取武sir首頁博客

scrapy初探之爬取武sir首頁博客

scrapy

一、爬蟲

網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人,在FOAF社區中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。
另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。

二、scrapy框架

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

Scrapy 使用了 Twisted異步網絡庫來處理網絡通訊。整體架構大致如下

技術分享圖片

Scrapy主要包括了以下組件:
1、引擎(Scrapy)
用來處理整個系統的數據流處理, 觸發事務(框架核心)
2、調度器(Scheduler)
用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什麽, 同時去除重復的網址
3、下載器(Downloader)
用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
4、爬蟲(Spiders)
爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面

5、項目管道(Pipeline)
負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
6、下載器中間件(Downloader Middlewares)
位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
7、 爬蟲中間件(Spider Middlewares)
介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
8、調度中間件(Scheduler Middewares)
介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

Scrapy運行流程大概如下:

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

三、scrapy實例

1、安裝
在windows平臺安裝需要pywin32或64 的支持
Anaconda:一個python的大集合包,可安裝爬蟲相關的包
Anaconda下載地址:
http://continuum.io/downloads

安裝過程中直接安裝vscode,自行加入環境變量中
安裝Scrapy:conda install scrapy
2、實例
1.創建項目(命令行cd至項目目錄)
scrapy startproject cnblog
2.自動創建目錄:

    cnblog/
       scrapy.cfg
       cnblog/
           __init__.py
           items.py
           pipelines.py
           settings.py
           spiders/
               __init__.py
文件說明:
    ○ scrapy.cfg ?項目的配置信息,主要為Scrapy命令行工具提供一個基礎的配置信息。(真正爬蟲相關的配置信息在settings.py文件中)
    ○ items.py ? ?設置數據存儲模板,用於結構化數據,如:Django的Model
    ○ pipelines ? ?數據處理行為,如:一般結構化的數據持久化
    ○ settings.py 配置文件,如:遞歸的層數、並發數,延遲下載等
    ○ spiders ? ? ?爬蟲目錄,如:創建文件,編寫爬蟲規則
註意:一般創建爬蟲文件時,以網站域名命名

3.定義要爬取的字段(item.py)

import scrapy

class CnblogItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()

    #博客名
    name = scrapy.Field()
    #博客鏈接
    data = scrapy.Field()
    #博客日期
    time = scrapy.Field()

4.寫爬蟲

在spiders目錄下創建cnblog.py文件

import scrapy
from cnblog.items import CnblogItem

class CNBlogSpidle(scrapy.Spider):
    # 這是爬蟲的名字,全局唯一
    name = "cnblog"

    # 這是爬蟲開始幹活的地址,必須是一個可叠代對象
    start_urls = [‘http://www.cnblogs.com/wupeiqi/‘]

    # 爬蟲收到上面的地址後,就會發送requests請求,在收到服務器返回的內容後,就將內容傳遞給parse函數。在這裏我們重寫函數,達到我們想要的功能
    def parse(self, response):
        for line in response.xpath(‘//div[@class="day"]‘): #篩選首頁中的博客
            item = CnblogItem()
            item[‘name‘] = line.xpath(‘.//div[@class="postTitle"]/a/text()‘).extract()  #獲取博客名
            item[‘data‘] = line.xpath(‘.//a/@href‘).extract()[1]  #獲取url
            item[‘time‘] = line.xpath(‘.//div[@class="dayTitle"]/a/text()‘).extract() #獲取日期

            yield item      #將item返回

Scrapy中Response可以直接使用Xpath來解析數據,更多Xpath語法詳見:http://www.w3school.com.cn/xpath/xpath_syntax.asp
篩選規則需要通過分析html寫出。

5.處理爬蟲返回的數據(pipelines.py)

import os
import urllib.request

class CnblogPipeline(object):

    def process_item(self, item, spider):     
        #用request模塊獲取爬來的地址的博客
        html = urllib.request.urlopen(item[‘data‘]).read()
        #文件名拼接(item對象為列表形式,取出其字符串)
        file_name = os.path.join(‘D:\\Temp‘,item[‘name‘][0]+‘.html‘)
        #保存博客(爬取的內容為二進制,wb寫入)
        with open(file_name,‘wb‘) as f:
            f.write(html)

6.配置文件(settiings.py)

BOT_NAME = ‘cnblog‘

SPIDER_MODULES = [‘cnblog.spiders‘]
NEWSPIDER_MODULE = ‘cnblog.spiders‘

# 設置請求頭部
DEFAULT_REQUEST_HEADERS = {
    "User-Agent" : "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
    ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘
}
# 不檢測robots.txt文件(因為Scrapy遵循了robots規則,如果你想要獲取的頁面在robots中被禁止了,Scrapy是會忽略掉)
ROBOTSTXT_OBEY = False
# Configure item pipelines
# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    ‘cnblog.pipelines.CnblogPipeline‘: 300,
}

7.執行爬蟲

C:\Users\LENOVO\PycharmProjects\fullstack>cd cnblog
C:\Users\LENOVO\PycharmProjects\fullstack\cnblog>scrapy crawl cnblog --nolog

8.結果輸出
技術分享圖片

scrapy初探之爬取武sir首頁博客