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這個網站
- 首先建立專案:scrapy startproject tutorial。命令列執行,如果是Windows則是dos下執行,這條命令會建立一個scrapy檔案目錄。
- 目錄結構先不理他,我們先在spiders目錄建立一個爬蟲檔案,名稱隨意,比如就叫spider.py。
- 在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允許在多個層面上修改設定。他們分別是(包含優先順序):
- 命令列選項(最優先)
- 每蜘蛛的設定
- 專案設定模組
- 每個命令的預設設定
- 預設全域性設定(優先順序較低)
我們一般會修改2和3。2是通過爬蟲的custom_settings屬性來配置,3則是通過settings.py來配置。
總結
使用scrapy的一般步驟
- 建立專案:scrapy startproject baidu
- 測試xpath規則:scrapy shell “https://www.baidu.com”
- 建立爬蟲檔案並編寫部分程式碼
- 編寫items.py需要抓取的欄位
- 補全爬蟲檔案程式碼
- 編寫pipelines.py的mongo管道
- 修改配置檔案的一些引數
- 編寫隨機頭和代理中介軟體
可以根據這個步驟一步一步的看,然後查怎麼去實現。