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管道
- 修改配置文件的一些參數
- 編寫隨機頭和代理中間件
可以根據這個步驟一步一步的看,然後查怎麼去實現。