scrapy

Scrapy的請求是異步調度和處理的。這意味着Scrapy不須要等待請求完成和處理,它能夠在此期間發送另外一個請求或執行其餘操做。這也意味着即便某些請求失敗或在處理錯誤時發生錯誤,其餘請求也能夠繼續運行。css

Scrapy是用純Python編寫的,取決於一些關鍵的Python包(以及其餘):
lxml,一個高效的XML和HTML解析器
parsel,一個在lxml之上編寫的HTML / XML數據提取庫,
w3lib,一個用於處理URL和網頁編碼的多用途幫助程序
twisted,一個異步網絡框架
cryptography和pyOpenSSL,用於處理各類網絡級安全需求html

scrapy.cfg文件所在的目錄稱爲項目根目錄
Scrapy 工程結構
tutorial/
scrapy.cfg # deploy configuration filenode

tutorial/             # project's Python module, you'll import your code from here
    __init__.py

    items.py          # project items definition file

    middlewares.py    # project middlewares file

    pipelines.py      # project pipelines file

    settings.py       # project settings file

    spiders/          # a directory where you'll later put your spiders
        __init__.py

直接在終端運行
scrapy shell "http://quotes.toscrape.com/page/1/".會像該Url request
response.css('title') # 返回一selectorList
抽取text
response.css('title::text').extract()
response.css('title::text').extract_first()
response.css('title::text').re(r'Quotes.*')
view(response)#打開響應頁面python

Selector Gadget也是一個很好的工具,能夠快速找到視覺選擇元素的CSS選擇器,它能夠在許多瀏覽器中使用。
除了CSS,Scrapy selectors也支持XPath擴展。XPath表達式很是強大,是Scrapy Selectors的基礎。實際上,CSS選擇器在底層下轉換爲XPath
response.xpath('//title/text()').extract_first()程序員

scrapy crawl quotes -o quotes.json //運行該腳本,並把結果保存到json文件裏頭正則表達式

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.css('span small::text').extract_first(),
                'tags': quote.css('div.tags a.tag::text').extract(),
            }

        next_page = response.css('li.next a::attr(href)').extract_first()
        if next_page is not None:
            yield response.follow(next_page, callback=self.parse)

response.follow supports relative URLs directly - no need to call urljoin.shell

默認狀況下,Scrapy會篩選出已訪問過的URL的重複請求,從而避免因編程錯誤而致使服務器過多的問題。這能夠經過設置進行配置 DUPEFILTER_CLASS編程

經過-a選項,咱們能夠把參數傳遞給Scrapy
scrapy crawl quotes -o quotes-humor.json -a tag=humorjson

Command line tool

有兩種命令,一種只能在Scrapy項目內部工做(特定於項目的命令)和那些在沒有活動的Scrapy項目(全局命令)的狀況下工做的命令,儘管從項目內部運行時它們可能表現略有不一樣(由於他們會使用項目覆蓋設置)。瀏覽器

Global commands:

startproject
genspider
settings
runspider
shell
fetch
view
version
Project-only commands:

crawl
check
list
edit
parse
bench

一個項目有多個spider,
使用該scrapy工具作的第一件事是建立Scrapy項目:
scrapy startproject myproject [project_dir] 這將在project_dir目錄下建立一個Scrapy項目。若是project_dir沒有指定,project_dir將是相同的myproject

scrapy genspider [-t template] 生成spider,表現上就是生成一個.py文件
scrapy genspider -t crawl scrapyorg scrapy.org ,Created spider 'scrapyorg' using template 'crawl'

scrapy crawl 使用spider開始抓取

scrapy list
列出當前項目中的全部可用spider

scrapy edit
使用EDITOR環境變量中定義的編輯器或(若是未設置)EDITOR設置編輯給定的spider。一般不用,由於會在IDE裏直接編輯

scrapy fetch
使用Scrapy下載程序下載給定的URL,並將內容寫入標準輸出。

scrapy vire
在瀏覽器中打開給定的URL,由於您的Scrapy spider會「看到」它。有時spider會看到不一樣於常規用戶的頁面,所以能夠用來檢查spider「看到」的內容並確認它是您所指望的。

scrapy shell [url]
爲給定的URL啓動Scrapy shell(若是給定),若是沒有給出URL,則爲空

scrapy parse [options]
fetch給定的url並parse(解析)

scrapy runspider <spider_file.py>
在Python文件中運行自包含的spider,而無需建立項目。

scrapy version -v
列出包的版本信息

scrapy bench
運行快速基準測試

