Scrapy進階知識點總結(一)——基本命令與基本類(spider,request,response)


 

一.常見命令

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類

scrapy. spiders.Spider是最基礎的spider類(還有其他的模板),spiders文件都主要是圍繞這個類展開(繼承與重寫)
 
Spider這個類提供了start_requests()方法的默認實現,讀取並請求start_urls屬性,並根據返回的結果調用parse()方法解析結果
 
1.常見類屬性
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沒有區別

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM