scrapy使用心得(入門教程)

scrapy官網:https://doc.scrapy.org/en/latest/topics/settings.html

基本上沒有什麼教程可以媲美官方文檔的,所有的教程不過是在解讀官方文檔,如果有那一定是看源碼。所以,如果你有耐心的話可以自己看官方文檔。使用谷歌瀏覽器自帶的谷歌翻譯可以看得懂,不像python官方的文檔,機翻出來基本天書。

關於各組件的功能,我覺得這個博客寫的很好。可以看一下https://www.cnblogs.com/kongzhagen/p/6549053.html

安裝指南

如果只是參考文檔的做,絕對會報錯。這個還是需要百度搜一下相關文章,他們會提供簡單的安裝方法。

[Scrapy初識]

(https://doc.scrapy.org/en/latest/intro/tutorial.html)

這個主要在講解scrapy怎麼爬取quotes.toscrape.com這個網站

  1. 首先創建項目:scrapy startproject tutorial。命令行執行,如果是Windows則是dos下執行,這條命令會創建一個scrapy文件目錄。
  2. 目錄結構先不理他,我們先在spiders目錄創建一個爬蟲文件,名稱隨意,比如就叫spider.py。
  3. 在spider.py寫入以下內容
import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

4.然後,在dos窗口cd到scrapy.cfg所在的目錄,輸入scrapy crawl quotes。
5.這樣,一個簡單的使用就完成了,我們所做的只是寫了一些解析網頁的代碼。至於怎麼抓取完全由scrapy來操作。

我們來說明以下我們寫的那個文件的信息。

  • 文件名隨意,如果整個scrapy只是抓取一個網站建議命名爲spider.py。如果抓取多個網站可以用網站域名區分。
  • 繼承於scrapy.Spider,必須繼承scrapy下的爬蟲類,一般是scrapy.Spider
  • name屬性,爬蟲的名稱,運行的時候使用,比如上面的第四步命令的最後就是這個name的值
  • start_requests方法,默認調用的一個方法,主要寫爬蟲抓取的網站
  • parse方法,解析函數,接受一個response對象,這個對象是爬蟲爬取網頁生成的一個對象,包含網頁結構。主要用於提取想要的數據

命令行工具

說一下我覺得有用的幾個命令

  • 創建項目:scrapy startproject baidu
  • 創建爬蟲:scrapy genspider spider www.baidu.com
  • 運行爬蟲:scrapy crawl name [-o a.json]
  • 檢查項目:scrapy check -l
  • 訪問網頁:scrapy view url
  • 測試提取:scrapy shell url
  • 查看版本:scrapy version [-v]

這沒什麼需要注意的,多用幾次就知道是什麼意思了。測試提取是在命令行解析數據,看看你的xpath能不能提取到數據。

爬蟲

前面粗略的說了一下爬蟲的幾個屬性和方法,現在我們全面一點

  • name:(屬性,字符串),爬蟲名稱
  • allowed_domains: (類屬性,列表),允許爬取的域名
  • start_urls: (屬性,列表),默認開始爬取的URL列表
  • custom_settings:(屬性,字典),包含配置信息,用於覆蓋setting.py裏的配置。比如這個爬蟲我要使用特定的頭信息等。
  • crawler:看起來功能強大,但只使用過crawler.settings.get獲取settings.py裏面的配置參數
  • settings:運行此蜘蛛的配置,暫時沒弄懂有什麼用
  • logger:(屬性,怎麼說呢),管理日誌.使用的話self.logger.info(’’)
  • from_crawler: (類方法),需要加@classmethod修飾。目前已知的作用是獲取參數並傳遞給__init__。不清楚目的如何,爲什麼不直接通過crawler獲取參數。
  • start_requests:(方法),默認調用的一個方法。主要寫爬蟲爬的網站。
  • parse:(方法),當存在start_urls默認調用的解析函數
  • log:(方法),暫時沒用過
  • closed:(方法),爬蟲停止時調用的一個方法,一般用於資源的關閉

以上是scrapy.Spider的一些屬性和方法。還有CrawlSpider、XMLFeedSpider、CSVFeedSpider 等就不多解釋了。其實有Spider就足夠解決大部分爬蟲了。

選擇器

scrapy封裝了css選擇器、xpath和正則。當然你要使用外部bs4和lxml只需導入對應包就行。
這個沒什麼需要說的,會用xpath和pyquery基本就會這個了

items

(https://doc.scrapy.org/en/latest/topics/items.html)
作用是從非結構化源中提取結構化數據。通俗的來說就是從網頁提取你想要的信息,然後把這些信息打包成一個類似於字典的類。注意:提取是爬蟲做的事,這個文件裏面的類僅僅起着一個字典的作用。至於爲什麼需要這樣一個類就不清楚了。寫法很簡單,看例子。

import scrapy

class MyItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    stock = scrapy.Field() 

管道

簡單來說,就是將item的數據存儲到數據庫或文件中。另外,他還有一些其他的功能,比如清理HTML數據,去重數據等。
每個管道類都可以有四個方法,其中process_item必須有

  • process_item:用於寫一些存儲的代碼
  • open_spider:打開蜘蛛時會調用此方法,用於打開資源
  • close_spider:蜘蛛關閉時調用此方法,用於關閉資源
  • from_crawler:同Spider的方法,一般用於獲取setting.py的配置,這是爲了便於修改參數,當然你完全可以不寫這個方法,將一些參數直接定義爲類屬性。

存儲到MongoDB的示例代碼(這是官網照搬的):

import pymongo

class MongoPipeline(object):

    collection_name = 'scrapy_items'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item

Feed exports

當我們沒有寫數據庫管道的時候,我們又想持久化數據。這樣我們就可以通過 Feed exports的方式導出數據。支持json、json行、csv、xml、pickle、marshal。

使用也很簡單,在抓取的時候加上-o參數。scrapy crawl quotes -o a.json

請求和響應

scrapy.Request(url [,callback,method =‘GET’,headers,body,cookies,meta,encoding =‘utf-8’,priority = 0,dont_filter = False,errback,flags ] )
參數:

  • url:請求的URL
  • callback:解析響應的函數
  • method:請求的類型:‘GET’、'POST’、'PUT’等
  • meta:用於傳遞參數給解析函數
  • body:請求體
  • headers:請求頭,一般用不到
  • cookie:不解釋
  • encoding:編碼
  • priority:請求的優先級
  • dont_filter:是否過濾相同的URL
  • errback:出現異常時調用的處理方法

屬性和方法:

  • url:請求的url
  • method:請求的類型
  • headers:請求頭
  • body:參數傳入的body
  • meta:參數傳入的meta
  • copy():返回一個新請求,該請求是此請求的副本
  • replace():不知道幹什麼的

response(url [,status = 200,headers = None,body = b’’,flags = None,request = None ] )
一般是下載器返回給解析函數的響應體,所以參數不重要,直接看屬性。

  • url:…
  • status:響應碼
  • headers:響應頭
  • body:響應體
  • request:此屬性,僅僅在蜘蛛中間件可用。一般用於將失敗和異常的請求重發。
  • meta:requets.meta傳遞過來的值
  • flags:暫時沒用過
  • copy():返回一個副本
  • replace():不知道有什麼用
  • urljoin():作用同urlparse.urljoin(response.url, url)
  • follow (): 參數同scrapy.Request。用於在解析函數中發出新的請求,可以替代scrapy.Request。而且,支持相對鏈接和a類型的選擇器。

設置

scrapy允許在多個層面上修改設置。他們分別是(包含優先級):

  1. 命令行選項(最優先)
  2. 每蜘蛛的設置
  3. 項目設置模塊
  4. 每個命令的默認設置
  5. 默認全局設置(優先級較低)

我們一般會修改2和3。2是通過爬蟲的custom_settings屬性來配置,3則是通過settings.py來配置。

總結

使用scrapy的一般步驟

  1. 創建項目:scrapy startproject baidu
  2. 測試xpath規則:scrapy shell “https://www.baidu.com”
  3. 創建爬蟲文件並編寫部分代碼
  4. 編寫items.py需要抓取的字段
  5. 補全爬蟲文件代碼
  6. 編寫pipelines.py的mongo管道
  7. 修改配置文件的一些參數
  8. 編寫隨機頭和代理中間件

可以根據這個步驟一步一步的看,然後查怎麼去實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章