天天看點

Scrapy 的 Spider 的編寫

當然,我們也可以自己寫 .py 檔案,不過,下面我們要介紹使用 Scrapy 的模闆來生成爬蟲檔案的方法。

在 iTerm2 中輸入:

scrapy genspider iqianyue http://iqianyue.com/           
Scrapy 的 Spider 的編寫

從上圖中,我們可以看到,預設,使用模闆 “basic” 建立了 spider “iqianyue”,程式在 spiders 檔案夾下就生成了模闆檔案:

# -*- coding: utf-8 -*-
import scrapy

class IqianyueSpider(scrapy.Spider):
    name = "iqianyue"
    allowed_domains = ["http://iqianyue.com/"]
    start_urls = ['http://http://iqianyue.com//']

    def parse(self, response):
        pass           

下面,我們對爬蟲的檔案修改如下:

# -*- coding: utf-8 -*-
import scrapy

from douban.items import MyFirstItem

class IqianyueSpider(scrapy.Spider):
    name = "iqianyue"
    allowed_domains = ["http://iqianyue.com/"]
    start_urls = ['http://www.iqianyue.com/articles/423525e6',
                  'http://www.iqianyue.com/articles/43c364c8',
                  'http://www.iqianyue.com/articles/3601e6c2']

    def parse(self, response):
        item = MyFirstItem()
        item["urlname"] = response.xpath("/html/head/title/text()")
        print(item["urlname"])           

同時,對 items.py 檔案添加:

class MyFirstItem(scrapy.Item):
    urlname = scrapy.Field()
    urlkey = scrapy.Field()
    urlcr = scrapy.Field()
    urladdr = scrapy.Field()           

然後執行指令:

scrapy crawl iqianyue --nolog           

說明:crawl 就是開始爬取的意思,“iqianyue” 是 IqianyueSpider 中 name 屬性的值。

Scrapy 的 Spider 的編寫

下面,我們回答一個問題:為什麼定義了

start_urls

屬性,就預設定義了起始的網址呢?

我們看一看 scrapy.Spider 這個類的源代碼就知道了。

Scrapy 的 Spider 的編寫
# -*- coding: utf-8 -*-
import scrapy

from douban.items import MyFirstItem

class IqianyueSpider(scrapy.Spider):
    name = "iqianyue"
    allowed_domains = ["http://iqianyue.com/"]
    start_urls = ['http://www.iqianyue.com/articles/423525e6',
                  'http://www.iqianyue.com/articles/43c364c8',
                  'http://www.iqianyue.com/articles/3601e6c2']

    # 第 1 步:定義了新的屬性
    custom_urls = ("https://www.jd.com/",
                  "http://www.sina.com.cn/",
                  "http://www.163.com/")

    # 第 2 步:重寫了 start_requests() 方法
    def start_requests(self):
        # 在該方法中将起始網址設定從新屬性 url2 中讀取
        for url in self.custom_urls:
            # 第 3 步:調用了預設的 make_requests_from_url()
            # 方法生成了具體請求,并通過 yield 傳回
            yield self.make_requests_from_url(url)

    def parse(self, response):
        item = MyFirstItem()
        item["urlname"] = response.xpath("/html/head/title/text()")
        print(item["urlname"])