轉載自: 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) #傳回标簽對象

循環擷取到每個li标簽裡的子标簽,以及各種屬性或者文本
# -*- 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) #傳回類容清單
将擷取到的圖檔下載下傳到本地
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儲存路徑
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)