天天看點

4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽

轉載自: https://www.jianshu.com/p/8f22cace85c7

标簽選擇器對象

HtmlXPathSelector()建立标簽選擇器對象,參數接收response回調的html對象

需要導入子產品:from scrapy.selector import HtmlXPathSelector

select()标簽選擇器方法,是HtmlXPathSelector裡的一個方法,參數接收選擇器規則,傳回清單元素是一個标簽對象

extract()擷取到選擇器過濾後的内容,傳回清單元素是内容

選擇器規則

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

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

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

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

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

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

擷取指定的标簽對象

# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from urllib import request                     #導入request子產品
import os

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)               #建立HtmlXPathSelector對象,将頁面傳回對象傳進去

        items = hxs.select('//div[@class="showlist"]/li')  #标簽選擇器,表示擷取所有class等于showlist的div,下面的li标簽
        print(items)                                       #傳回标簽對象           
4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽
4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽

循環擷取到每個li标簽裡的子标簽,以及各種屬性或者文本

4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽
# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from urllib import request                     #導入request子產品
import os

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)               #建立HtmlXPathSelector對象,将頁面傳回對象傳進去

        items = hxs.select('//div[@class="showlist"]/li')  #标簽選擇器,表示擷取所有class等于showlist的div,下面的li标簽
        # print(items)                                     #傳回标簽對象
        for i in range(len(items)):                        #根據li标簽的長度循環次數
            title = hxs.select('//div[@class="showlist"]/li[%d]//img/@alt' % i).extract()   #根據循環的次數作為下标擷取到目前li标簽,下的img标簽的alt屬性内容
            src = hxs.select('//div[@class="showlist"]/li[%d]//img/@src' % i).extract()     #根據循環的次數作為下标擷取到目前li标簽,下的img标簽的src屬性内容
            if title and src:
                print(title,src)  #傳回類容清單           
4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽

将擷取到的圖檔下載下傳到本地

urlretrieve()将檔案儲存到本地,參數1要儲存檔案的src,參數2儲存路徑

urlretrieve是urllib下request子產品的一個方法,需要導入from urllib import request

# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from urllib import request                     #導入request子產品
import os

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        hxs = HtmlXPathSelector(response)               #建立HtmlXPathSelector對象,将頁面傳回對象傳進去

        items = hxs.select('//div[@class="showlist"]/li')  #标簽選擇器,表示擷取所有class等于showlist的div,下面的li标簽
        # print(items)                                     #傳回标簽對象
        for i in range(len(items)):                        #根據li标簽的長度循環次數
            title = hxs.select('//div[@class="showlist"]/li[%d]//img/@alt' % i).extract()   #根據循環的次數作為下标擷取到目前li标簽,下的img标簽的alt屬性内容
            src = hxs.select('//div[@class="showlist"]/li[%d]//img/@src' % i).extract()     #根據循環的次數作為下标擷取到目前li标簽,下的img标簽的src屬性内容
            if title and src:
                # print(title[0],src[0])                                                    #通過下标擷取到字元串内容
                file_path = os.path.join(os.getcwd() + '/img/', title[0] + '.jpg')          #拼接圖檔儲存路徑
                request.urlretrieve(src[0], file_path)                          #将圖檔儲存到本地,參數1擷取到的src,參數2儲存路徑           
4、web爬蟲,scrapy子產品标簽選擇器下載下傳圖檔,以及正則比對标簽

xpath()标簽選擇器,是Selector類裡的一個方法,參數是選擇規則【推薦】

選擇器規則同上

selector()建立選擇器類,需要接受html對象

需要導入:from scrapy.selector import Selector

# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from scrapy.selector import Selector

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        items = Selector(response=response).xpath('//div[@class="showlist"]/li').extract()
        # print(items)                                     #傳回标簽對象
        for i in range(len(items)):
            title = Selector(response=response).xpath('//div[@class="showlist"]/li[%d]//img/@alt' % i).extract()
            src = Selector(response=response).xpath('//div[@class="showlist"]/li[%d]//img/@src' % i).extract()
            print(title,src)           

正規表達式的應用

正規表達式是彌補,選擇器規則無法滿足過濾情況時使用的,

分為兩種正則使用方式

  1、将選擇器規則過濾出來的結果進行正則比對

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

1、将選擇器規則過濾出來的結果進行正則比對,用正則取最終内容

最後.re('正則')

# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from scrapy.selector import Selector

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        items = Selector(response=response).xpath('//div[@class="showlist"]/li//img')[0].extract()
        print(items)                                     #傳回标簽對象
        items2 = Selector(response=response).xpath('//div[@class="showlist"]/li//img')[0].re('alt="(\w+)')
        print(items2)

# <img src="http://www.shaimn.com/uploads/170724/1-1FH4221056141.jpg" alt="人體藝術mmSunny前凸後翹性感誘惑寫真">
# ['人體藝術mmSunny前凸後翹性感誘惑寫真']           

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

[re:正則規則]

# -*- coding: utf-8 -*-
import scrapy       #導入爬蟲子產品
from scrapy.selector import HtmlXPathSelector  #導入HtmlXPathSelector子產品
from scrapy.selector import Selector

class AdcSpider(scrapy.Spider):
    name = 'adc'                                        #設定爬蟲名稱
    allowed_domains = ['www.shaimn.com']
    start_urls = ['http://www.shaimn.com/xinggan/']

    def parse(self, response):
        items = Selector(response=response).xpath('//div').extract()
        # print(items)                                     #傳回标簽對象
        items2 = Selector(response=response).xpath('//div[re:test(@class, "showlist")]').extract()  #正則找到div的class等于showlist的元素
        print(items2)           

繼續閱讀