天天看點

11、web爬蟲講解2—Scrapy架構爬蟲—Scrapy使用

xpath表達式

  //x 表示向下查找n層指定标簽,如://div 表示查找所有div标簽

  /x 表示向下查找一層指定的标簽

  /@x 表示查找指定屬性的值,可以連綴如:@id @src

  [@屬性名稱="屬性值"]表示查找指定屬性等于指定值的标簽,可以連綴 ,如查找class名稱等于指定名稱的标簽 

  /text() 擷取标簽文本類容

  [x] 通過索引擷取集合裡的指定一個元素

1、将xpath表達式過濾出來的結果進行正則比對,用正則取最終内容

最後.re('正則')

xpath('//div[@class="showlist"]/li//img')[0].re('alt="(\w+)')           

2、在選擇器規則裡應用正則進行過濾

[re:正則規則]

xpath('//div[re:test(@class, "showlist")]').extract()           

實戰使用Scrapy擷取一個電商網站的、商品标題、商品連結、和評論數

11、web爬蟲講解2—Scrapy架構爬蟲—Scrapy使用

分析源碼

11、web爬蟲講解2—Scrapy架構爬蟲—Scrapy使用

第一步、編寫items.py容器檔案

我們已經知道了我們要擷取的是、商品标題、商品連結、和評論數

在items.py建立容器接收爬蟲擷取到的資料

設定爬蟲擷取到的資訊容器類,必須繼承scrapy.Item類

scrapy.Field()方法,定義變量用scrapy.Field()方法接收爬蟲指定字段的資訊

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

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

#items.py,檔案是專門用于,接收爬蟲擷取到的資料資訊的,就相當于是容器檔案

class AdcItem(scrapy.Item):    #設定爬蟲擷取到的資訊容器類
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()      #接收爬蟲擷取到的title資訊
    link = scrapy.Field()       #接收爬蟲擷取到的連接配接資訊
    comment = scrapy.Field()    #接收爬蟲擷取到的商品評論數           

第二步、編寫pach.py爬蟲檔案

定義爬蟲類,必須繼承scrapy.Spider

name設定爬蟲名稱

allowed_domains設定爬取域名

start_urls設定爬取網址

parse(response)爬蟲回調函數,接收response,response裡是擷取到的html資料對象

xpath()過濾器,參數是xpath表達式

extract()擷取html資料對象裡的資料

yield item 接收了資料的容器對象,傳回給pipelies.py

# -*- coding: utf-8 -*-
import scrapy
from adc.items import AdcItem  #導入items.py裡的AdcItem類,容器類

class PachSpider(scrapy.Spider):                 #定義爬蟲類,必須繼承scrapy.Spider
    name = 'pach'                                #設定爬蟲名稱
    allowed_domains = ['search.dangdang.com']    #爬取域名
    start_urls = ['http://category.dangdang.com/pg1-cid4008149.html']     #爬取網址

    def parse(self, response):                   #parse回調函數
        item = AdcItem()                         #執行個體化容器對象
        item['title'] = response.xpath('//p[@class="name"]/a/text()').extract()  #表達式過濾擷取到資料指派給,容器類裡的title變量
        # print(rqi['title'])
        item['link'] = response.xpath('//p[@class="name"]/a/@href').extract()    #表達式過濾擷取到資料指派給,容器類裡的link變量
        # print(rqi['link'])
        item['comment'] = response.xpath('//p[@class="star"]//a/text()').extract() #表達式過濾擷取到資料指派給,容器類裡的comment變量
        # print(rqi['comment'])
        yield item   #接收了資料的容器對象,傳回給pipelies.py           

robots協定

注意:如果擷取的網站在robots.txt檔案裡設定了,禁止爬蟲爬取協定,那麼将無法爬取,因為scrapy預設是遵守這個robots這個國際協定的,如果想不遵守這個協定,需要在settings.py設定

到settings.py檔案裡找到ROBOTSTXT_OBEY變量,這個變量等于False不遵守robots協定,等于True遵守robots協定

# Obey robots.txt rules
ROBOTSTXT_OBEY = False   #不遵循robots協定           

第三步、編寫pipelines.py資料處理檔案

如果需要pipelines.py裡的資料處理類能工作,需在settings.py設定檔案裡的ITEM_PIPELINES變量裡注冊資料處理類

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'adc.pipelines.AdcPipeline': 300,  #注冊adc.pipelines.AdcPipeline類,後面一個數字參數表示執行等級,數值越大越先執行
}           

注冊後pipelines.py裡的資料處理類就能工作

定義資料處理類,必須繼承object

process_item(item)為資料處理函數,接收一個item,item裡就是爬蟲最後yield item 來的資料對象

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

class AdcPipeline(object):                      #定義資料處理類,必須繼承object
    def process_item(self, item, spider):       #process_item(item)為資料處理函數,接收一個item,item裡就是爬蟲最後yield item 來的資料對象
        for i in range(0,len(item['title'])):   #可以通過item['容器名稱']來擷取對應的資料清單
            title = item['title'][i]
            print(title)
            link = item['link'][i]
            print(link)
            comment = item['comment'][i]
            print(comment)
        return item           

最後執行

執行爬蟲檔案,scrapy crawl pach --nolog

11、web爬蟲講解2—Scrapy架構爬蟲—Scrapy使用

可以看到我們需要的資料已經拿到了

【轉載自:

http://www.lqkweb.com