從零開始寫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一些新的功能進去,

我們要爬的網址是:字幕庫: 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 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.ml

Github: Ehco1996/Python-crawler

推薦閱讀:

爬取Ajax動態載入和翻頁時url不變的網頁
從零開始寫Python爬蟲 --- 爬蟲應用:今天吃什麼?
圖中黃黑相間的是什麼品種的蜘蛛?
從零開始寫Python爬蟲 --- 3.2 爬蟲實踐:獲取快代理

TAG:Python | 爬虫 | scrapy |