還可使用該COMMANDS_MODULE設置添加自定義項目命令

Spiders

Spider是定義如何抓取某個站點(或一組站點)的類,是您爲特定站點(或者在某些狀況下,一組站點)爬網和解析頁面定義自定義行爲的地方。

scrapy.Spider
這是最簡單的spider,也是每一個其餘spider必須繼承的spider(包括與Scrapy捆綁在一塊兒的spider,以及你本身編寫的spider)。它不提供任何特殊功能。它只提供了一個默認start_requests()實現,它從start_urlsspider屬性發送請求,並parse 爲每一個結果響應調用spider的方法

name:一個字符串,用於定義此spider的名稱。spider名稱是Scrapy如何定位(並實例化)spider,所以它必須是惟一的且必需的。

allowed_domains
包含容許此爬網爬網的域的字符串的可選列表。若是OffsiteMiddleware啓用,則不會遵循對不屬於此列表(或其子域)中指定的域名的URL的請求

start_urls
當沒有指定特定URL時,spider將會從strat_urls列表裏頭爬取

start_requests()
此方法必須返回一個iterable,其中包含第一個要爬網的請求;

parse(respone)
這是Scrapy在其請求未指定回調時處理下載的響應時使用的默認回調

CrawlSpider
這是用於抓取常規網站的最經常使用的蜘蛛,由於它經過定義一組規則爲跟蹤連接提供了便利的機制。
除了從Spider繼承的屬性(您必須指定)以外,此類還支持新屬性:

rules
這是一個(或多個)Rule對象的列表。每一個Rule 定義用於爬網站點的特定行爲

parse_start_url(response)

Crawling rules
link_extractor是一個Link Extractor對象,它定義如何從每一個已爬網頁面中提取連接

XMLFeedSpider
XMLFeedSpider旨在經過按某個節點名稱迭代XML feed來解析XML feed。迭代器能夠選自:iternodes,xml,和html
iterator:一個字符串,它定義要使用的迭代器..
'iternodes' - 基於正則表達式的快速迭代器
'html'
'xml'

CSVFeedSpider
這個spider與XMLFeedSpider很是類似,只不過它遍歷行而不是節點。在每次迭代中調用的方法是parse_row()。

Selectors

在抓取網頁時,您須要執行的最多見任務是從HTML源提取數據。有幾個庫可用於實現此目的
BeautifulSoup是Python程序員中很是流行的Web抓取庫,它根據HTML代碼的結構構造一個Python對象,而且合理地處理壞標記,但它有一個缺點:它很慢
lxml是一個XML解析庫(也能夠解析HTML),它使用基於ElementTree的pythonic API
parsel與beautifulsoup也是HTML,XML解析庫
Scrapy帶有本身的提取數據機制。它們被稱爲選擇器
XPath是一種用於在XML文檔中選擇節點的語言,也能夠與HTML一塊兒使用。CSS是一種將樣式應用於HTML文檔的語言。它定義選擇器以將這些樣式與特定HTML元素相關聯.Scrapy選擇器是在lxml庫上構建的

Items

爲了定義通用輸出數據格式,Scrapy提供了Item類。 Item對象是用於收集抓取數據的簡單容器。它們提供相似字典的 API,並具備用於聲明其可用字段的方便語法

item loaders
Items提供了抓取數據的容器,而Item Loaders提供了填充該容器的機制。

Shell

.若是安裝了IPython,Scrapy shell將使用它(而不是標準的Python控制檯)。該IPython的控制檯功能更強大,並提供智能自動完成和彩色輸出,等等;輸入scrapy shell,即進入了shell環境,該環境是以python環境爲基礎的。天然支持python命令

fetch(url[, redirect=True]) - 從給定的URL獲取新響應並相應地更新全部相關對象。您能夠選擇要求HTTP 3xx重定向,而後不要傳遞redirect=False
fetch(request) - 從給定請求中獲取新響應並相應地更新全部相關對象。
view(response) - 在本地Web瀏覽器中打開給定的響應,以進行檢查。

from scrapy.shell import inspect_response
inspect_response(response,self)檢查該響應,進入shell模式

Requests and Responses

Request參數: url callback:- 將使用此請求的響應(一旦下載)調用的函數做爲其第一個參數。若是請求未指定回調,則將使用spider的 parse()方法。請注意,若是在處理期間引起異常,則會調用errback。 method:表示請求中的HTTP方法的字符串。這必須保證是大寫的。例如:"GET","POST","PUT",等

相關文章
相關標籤/搜索