從零開始寫Python爬蟲 --- 2.2 Scrapy 選擇器和基本使用
在正式使用Scrapy框架之前,我們必須先了解它是如何篩選數據的,Scrapy有自己的一套數據選擇器,比如Xpath和CCSS選擇器。並且這些選擇器構造於『lxml』之上,這就意味著Scrapy框架下的數據篩選有著很高的效率。
基本選擇器:
Scrapy爬蟲支持多種信息提取的方法:
- Beautiful Soup
- Lxml
- re
- XPath Selector
- CSS Selector
在前面的爬蟲實例中,我們大量的使用了bs4選擇器,所以這裡我就不過多介紹了。這裡我主要說一下關於Xpath的使用。
首先介紹一下XPath:
XPath 是一門在xml文檔中查找信息的語言,它可以在XML文檔中對於原色和屬性進行遍歷。其內置了超過100個內建函數,這些函數用於對字元串值,數值、日期、時間進行比較遍歷。總之是一門很方便的語言。如過要具體學習請看
菜鳥教程-Xpath:XPath 教程 | 菜鳥教程
在網路爬蟲中,我們只需要利用XPath來採集數據,所以只要掌握一些基本語法,就可以上手使用了。
基本使用語法:
直接看這個表:
實例介紹:
下面我們將以這個demo.xml為例子來介紹:
<html>n <body>n <class>n <name>王尼瑪</name>n <sex>男</sex>n <age>80</age>n <favouite>開車</favouite>n </class>n <class>n <name>陳一發</name>n <sex>母</sex>n <age>28</age>n <favouite>開che</favouite>n </class>n <class>n <name>狗賊叔叔</name>n <sex>公</sex>n <age>18</age>n <favouite>土豪戰</favouite>n </class>n </body>n</html>n
先將我們需要使用的模塊導入(調試環境為ipython):
In [1]: from scrapy.selector import SelectornnIn [2]: body = open(demo.xml,r).read()nnIn [3]: print(body)n<html>n <body>n <class>n <name>王尼瑪</name>n <sex>男</sex>n <age>80</age>n <favouite>開車</favouite>n </class>n <class>n <name>陳一發</name>n <sex>母</sex>n <age>28</age>n <favouite>開che</favouite>n </class>n <class>n <name>狗賊叔叔</name>n <sex>公</sex>n <age>18</age>n <favouite>土豪戰</favouite>n </class>n </body>n</html>nnIn [4]: bodynOut[4]: <html>n <body>n <class>n <name>王尼瑪</name>n <sex>男</sex>n <age>80</age>n <favouite>開車</favouite>n </class>n <class>n <name>陳一發</name>n <sex>母</sex>n <age>28</age>n <favouite>開che</favouite>n </class>n <class>n <name>狗賊叔叔</name>n <sex>公</sex>n <age>18</age>n <favouite>土豪戰</favouite>n </class>n </body>n</html>nnIn [5]: n
下面我們來舉幾個小例子,說明一下如何通過xpath找到我們想要的數據:
在Xpath中最常用的方法大該就是這些了,
如果你還是不太習慣Xpath的用法,你依舊可以通過老的bs4庫的方式去篩選數據。
Scrapy框架的具體使用:
我們來通過一個super簡單的例子來介紹Scrapy框架的使用,
第一個例子本著越簡單越好的原則,幫助大家快速入門,當然,如果不滿足於簡單例子,可以自己動手diy一些新的功能進去,我們要爬的網址是:字幕庫: http://zimuku.net為了簡便,我們只準備抓取字幕標題步驟一:創建一個工程和Spider模板
我們先用命令行創建一個Scrapy工程:
scrapy startproject zimukun
cd zimukun
treen# OUT:n.n├── zimuku #外層目錄n│ ├── __init__.py #初始化腳本 n│ ├── __pycache__ #Python緩存文件。暫時無視n│ ├── items.py #Items代碼模板,繼承類自scrapy.Itemn│ ├── middlewares.py #Middlewares代碼模板(繼承類)n│ ├── pipelines.py #Pipelines代碼模板(繼承類)n│ ├── settings.py #Scrapy爬蟲的配置文件n│ └── spiders #Spiders代碼模板目錄 我們寫爬蟲的地方n│ ├── __init__.pyn│ └── __pycache__n└── scrapy.cfg #部署爬蟲的配置文件nn4 directories, 7 filesn
最後,我們用命令行創建第一個Spider:
scrapy genspider demo http://zimuku.net這樣我們就創建了一個名為demo的爬蟲了。我們來看看他長什麼樣,打開/spiders/demo.py:
# -*- coding: utf-8 -*-nimport scrapynclass DemoSpider(scrapy.Spider):n name = "demo"n allowed_domains = ["zimuku.net"]n start_urls = [http://zimuku.net/]n def parse(self, response):n passn
可以看到,Scrapy已經幫我們把爬蟲的框架寫好了,我們只要在這個框架的基礎上進行進一步的定製就可以了。
步驟二:編寫Spider
我們來著手定製我們的爬蟲吧:
看一下詳細的注釋# -*- coding: utf-8 -*-nimport scrapynn# 將我們需要爬的項目引入進來nfrom zimuku.items import ZimukuItemnnclass DemoSpider(scrapy.Spider):n n #該爬蟲的名字n name = "demo"n n #規定爬蟲爬取網頁的域名 n allowed_domains = ["zimuku.net"]n n #開始爬取的url鏈接n start_urls = [http://zimuku.net/]nn def parse(self, response):n n parse()函數接收Response參數,就是網頁爬取後返回的數據n 用於處理響應,他負責解析爬取的內容n 生成解析結果的字典,並返回新的需要爬取的請求n nn #由於是demo 我們不做完全的功能,n #只要求爬取出第一個字幕的名字n #xpath規則可以通過查看網頁源文件得出n name = response.xpath(//b/text()).extract()[1]nn #建立一個items字典,用於保存我們爬到的結果,並返回給pipline處理n items = {}n items[第一個]= namenn return itemsn
步驟三:編寫Item Pipeline
首先我們編寫itmes.py來定義這個爬蟲框架需要爬哪些內容:
# -*- coding: utf-8 -*-nn# Define here the models for your scraped itemsn#n# See documentation in:n# http://doc.scrapy.org/en/latest/topics/items.htmlnnimport scrapynclass ZimukuItem(scrapy.Item):n # define the fields for your item here like:n # name = scrapy.Field()n subname = scrapy.Field() #字母的名字n
接著我們編寫 piplines.py來處理spider爬到的內容:
# -*- coding: utf-8 -*-nn# Define your item pipelines heren#n# Dont forget to add your pipeline to the ITEM_PIPELINES settingn# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlnclass ZimukuPipeline(object):n def process_item(self, item, spider):nn # 只要求簡單的話,n # 我們把爬到的結果列印一下吧n print(item)nn return itemn
步驟四:優化配置Settings.py
BOT_NAME = zimukunnSPIDER_MODULES = [zimuku.spiders]nNEWSPIDER_MODULE = zimuku.spidersnROBOTSTXT_OBEY = Truen#只增加了這一行,通過配置告訴Scrapy明白是誰來處理結果nITEM_PIPELINES={zimuku.pipelines.ZimukuPipeline:300,}n
結果:
首先我們通過命令來執行爬蟲:
scrapy crawl demon
來看一下結果:
截取部分:2017-05-11 21:29:42 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.zimuku.net/>n{第一個: 綠箭俠 第五季(第21集-簡繁英雙語字幕)Arrow.S05E21.720p.HDTV.x264-SVA.zip}n
好了,通過這個super簡單的小例子,我們知道了Scrapy框架到底是如何運作的,
但是這真的是簡單到不能再簡單的例子,更多的用法,我會在以後的實例中進行展開~每天的學習記錄都會 同步更新到:
微信公眾號: findyourownway
知乎專欄:從零開始寫Python爬蟲 - 知乎專欄blog : www.ehcoblog.mlGithub: Ehco1996/Python-crawler
推薦閱讀:
※爬取Ajax動態載入和翻頁時url不變的網頁
※從零開始寫Python爬蟲 --- 爬蟲應用:今天吃什麼?
※圖中黃黑相間的是什麼品種的蜘蛛?
※從零開始寫Python爬蟲 --- 3.2 爬蟲實踐:獲取快代理