- Scrapy 教程
- Scrapy - 首頁
- Scrapy 基本概念
- Scrapy - 概述
- Scrapy - 環境
- Scrapy - 命令列工具
- Scrapy - 爬蟲
- Scrapy - 選擇器
- Scrapy - 項
- Scrapy - 項載入器
- Scrapy - Shell
- Scrapy - 項管道
- Scrapy - Feed 匯出
- Scrapy - 請求 & 響應
- Scrapy - 連結提取器
- Scrapy - 設定
- Scrapy - 異常
- Scrapy 即時專案
- Scrapy - 建立專案
- Scrapy - 定義項
- Scrapy - 第一個爬蟲
- Scrapy - 爬取
- Scrapy - 提取項
- Scrapy - 使用項
- Scrapy - 跟蹤連結
- Scrapy - 爬取資料
- Scrapy 有用資源
- Scrapy - 快速指南
- Scrapy - 有用資源
- Scrapy - 討論
Scrapy - 爬蟲
描述
爬蟲是一個類,負責定義如何透過網站跟蹤連結並從頁面中提取資訊。
Scrapy 的預設爬蟲如下:
scrapy.Spider
它是一個爬蟲,所有其他爬蟲都必須繼承它。它具有以下類:
class scrapy.spiders.Spider
下表顯示了 scrapy.Spider 類的欄位:
| 序號 | 欄位 & 描述 |
|---|---|
| 1 | name 它是你的爬蟲的名稱。 |
| 2 | allowed_domains 它是爬蟲爬取的域名列表。 |
| 3 | start_urls 它是一個 URL 列表,將作為後續爬取的根,爬蟲將從此處開始爬取。 |
| 4 | custom_settings 這些是在執行爬蟲時,將從專案範圍的配置中覆蓋的設定。 |
| 5 | crawler 它是一個屬性,連結到爬蟲例項繫結的 Crawler 物件。 |
| 6 | settings 這些是執行爬蟲的設定。 |
| 7 | logger 它是一個 Python 日誌記錄器,用於傳送日誌訊息。 |
| 8 | from_crawler(crawler,*args,**kwargs) 它是一個類方法,用於建立你的爬蟲。引數如下:
|
| 9 | start_requests() 當沒有指定特定的 URL 並且爬蟲開啟以進行抓取時,Scrapy 會呼叫 start_requests() 方法。 |
| 10 | make_requests_from_url(url) 它是一個用於將 URL 轉換為請求的方法。 |
| 11 | parse(response) 此方法處理響應並返回抓取的資料,以及更多 URL。 |
| 12 | log(message[,level,component]) 它是一個透過爬蟲日誌記錄器傳送日誌訊息的方法。 |
| 13 | closed(reason) 當爬蟲關閉時,會呼叫此方法。 |
爬蟲引數
爬蟲引數用於指定起始 URL,並使用 crawl 命令和 -a 選項傳遞,如下所示:
scrapy crawl first_scrapy -a group = accessories
以下程式碼演示了爬蟲如何接收引數:
import scrapy
class FirstSpider(scrapy.Spider):
name = "first"
def __init__(self, group = None, *args, **kwargs):
super(FirstSpider, self).__init__(*args, **kwargs)
self.start_urls = ["http://www.example.com/group/%s" % group]
通用爬蟲
您可以使用通用爬蟲從其子類化您的爬蟲。它們的目的是根據某些規則跟蹤網站上的所有連結,以從所有頁面提取資料。
對於以下爬蟲中使用的示例,讓我們假設我們有一個具有以下欄位的專案:
import scrapy from scrapy.item import Item, Field class First_scrapyItem(scrapy.Item): product_title = Field() product_link = Field() product_description = Field()
CrawlSpider
CrawlSpider 定義了一組規則來跟蹤連結並抓取多個頁面。它具有以下類:
class scrapy.spiders.CrawlSpider
以下是 CrawlSpider 類的屬性:
rules
它是一個規則物件的列表,定義了爬蟲如何跟蹤連結。
下表顯示了 CrawlSpider 類的規則:
| 序號 | 規則 & 描述 |
|---|---|
| 1 | LinkExtractor 它指定了爬蟲如何跟蹤連結並提取資料。 |
| 2 | callback 在每個頁面抓取後呼叫。 |
| 3 | follow 它指定是否繼續跟蹤連結。 |
parse_start_url(response)
它透過允許解析初始響應返回項或請求物件。
注意 − 編寫規則時,請確保將 parse 函式重新命名為除 parse 之外的其他名稱,因為 parse 函式由 CrawlSpider 用於實現其邏輯。
讓我們看一下下面的示例,其中爬蟲從 demoexample.com 的主頁開始爬取,收集所有頁面、連結,並使用 parse_items 方法進行解析:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class DemoSpider(CrawlSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com"]
rules = (
Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
callback = "parse_item", follow = True),
)
def parse_item(self, response):
item = DemoItem()
item["product_title"] = response.xpath("a/text()").extract()
item["product_link"] = response.xpath("a/@href").extract()
item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
return items
XMLFeedSpider
它是用於從 XML feed 抓取並迭代節點的爬蟲的基類。它具有以下類:
class scrapy.spiders.XMLFeedSpider
下表顯示了用於設定迭代器和標籤名稱的類屬性:
| 序號 | 屬性 & 描述 |
|---|---|
| 1 | iterator 它定義了要使用的迭代器。它可以是 iternodes、html 或 xml。預設為 iternodes。 |
| 2 | itertag 它是一個包含要迭代的節點名稱的字串。 |
| 3 | namespaces 它由 (字首,uri) 元組列表定義,這些元組使用 register_namespace() 方法自動註冊名稱空間。 |
| 4 | adapt_response(response) 它接收響應並在響應體從爬蟲中介軟體到達後立即修改它,在爬蟲開始解析它之前。 |
| 5 | parse_node(response,selector) 當為每個與提供的標籤名稱匹配的節點呼叫時,它接收響應和選擇器。 注意 − 如果不覆蓋此方法,你的爬蟲將無法工作。 |
| 6 | process_results(response,results) 它返回爬蟲返回的結果和響應列表。 |
CSVFeedSpider
它迭代其每一行,接收 CSV 檔案作為響應,並呼叫 parse_row() 方法。它具有以下類:
class scrapy.spiders.CSVFeedSpider
下表顯示了可以設定的關於 CSV 檔案的選項:
| 序號 | 選項 & 描述 |
|---|---|
| 1 | delimiter 它是一個包含逗號 (,) 分隔符的字串,用於每個欄位。 |
| 2 | quotechar 它是一個包含引號 (") 的字串,用於每個欄位。 |
| 3 | headers 它是一個語句列表,從中可以提取欄位。 |
| 4 | parse_row(response,row) 它接收響應和每一行以及標題的鍵。 |
CSVFeedSpider 示例
from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem
class DemoSpider(CSVFeedSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com/feed.csv"]
delimiter = ";"
quotechar = "'"
headers = ["product_title", "product_link", "product_description"]
def parse_row(self, response, row):
self.logger.info("This is row: %r", row)
item = DemoItem()
item["product_title"] = row["product_title"]
item["product_link"] = row["product_link"]
item["product_description"] = row["product_description"]
return item
SitemapSpider
SitemapSpider 在 站點地圖 的幫助下透過從 robots.txt 中找到 URL 來爬取網站。它具有以下類:
class scrapy.spiders.SitemapSpider
下表顯示了 SitemapSpider 的欄位:
| 序號 | 欄位 & 描述 |
|---|---|
| 1 | sitemap_urls 你要爬取的指向站點地圖的 URL 列表。 |
| 2 | sitemap_rules 它是一個元組 (正則表示式,回撥) 列表,其中正則表示式是正則表示式,回撥用於處理與正則表示式匹配的 URL。 |
| 3 | sitemap_follow 它是一個要跟蹤的站點地圖正則表示式列表。 |
| 4 | sitemap_alternate_links 指定要為單個 url 跟蹤的備用連結。 |
SitemapSpider 示例
以下 SitemapSpider 處理所有 URL:
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
def parse(self, response):
# You can scrap items here
以下 SitemapSpider 使用回撥處理一些 URL:
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
rules = [
("/item/", "parse_item"),
("/group/", "parse_group"),
]
def parse_item(self, response):
# you can scrap item here
def parse_group(self, response):
# you can scrap group here
以下程式碼顯示了 robots.txt 中的站點地圖,其 url 包含 /sitemap_company:
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
sitemap_follow = ["/sitemap_company"]
def parse_company(self, response):
# you can scrap company here
你甚至可以將 SitemapSpider 與其他 URL 結合使用,如下面的命令所示。
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
other_urls = ["http://www.demoexample.com/contact-us"]
def start_requests(self):
requests = list(super(DemoSpider, self).start_requests())
requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
return requests
def parse_company(self, response):
# you can scrap company here...
def parse_other(self, response):
# you can scrap other here...