日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Scrapy spiders介绍

發(fā)布時間:2023/12/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Scrapy spiders介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spider用于定義一個網(wǎng)站會被如何爬取以及解析。

一個Spider爬取的周期通常包括這幾步:

  • 由初始URLS發(fā)出Request,并指定回調(diào)函數(shù)來處理response

    The first requests to perform are obtained by calling the start_requests() method which (by default) generates Request for the URLs specified in the start_urls and the parse method as callback function for the Requests.

  • 在回調(diào)函數(shù)中處理response并返回含提取出來的數(shù)據(jù)的dicts、Item或Request。這些Request同樣會有回調(diào)函數(shù)并且會被下載然后由指定的回調(diào)函數(shù)處理
  • 回調(diào)函數(shù)解析頁面內(nèi)容,通常是用Selectors(也可以用BeatifulSoup,lxml等)方法解析
  • 將spider解析的數(shù)據(jù)存儲下來,如數(shù)據(jù)庫(使用Item Pipeline)或者文件(使用Feed exports)中。

雖說這幾步適用于所有的spider,但是基于不同的目的仍然有多種spider存在。

1. 所有Spider的基類:scrapy.Spider

class scrapy.spiders.Spider

最簡單的spider,是其它所有spider的基類。不提供任何特殊的功能,只提供了默認的`start_requests()`的實現(xiàn),用于從`start_urls`發(fā)出request并調(diào)用`parse`方法處理返回的response。 主要成員變量:
  • name spider名,同一個項目中的不同spider名字不能相同
  • allowed_domains 從爬取指定的域名
  • start_urls 起始URLS
  • custom_settings 自定義設(shè)置信息
  • crawler 指向綁定了當前spider的Crawler對象(links to the Crawler object to which this spider instance is bound)
  • settings 是Settings類的一個實例,含有spider的配置信息
  • logger 用name創(chuàng)建的logger,可以用來發(fā)送log信息

主要成員函數(shù):

  • from_crawler(crawler,*args,**kwargs) scrapy用來創(chuàng)建spider的函數(shù)
  • statr_requests() 若沒有指定URLS,調(diào)用star_requests;若指定了,調(diào)用make_requests_from_urls()來發(fā)出request。
    如果你想要改變發(fā)送請求的方式,可以覆蓋這個方法。例如,你想要用POST方式發(fā)請求:

    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 callbackpass
  • make requests_from_url(url)

  • parse(response) 默認回調(diào)函數(shù)

    This method, as well as any other Request callback, must return an iterable of Request and/or dicts or Item objects.

  • log(message[,level,component])
  • closed(reason)

使用示例: import scrapyclass 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)函數(shù)返回多個request和Items: import scrapyclass 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').extract():yield {"title": h3}for url in response.xpath('//a/@href').extract():yield scrapy.Request(url, callback=self.parse) 你也可以不用`start_urls`,直接使用`statr_requests()`,同時為了讓返回數(shù)據(jù)更結(jié)構(gòu)化,你可以使用Items: import scrapy from myproject.items import MyItemclass 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').extract():yield MyItem(title=h3)for url in response.xpath('//a/@href').extract():yield scrapy.Request(url, callback=self.parse)

2. 給Spider傳遞參數(shù)

Spider可以接收參數(shù)來調(diào)整其運行方法。通常的用法是用來定義起始URLS或者限制spider的爬取范圍,但是它也能用于配置spider的其他功能。 spider的參數(shù)通過`crawl`命令的`-a` 選項來傳入。 scrapy crawl myspider -a category=electronics Spider從構(gòu)造函數(shù)中接受參數(shù): import scrapyclass MySpider(scrapy.Spider):name = 'myspider'def __init__(self, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.start_urls = ['http://www.example.com/categories/%s' % category]# ... Spider arguments can also be passed through the Scrapyd schedule.json API. See Scrapyd documentation.

3. Generic Spiders:通用spider

Scrapy附帶一些可以用來繼承實現(xiàn)的有用的generic spider。它們的目的在于為不同的cases提供方便的功能,如following all links on a site based on certain rules, crawling from Sitemaps, or parsing an XML/CSV feed. 對于下面的的例子,我們假設(shè)在myproject.items中實現(xiàn)了TestItem: import scrapyclass TestItem(scrapy.Item):id = scrapy.Field()name = scrapy.Field()description = scrapy.Field()

3.1 CrawlSpider

class scrapy.spiders.CrawlSpider

爬取普通網(wǎng)頁最常用的spider,它提供了基于rules跟隨Link的方便機制。 除繼承自scrapy.Spider的屬性外,CrawlSpider還提供了一下屬性:
  • rules 一個存放Rule的list。每個`Rule定義了一個爬取頁面的規(guī)則。如果多個Rule匹配了同一個link,那么使用第一個。
  • parse_start_url(response) 處理從start_urls的返回的response(避免使用parse函數(shù)!)

Crawling rules:

class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)

  • link_extractor 一個Link Extractor對象,用于定義如何從爬到的頁面提取link
  • callback
    • 是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)。
    • 從link_extractor中每獲取到鏈接時將會調(diào)用該函數(shù)。
    • 回調(diào)函數(shù)接受一個response作為其第一個參數(shù), 并返回一個包含 Item 以及(或) Request 對象(或者這兩者的子類)的列表(list)。
    • 不要使用parse函數(shù)作為回調(diào)函數(shù),由于 CrawlSpider 使用 parse 方法來實現(xiàn)其邏輯,如果覆蓋了 parse 方法,crawl spider 將會運行失敗。
  • cb_kwargs 包含傳遞給回調(diào)函數(shù)的參數(shù)(keyword argument)的字典。
  • follow 是一個布爾值,指定了根據(jù)該規(guī)則從response提取的鏈接是否需要跟進。 如果 callback 為None, follow 默認設(shè)置為 True ,否則默認為 False 。
  • process_links 是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)。 從link_extractor中獲取到鏈接列表時將會調(diào)用該函數(shù)。該方法主要用來過濾。
  • process_request 是一個callable或string(該spider中同名的函數(shù)將會被調(diào)用)。 該規(guī)則提取到每個request時都會調(diào)用該函數(shù)。該函數(shù)必須返回一個request或者None。 (用來過濾request)

CrawSpider示例

import scrapy from scrapy.contrib.spiders import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractorclass MySpider(CrawlSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com']rules = (# 提取匹配 'category.php' (但不匹配 'subsection.php') 的鏈接并跟進鏈接(沒有callback意味著follow默認為True)Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),# 提取匹配 'item.php' 的鏈接并使用spider的parse_item方法進行分析Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),)def parse_item(self, response):self.log('Hi, this is an item page! %s' % response.url)item = scrapy.Item()item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()return item

該spider將從example.com的首頁開始爬取,獲取category以及item的鏈接并對后者使用 parse_item 方法。 當item獲得返回(response)時,將使用XPath處理HTML并生成一些數(shù)據(jù)填入 Item 中。

3.2 XMLFeedSpider

class scrapy.contrib.spiders.XMLFeedSpider

用于通過迭代各個節(jié)點來分析XML源(XML feed)。

迭代器可以從 iternodes , xml , html 選擇。 鑒于 xml 以及 html 迭代器需要先讀取所有DOM再分析而引起的性能問題, 一般還是推薦使用 iternodes 。 不過使用 html 作為迭代器能有效應(yīng)對錯誤的XML。

使用XMLFeedSpider需要定義下列類屬性來設(shè)置迭代器以及標簽名(tag name):

  • iterator
    用于確定使用哪個迭代器的string。可選項有:

    • iternodes - 一個高性能的基于正則表達式的迭代器
    • html - 使用 Selector 的迭代器。 需要注意的是該迭代器使用DOM進行分析,其需要將所有的DOM載入內(nèi)存, 當數(shù)據(jù)量大的時候會產(chǎn)生問題。
    • xml - 使用 Selector 的迭代器。 需要注意的是該迭代器使用DOM進行分析,其需要將所有的DOM載入內(nèi)存, 當數(shù)據(jù)量大的時候會產(chǎn)生問題。
    • 默認值為 iternodes
  • itertag 一個包含開始迭代的節(jié)點名的string。例如:itertag = 'product'

  • namespaces 一個由 (prefix, url) 元組(tuple)所組成的list。 其定義了在該文檔中會被spider處理的可用的namespace。 prefix 及 uri 會被自動調(diào)用 register_namespace() 生成namespace。
    可以通過在 itertag 屬性中制定節(jié)點的namespace。

    class YourSpider(XMLFeedSpider):

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')] itertag = 'n:url' # ...
  • adapt_response() 該方法在spider分析response前被調(diào)用。您可以在response被分析之前使用該函數(shù)來修改內(nèi)容(body)。 該方法接受一個response并返回一個response(可以相同也可以不同)。

  • parse_node() 當節(jié)點符合提供的標簽名時(itertag)該方法被調(diào)用。 接收到的response以及相應(yīng)的 Selector 作為參數(shù)傳遞給該方法。 該方法返回一個 Item 對象或者 Request 對象 或者一個包含二者的可迭代對象(iterable)。
  • process_results() 當spider返回結(jié)果(item或request)時該方法被調(diào)用。 設(shè)定該方法的目的是在結(jié)果返回給框架核心(framework core)之前做最后的處理, 例如設(shè)定item的ID。其接受一個結(jié)果的列表(list of results)及對應(yīng)的response。 其結(jié)果必須返回一個結(jié)果的列表(list of results)(包含Item或者Request對象)。

XMLFeedSpider示例:

from scrapy import log from scrapy.contrib.spiders import XMLFeedSpider from myproject.items import TestItemclass MySpider(XMLFeedSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/feed.xml']iterator = 'iternodes' # This is actually unnecessary, since it's the default valueitertag = 'item'def parse_node(self, response, node):log.msg('Hi, this is a <%s> node!: %s' % (self.itertag, ''.join(node.extract())))item = TestItem()item['id'] = node.xpath('@id').extract()item['name'] = node.xpath('name').extract()item['description'] = node.xpath('description').extract()return item

簡單來說,我們在這里創(chuàng)建了一個spider,從給定的 start_urls 中下載feed, 并迭代feed中每個 item 標簽,輸出,并在 Item 中存儲有些隨機數(shù)據(jù)。

3.3 CSVSpider

class scrapy.contrib.spiders.CSVFeedSpider

除了其按行遍歷而不是節(jié)點之外其他和XMLFeedSpider十分類似。其在每次迭代時調(diào)用的是 parse_row() 。

  • delimiter 在CSV文件中用于區(qū)分字段的分隔符。類型為string。 默認為 ','(逗號)。
  • quotechar A string with the enclosure character for each field in the CSV file Defaults to '"'(quotation mark).
  • headers 在CSV文件中包含的用來提取字段的行的列表。參考下邊的例子。
  • parse_row() 該方法接收一個response對象及一個以提供或檢測出來的header為鍵的字典(代表每行)。 該spider中,您也可以覆蓋 adapt_response 及 process_results 方法來進行預(yù)處理(pre-processing)及后(post-processing)處理。

CSVFeedSpider示例
下面的例子和之前的例子很像,但使用了 CSVFeedSpider:

from scrapy import log from scrapy.contrib.spiders import CSVFeedSpider from myproject.items import TestItemclass MySpider(CSVFeedSpider):name = 'example.com'allowed_domains = ['example.com']start_urls = ['http://www.example.com/feed.csv']delimiter = ';'quotechar = "'"headers = ['id', 'name', 'description']def parse_row(self, response, row):log.msg('Hi, this is a row!: %r' % row)item = TestItem()item['id'] = row['id']item['name'] = row['name']item['description'] = row['description']return item

3.4 SitemapSpider

class scrapy.contrib.spiders.SitemapSpider

在爬取網(wǎng)站時可以通過 Sitemaps 來發(fā)現(xiàn)爬取的URL。

其支持嵌套的sitemap,并能從 robots.txt 中獲取sitemap的url。

總結(jié)

以上是生活随笔為你收集整理的Scrapy spiders介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。