23、 Python快速開發分佈式搜索引擎Scrapy精講—craw scrapy item loader機制

百度雲搜索,搜各種資料:http://www.bdyss.cn

搜網盤,搜各種資料:http://www.swpan.cn

用命令創建自動爬蟲文件

創建爬蟲文件是根據scrapy的母版來創建爬蟲文件的

scrapy genspider -l  查看scrapy創建爬蟲文件可用的母版

Available templates:母版說明
  basic        創建基礎爬蟲文件

  crawl        創建自動爬蟲文件
  csvfeed        創建爬取csv數據爬蟲文件

  xmlfeed     創建爬取xml數據爬蟲文件

創建一個基礎母版爬蟲,其他同理

scrapy genspider  -t  母版名稱  爬蟲文件名稱  要爬取的域名 創建一個基礎母版爬蟲,其他同理
如:scrapy genspider -t crawl lagou www.lagou.com

第一步,配置items.py接收數據字段

default_output_processor = TakeFirst()默認利用ItemLoader類,加載items容器類填充數據,是列表類型,可以通過TakeFirst()方法,獲取到列表裏的內容

input_processor = MapCompose(預處理函數)設置數據字段的預處理函數,可以是多個函數

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
#items.py,文件是專門用於,接收爬蟲獲取到的數據信息的,就相當於是容器文件

import scrapy
from scrapy.loader.processors import MapCompose,TakeFirst
from scrapy.loader import ItemLoader                #導入ItemLoader類也就加載items容器類填充數據

class LagouItemLoader(ItemLoader):                  #自定義Loader繼承ItemLoader類,在爬蟲頁面調用這個類填充數據到Item類
    default_output_processor = TakeFirst()          #默認利用ItemLoader類,加載items容器類填充數據,是列表類型,可以通過TakeFirst()方法,獲取到列表裏的內容

def tianjia(value):                                 #自定義數據預處理函數
    return '叫賣錄音網'+value                        #將處理後的數據返給Item

class LagouItem(scrapy.Item):                       #設置爬蟲獲取到的信息容器類
    title = scrapy.Field(                           #接收爬蟲獲取到的title信息
        input_processor = MapCompose(tianjia),      #將數據預處理函數名稱傳入MapCompose方法裏處理,數據預處理函數的形式參數value會自動接收字段title
    )

第二步,編寫自動爬蟲與利用ItemLoader類加載items容器類填充數據

自動爬蟲
Rule()設置爬蟲規則
  參數:
  LinkExtractor()設置url規則
  callback='回調函數名稱'
  follow=True 表示在抓取頁面繼續深入

LinkExtractor()對爬蟲獲取到的url做規則判斷處理
  參數:
  allow= r'jobs/' 是一個正則表達式,表示符合這個url格式的,才提取
  deny= r'jobs/' 是一個正則表達式,表示符合這個url格式的,不提取拋棄掉,與allow相反
  allow_domains= www.lagou.com/ 表示這個域名下的連接才提取
  deny_domains= www.lagou.com/ 表示這個域名下的連接不提取拋棄
  restrict_xpaths= xpath表達式 表示可以用xpath表達式限定爬蟲只提取一個頁面指定區域的URL
  restrict_css= css選擇器,表示可以用css選擇器限定爬蟲只提取一個頁面指定區域的URL
  tags= 'a' 表示爬蟲通過a標籤去尋找url,默認已經設置,默認即可
  attrs= 'href' 表示獲取到a標籤的href屬性,默認已經設置,默認即可

    • *

 利用自定義Loader類繼承ItemLoader類,加載items容器類填充數據

*ItemLoader()實例化一個ItemLoader對象來加載items容器類,填充數據,如果是自定義Loader繼承的ItemLoader同樣的用法
  參數:
  第一個參數:要填充數據的items容器類注意加上括號,
  第二個參數:response*

ItemLoader對象下的方法:
  add_xpath('字段名稱','xpath表達式')方法,用xpath表達式獲取數據填充到指定字段
  add_css('字段名稱','css選擇器')方法,用css選擇器獲取數據填充到指定字段
  add_value('字段名稱',字符串內容)方法,將指定字符串數據填充到指定字段
  load_item()方法無參,將所有數據生成,load_item()方法被yield後數據被填充items容器指定類的各個字段

 爬蟲文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from adc.items import LagouItem,LagouItemLoader  #導入items容器類,和ItemLoader類

class LagouSpider(CrawlSpider):                     #創建爬蟲類
    name = 'lagou'                                  #爬蟲名稱
    allowed_domains = ['www.luyin.org']             #起始域名
    start_urls = ['http://www.luyin.org/']          #起始url

    rules = (
        #配置抓取列表頁規則
        Rule(LinkExtractor(allow=('ggwa/.*')), follow=True),

        #配置抓取內容頁規則
        Rule(LinkExtractor(allow=('post/\d+.html.*')), callback='parse_job', follow=True),
    )

    def parse_job(self, response):                  #回調函數,注意:因爲CrawlS模板的源碼創建了parse回調函數,所以切記我們不能創建parse名稱的函數
        #利用ItemLoader類,加載items容器類填充數據
        item_loader = LagouItemLoader(LagouItem(), response=response)
        item_loader.add_xpath('title','/html/head/title/text()')
        article_item = item_loader.load_item()

        yield article_item

items.py文件與爬蟲文件的原理圖

image
【轉載自:http://www.lqkweb.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章