W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
scrapy.Spider
scrapy.spiders.
Spider
這是最簡單的蜘蛛,也是每個蜘蛛都必須繼承的蜘蛛(包括與碎屑捆綁在一起的蜘蛛,還有你自己寫的蜘蛛)。它不提供任何特殊功能。它只是提供了一個默認(rèn)值 ?start_requests()
? 從發(fā)送請求的實現(xiàn) ?start_urls
? spider屬性并調(diào)用spider的方法 parse
對于每個結(jié)果響應(yīng)。
name
定義此蜘蛛名稱的字符串。spider名稱是scrappy定位(和實例化)spider的方式,因此它必須是唯一的。但是,沒有什么可以阻止您實例化同一個蜘蛛的多個實例。這是最重要的蜘蛛屬性,也是必需的。
如果蜘蛛 爬取 一個域,通常的做法是在域后命名蜘蛛,無論有沒有 TLD . 例如,一只爬行的蜘蛛 mywebsite.com
經(jīng)常被稱為 mywebsite
.
allowed_domains
包含允許此蜘蛛爬行的域的字符串的可選列表。對于不屬于此列表(或其子域)中指定的域名的URL請求,如果 ?OffsiteMiddleware
? 啟用。
假設(shè)您的目標(biāo)URL是 https://www.example.com/1.html
然后添加 'example.com'
列在名單上。
start_urls
當(dāng)沒有指定特定的URL時,蜘蛛將從中開始爬行的URL列表。所以,下載的第一頁將是這里列出的那些。隨后 ?Request
? 將從包含在起始URL中的數(shù)據(jù)依次生成。
custom_settings
運(yùn)行此spider時,將從項目范圍配置中重寫的設(shè)置字典。它必須被定義為類屬性,因為在實例化之前更新了設(shè)置。
有關(guān)可用內(nèi)置設(shè)置的列表,請參閱: 內(nèi)置設(shè)置參考 .
crawler
此屬性由 ?from_crawler()
? 初始化類后的類方法,并鏈接到 ?Crawler
? 此蜘蛛實例綁定到的對象。
Crawler封裝了項目中的許多組件,用于它們的單入口訪問(例如擴(kuò)展、中間件、信號管理器等)。見 爬蟲API 了解更多。
settings
用于運(yùn)行此蜘蛛的配置。這是一個 ?Settings
? 實例,請參見 設(shè)置 有關(guān)此主題的詳細(xì)介紹。
logger
用蜘蛛創(chuàng)建的python記錄器 name
. 您可以使用它通過它發(fā)送日志消息,如中所述 從蜘蛛記錄 .
from_crawler
(crawler, *args, **kwargs)這是Scrapy用來創(chuàng)建蜘蛛的類方法。
您可能不需要直接重寫它,因為默認(rèn)實現(xiàn)充當(dāng) __init__()
方法,使用給定參數(shù)調(diào)用它 args
和命名參數(shù) kwargs
.
盡管如此,此方法設(shè)置了 ?crawler
? 和 ?settings
? 新實例中的屬性,以便稍后在蜘蛛代碼中訪問它們。
start_requests
()此方法必須返回一個iterable,其中包含對此spider進(jìn)行爬網(wǎng)的第一個請求。當(dāng)蜘蛛被打開爬取的時候,它被稱為 Scrapy。Scrapy只調(diào)用一次,因此可以安全地實現(xiàn) ?start_requests()
? 作為發(fā)電機(jī)。
默認(rèn)實現(xiàn)生成 Request(url, dont_filter=True)
對于每個URL ?start_urls
? .
如果要更改用于開始抓取域的請求,這是要重寫的方法。例如,如果您需要從使用POST請求登錄開始,可以執(zhí)行以下操作:
class MySpider(scrapy.Spider):
name = 'myspider'
def start_requests(self):
return [scrapy.FormRequest("http://www.example.com/login",
formdata={'user': 'john', 'pass': 'secret'},
callback=self.logged_in)]
def logged_in(self, response):
# here you would extract links to follow and return Requests for
# each of them, with another callback
pass
我們來看一個例子:
import scrapy
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]
def parse(self, response):
self.logger.info('A response from %s just arrived!', response.url)
從單個回調(diào)返回多個請求和項目:
import scrapy
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]
def parse(self, response):
for h3 in response.xpath('//h3').getall():
yield {"title": h3}
for href in response.xpath('//a/@href').getall():
yield scrapy.Request(response.urljoin(href), self.parse)
而不是 ?start_urls
? 你可以用 ?start_requests()
? 直接;給數(shù)據(jù)更多的結(jié)構(gòu),你可以使用 ?Item
? 物體::
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
def start_requests(self):
yield scrapy.Request('http://www.example.com/1.html', self.parse)
yield scrapy.Request('http://www.example.com/2.html', self.parse)
yield scrapy.Request('http://www.example.com/3.html', self.parse)
def parse(self, response):
for h3 in response.xpath('//h3').getall():
yield MyItem(title=h3)
for href in response.xpath('//a/@href').getall():
yield scrapy.Request(response.urljoin(href), self.parse)
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: