一.常見命令
scrapy全局命令可以在任何地方用,項目命令只能在項目路徑下用
全局命令: 項目命令:
startproject crawl
genspider check
settings list
runspider edit
shell parse
fetch bench
view
version
1.創建項目
scrapy startproject <project_name> [project_dir]
示例: scrapy startproject douban
2.在項目中創建spiders
scrapy genspider [-t template] <name> <domain>
示例: scrapy genspider douban www.douban.com
<name>是spiders名字 <domain>是所爬取網站域名,文件中會根據這個生成allowed_domains和start_urls [-t template]可以根據模板來創建,有basic crawl csvfeed xmlfeed等
3.啟動爬蟲
scrapy crawl <spider>
-o 可以指定輸出格式
--nolog 可以關閉打印log
4.查看所有爬蟲
scrapy list
5.打印響應
scrapy fetch <url>
--nolog 不打印log 只顯示content
--headers 打印響應頭部
6.調試shell
scrapy shell [url]
進入命令行調試,可以使用response.css xpath這些方法來檢測數據,打印源碼等
7.顯示項目的設置
scrapy settings --get BOT_NAME
BOT_NAME默認為項目名,可以在settings.py改
8.不創建項目運行spiders
scrapy runspider <spider_file.py>
二.Spider類
name #爬蟲名稱,是定義Spider名字的字符串,在項目中唯一 allowed_domains #允許爬取的域名,是可選配置,不在此范圍的鏈接不會被跟進爬取 start_urls #起始URL列表,沒有實現start_requests()方法時,默認會從這個列表開始抓取 custom_settings #spider專屬設置,會覆蓋全局設置 crawler #crawler對象與spider的綁定,代表的是本Spider類對應的Crawler對象(有點懵的東西) setttings #運行此蜘蛛的配置。這是一個 Settings實例 logger #指定Spider創建的Python logger name。可以使用它來發送日志消息
2.類方法
from_crawler(cls, crawler, *args, **kwargs) #類方法,用於實例化某個對象(中間件,模塊),將之綁定到spider類上 start_requests(self) #生成器,返回由 URL 構造的 Request,作為入口在爬蟲啟動時自動運行。實現了本方法,則忽略start_urls。當然,方法內使用start_urls另說。 parse(self, response) #默認 Response 解析函數(request默認回調函數),此方法以及任何其他Request回調必須返回可迭代的Request和/或dicts或Item對象 closed(self, reason) #爬蟲關閉時自動運行,實現了spider_closed信號綁定
三.request對象
scrapy使用內置的scrapy.http.Request與Response對象去請求網絡資源與響應的處理
PS :在我們寫spider的時候,主要是import scrapy, 然后Spider類與request類的引用路徑則是scrapy.Spider與scrapy.Request。與我們在官網看見的文檔不同,這是因為在源碼scrapy/__init__.py中
增加了縮寫
scrapy/__init__.py # Declare top-level shortcuts from scrapy.spiders import Spider from scrapy.http import Request, FormRequest from scrapy.selector import Selector from scrapy.item import Item, Field
Request對象
scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback, flags, cb_kwargs])
參數解析
url( string ) #請求的URL callback #回調函數,請求下載完成后,調用的方法,response對象為第一參數 method(string) #請求的HTTP方法。默認為'GET' meta(dict) #元數據,表示要攜帶或者傳遞的信息,可用戶自定義從Request到Response傳遞參數,這個參數一般也可在middlewares中處理 body(str或unicode)#請求主體body,就是HTTP報文請求頭后面的內容 headers(dict)#請求頭,字典格式 cookie(dict或list) #cookie,字典或者多個字典的list encoding(string)#編碼,默認utf-8 priority(int)#請求的優先級(默認為0)。調度器使用優先級來定義用於處理請求的順序。具有較高優先級值的請求將較早執行。允許負值以指示相對低優先級 dont_filter(boolean)#如果需要多次提交表單,且url一樣,那么就必須設置參數dont_filter = True,防止被當成重復網頁過濾掉了,默認false errback(callable)#在處理請求時引發任何異常時將調用的函數 flags(list)#發送到請求的標志,可用於日志記錄或類似目的 cb_kwargs(dict)#一個帶有任意數據的字典,它將作為關鍵字參數傳遞給Request的回調。
屬性與方法
url #請求url method #請求方法 headers #請求頭,字典類型 body #請求主體str meta #可用戶自定義從Request到Response傳遞參數,這個參數一般也可在middlewares中處理 cb_kwargs #與參數一樣 copy() #返回副本 replace (參數) #替換對應參數,返回新的request
FormRequest對象
FormRequest類擴展了基礎Request,具有處理HTML表單的功能,比Request增加formdata參數
1. scrapy.http.FormRequest(url [,formdata,... ] )
formdata(元組的dict或iterable) #是包含HTML表單數據的字典(或(key,value)元組的可迭代的),它將被url編碼並分配給請求的主體。
模擬表單POST發送,formdata的 參數值 value 必須是unicode , str 或者 bytes object,不能是整數
return [FormRequest(url="http://www.example.com/post/action", formdata={'name': 'John Doe', 'age': '27'}, callback=self.after_post)]
2. from_response()方法
網站通常通過<input type =“hidden”>元素提供預先填充的表單字段,例如會話相關數據或身份驗證令牌(用於登錄頁面)。 在抓取時,希望自動預先填充這些字段,並僅覆蓋其中的一些字段,例如用戶名和密碼。 可以使用FormRequest.from_response()方法,示例如下
import scrapy def authentication_failed(response): # TODO: Check the contents of the response and return True if it failed # or False if it succeeded. pass class LoginSpider(scrapy.Spider): name = 'example.com' start_urls = ['http://www.example.com/users/login.php'] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata={'username': 'john', 'password': 'secret'}, callback=self.after_login ) def after_login(self, response): if authentication_failed(response): self.logger.error("Login failed") return # continue scraping with authenticated session...
如果想要請求的界面HTML中有表單信息 表單元素from_response()方法就可以自動識別里面的表單,並將參數傳入表單
但實際from_response()能做的,FormRequest也能做,建議用FormRequest
JSONRequest對象
JSONRequest類增加了兩個新的參數構造函數。其余參數與Request類相同。使用JSONRequest將設置Content-Type標頭application/json 和Accept標頭application/json, text/javascript, */*; q=0.01
scrapy.http.JSONRequest(url [,... data,dumps_kwargs ] )
data(JSON可序列化對象) #是任何需要JSON編碼並分配給body的JSON可序列化對象。如果Request.body提供了參數,則將忽略此參數。如果Request.body未提供參數且提供的數據參數Request.method將'POST'自動設置。 dumps_kwargs(dict) #將傳遞給基礎json.dumps方法的參數,該方法用於將數據序列化為JSON格式。
示例
data = { 'name1': 'value1', 'name2': 'value2', } yield JSONRequest(url='http://www.example.com/post/action', data=data)
四.Response對象
Response類用於http下載返回信息的類,它有幾個子類:TextResponse 、 HtmlResponse 、 XmlResponse。關系如下:
Response
-TextResponse -HtmlResponse -XmlResponse
一般情況下,當一個頁面下載完成時,下載器依據HTTP響應頭部中的Content-Type信息創建某個Response的子類對象,通常一般是HtmlResponse子類,並通過response的形參傳入request的回調函數進行我們的提取數據操作
Response基類
scrapy.http.Response(url [,status = 200,headers = None,body = b'',flags = None,request = None ] )
參數與request對象差不多,而且使用Response屬性與方法較多,這里省略參數,具體可以官網查看https://docs.scrapy.org/en/latest/topics/request-response.html#scrapy.http.Request
對象屬性
url #響應的url字符串,(不一定是請求的地址,需考慮重定向) status #響應的HTTP狀態的整數。示例:200, 404 headers #響應頭,字典類型,若要獲取特定的值用get('keyname') getlist('keyname');get('keyname') : 獲取指定key的第一個value值 返回str;getlist('keyname') : 獲取指定key的所有value值 返回list body #響應正文,字節對象 request #返回請求此響應的Request對象 meta #元數據,可以獲取Request.meta中的數據。可以理解meta就是一個中繼數據 flags #包含此響應標志的列表
對象方法
copy() #返回一個新的Response,它是此Response的副本 replace([ url,status,headers,body,request,flags,cls ] ) #返回替換了對應參數的新對象 urljoin(url ) #通過將Response url與可能的相對URL 組合來構造絕對URL follow(url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, cb_kwargs=None)
#可以接收url或相對url的Request請求方法。常用於下一頁請求。
TextResponse對象
TextResponse主要繼承於基類Response,並且新加了一些方法的實現,以及新的對象屬性
class scrapy.http.TextResponse(url [,encoding [,... ] ] )
屬性
text #響應文本,與response.body.decode(response.encoding)類似,但是text更方便 encoding #HTTP 響應正文的編碼,它的值可能是從HTTP響應頭部或正文中解析出來的 selector #Selector 對象用於在Response 中提取數據
在基類新增的方法
xpath(query) #使用XPath選擇器在Response中提取數據;它是 response.selector.xpath 方法的快捷方式 css(query) #使用 CSS選擇器在Response中提取數據;它是 response.selector.css方法的快捷方式。
HtmlResponse與XmlResponse
HtmlResponse和XmlResponse在源碼實現上就是繼承了TextResponse,目前與TextResponse沒有區別