scrapy簡單入門及選擇器(xpath\css)


簡介

  scrapy被認為是比較簡單的爬蟲框架,資料比較齊全,網上也有很多教程。官網上介紹了它的四種安裝方法,PyPI、Conda、APT、Source,我們只介紹最簡單的安裝方法。

 

安裝

Windows下的安裝

  pip install scrapy

Linux下的安裝

  apt-get install python-scrapy

  APT

 

vim編輯器

  因為Linux的強大及輔助工具比較多,大家比較喜歡在Linux下使用scrapy爬蟲框架,Linux下編寫python代碼最強大的工具可屬eclipse,但最方便的要屬vi的強化版本vim了,對不同的編程語言配合不同的插件,可將vim配置成為一個專屬的IDE。

 

VIM模塊

 

選擇器XPath和CSS

  XPath是一門在XML文檔中查找信息的語言,可用來在XML文檔中對元素和屬性進行遍歷。它有七點類型的節點:元素、屬性、文本、命名空間、處理指令、注釋及文檔節點(根節點),XML文檔是被作為節點樹來對待的,樹的根被稱為根節點。

  XPath使用路徑表達式在XML文檔中選取節點。

  XPath最常用的路徑表達式:

  

 

  xpath示例代碼

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>

  舉例說明:

bookstore  選取bookstore元素的所有子節點
/bookstore  選擇根元素下的bookstore元素,假如路徑起始於/
bookstore/book  選取bookstoe的所有子元素中為book的元素
//book  選取文檔中的所有book元素,不管它在什么位置
//bookstore//book   選擇屬於bookstore元素后代的所有book元素,不管它在什么位置
//@lang 選擇所有屬性為lang的元素
/bookstore/book[1]      選取bookstore子元素中的第一個book元素
/bookstore/book[last()]   選取bookstore子元素中的最后一個book元素
/bookstore/book[last()-1]   選取bookstore子元素中倒數第二個book元素
/bookstore/book[postion()<3] 選取bookstore子元素中前兩個book元素
//title[@lang]              選取所有title元素且其屬性擁有lang名
//title[@lang='en']         選取所有title元素且其屬性擁有lang='en'
/bookstore/book[price>30]   選取bookstore元素下所有子元素中元素price>30book的元素
/title/text()  提取title標簽上的文字
/a/@href  提取a標簽的href屬性值  
response.xpath("//a[contains(.,'下一頁')]/text()")[1].extract() # 根據文本內容查找

  未知節點

* 任何元素節點
@*    任何屬性節點

/bookstore/*    bookstore元素下的所有子元素
//*             當前文檔的所有元素
//title[@*]     所有帶有屬性的title元素

  選取若干路徑 

//book/title|//book/price       選取book元素下的所有title和price元素
//title|//price                 選取文檔中的所有title和price元素

   示例代碼2:

<superhero>
    <class>
        <name lang="en">Tony Stark</name>
        <alias>Iron Man</alias>
        <sex>male</sex>
        <birthday>1969</birthday>
        <age>47</age>
    </class>
    <class>
        <name lang="en">Perter Benjamin</name>
        <alias>Spider Man</alias>
        <sex>male</sex>
        <birthday>unknow</birthday>
        <age>unknow</age>
    </class>
    <class>
        <name lang="en">Steven Rogers</name>
        <alias>Captain America</alias>
        <sex>male</sex>
        <birthday>19200704</birthday>
        <age>96</age>
    </class>
</superhero>

分析以上代碼:superhero是根節點,alias是元素節點,lang="en"是屬性節點。

  小試牛刀

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

from scrapy.selector import Selector

with open("superHero.xml",'r') as fp:
    body = fp.read()

htmlContent = Selector(text=body).xpath("/*").extract()
print htmlContent
結果:XML文件轉成了標准的HTML文件,根節點不再是superhero而是html 

  數據收集的比較

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

from scrapy.selector import Selector

with open("superHero.xml",'r') as fp:
    body = fp.read()

# 采集第一個class節點中的內容,text表示傳入的內容是字符串
Selector(text=body).xpath("//superhero/class[0]").extract()
Selector(text=body).css("superhero class:first-child").extract()

# 采集最后一個class節點中的內容
Selector(text=body).xpath("//superhero/class[last()]").extract()
Selector(text=body).css("superhero class:last-child").extract()

# 采集倒數第二個class節點中name節點的文本,text()表示獲取文本
Selector(text=body).xpath("//superhero/class[last()-1]/name/text()").extract()
Selector(text=body).css("superhero class:nth-last-child(2) name").extract()[0]

# 采集節點name,其屬性節點lang='en'的元素,@前綴代表屬性名稱(@lang代表lang屬性,用中括號圈起來)
Selector(text=body).xpath("//name[@lang='en']").extract()
Selector(text=body).css("name[lang='en']").extract()

# 嵌套選擇器,選擇最后一個class節點中sex節點的內容
subBody = Selector(text=body).xpath("//superhero/class[last()]").extract()
Selector(text=subBody[0]).xpath("/html/body/class/sex/text()").extract()
Selector(text=subBody[0]).xpath("//class/sex/text()").extract()

 

  CSS:層疊樣式表

  CSS經常使用的幾個選擇器:

  

   css也可以嵌套使用,所以它和xpath可以互相嵌套,使用數據收集功能更加強大。

   CSS示例代碼(同示例代碼2):

s.css("title::text").extract_first()  # 提取title標簽的文本
s.css("base::attr(href)").extract_first() # 提取base標簽的herf屬性值
s.css("a[href^=image]::attr(href)").extract() # 提取以image開頭的屬性列表
s.xpath('//a[contains(@href, "image")]/@href').extract()  # href屬性中包含image字符串列表
s.css('a[href^=image]::text').re(r'Name:\s(.*)')  # 正則也可以序列化數據,返回括號中的文本串

 

好,scrapy的基本情況已經介紹完了,下面來嘗試通過使用模板的方式來創建一個爬蟲吧。

1、創建一個目錄用來存放所有的爬蟲工程

$mkdir -p code/crawler/scrapyProject

2、在工程目錄下創建首個爬蟲工程

cd code/crawler/scrapyProject/

scrapy startproject todayMovie

 

3、為此工程創建爬蟲程序

$ scrapy genspider wuHanMoiveSpider jycimima.com --force

4、使用tree命令查看此工程目錄

 

  第一級todayMovie:此工程名稱

  第二級todayMovie: 此工程模塊,存放此工程所有的爬蟲代碼

  scrapy.cfg: 此工程的全局配置文件

  items.py: 定義了一個類,存放爬蟲最終爬取的項目,數據最終以字典的形式表現,鍵值為列表。

  wuHanMoiveSpider.py: 真正的爬蟲程序,用來爬取網頁內容,並生成item數據。

  settings.py:配置由誰去處理爬取的item數據。

  piplines.py: 逐條處理爬取的item數據。

5、scrapy框架流程圖:

 

 


免責聲明!

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



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