命令行輸入:scrapy genspider --list 能夠看到scrapy給咱們提供的爬蟲模板:css
basic
crawl
csvfeed
xmlfeedpython
通常都是用默認模板生成的spider,若是須要選擇模本能夠用命令:正則表達式
scrapy genspider -t crawl ....json
關於pacharm中python的模塊導入問題,正在編輯的模塊若是但願做爲導入模塊的根目錄能夠右鍵項目文件而後以下圖:數組
這樣就能夠直接導入項目中的文件做爲模塊了。dom
可是有個問題:若是是使用命令行模式的話,就不會自動將當前的項目文件夾做爲root source, 因而能夠經過本身進入settings文件(由於settings是scrapy命令的主入口)中設置。scrapy
import sys
sys.path.insert(0, '項目所在目錄') # 第一個參數爲優先級
可是此種方式添加的是絕對路徑,能夠用一種更加靈活的方式處理此問題:ide
import os
import sys base_dir=os.path.dirname(os.path.abspath(os.path.dirname(__file__))) sys.path.insert(0, os.path.join(base_dir, '當前項目名稱')) #將路徑加入到python path當中。使其能夠直接import
rules函數
爬取的規則屬性,包含一個或多個Rule對象的列表,每一個Rule都對爬取網站的動做作了定義,Criwlspider將讀取rules每個Rule並進行解析網站
parse_start_url(),是一個可重寫的方法,當start_urls裏面對應的Request返回Response時,該方法被調用,它會分析Response並返回item或者Request對象。
Rule 定義:
def __init__(self, allow=(), deny=(), allow_domains=(), deny_domains=(), restrict_xpaths=(),
tags=('a', 'area'), attrs=('href',), canonicalize=False, unique=True, process_value=None, deny_extensions=None, restrict_css=(), strip=True):
allow 是一個正則表達式列表,定義從當前頁面提取符合匹配的連接。deny相反,allow_domains定義了域名,只有符合該域名的纔跟進。deny_domains相反,restrict_xpath和restrict_xpath表示限定allow查找的區域。tags=('a', 'area')表示從哪些標籤中找連接。attrs=('href'),從標籤中找什麼屬性的連接。callback:回調函數,每次提取到鏈接時候,調用該函數,注意要避免使用parse做爲回調函數。由於Crawlspider使用的parse()方法來實現其邏輯的,若是覆蓋了parse()方法,Crawlspider將運行失敗。
ca_kwargs:字典,包含傳遞給回調函數的參數。
follow:指定提取的連接是否須要跟進。若是callback參數爲None,則follow默認爲Ture,不然默認爲False
process_links:指定的處理函數,從Llink_extract中獲取到鏈接時候,被調用,主要用於判別連接和過濾。
process_reuquest:指定處理函數,跟進該Rule提取到的每一個Ruquest時,該函數被調用,對Request進行處理,返回Request或者None
item loader 中的 rom scrapy.loader.processors import TakeFirst
TakeFirst()的用法爲從列表中間取出第一個非空值,注意不是第一個值,而是非空值。
用給定多個函數組合構成processor,每一個輸入值傳入到一個函數,在輸出到第二個函數,類推,
與compose相似,迭代處理一個列表值中的全部元素,遍歷而後依次處理。
用於查詢json中的元素,傳入key,返回value。不過須要先安裝jmespath包
安裝以後就可使用這個processor了。
實例以下:
from scrapy.loader.processors import SelectJmes
processor = SelectJmes('foo')
print(processor({'foo':'bar'}))
運行結果: bar