python爬蟲學習筆記4.3 (Scrapy Shell)

python爬蟲學習筆記4.3 (Scrapy Shell)

Scrapy Shell

Scrapy終端是一個交互終端,我們可以在未啓動spider的情況下嘗試及調試代碼,也可以用來測試XPath或CSS表達式,查看他們的工作方式,方便我們爬取的網頁中提取的數據。

如果安裝了 IPython ,Scrapy終端將使用 IPython (替代標準Python終端)。 IPython 終端與其他相比更爲強大,提供智能的自動補全,高亮輸出,及其他特性。(推薦安裝IPython)

啓動Scrapy Shell

進入項目的根目錄,執行下列命令來啓動shell:

scrapy shell "http://www.itcast.cn/channel/teacher.shtml"

在這裏插入圖片描述
Scrapy Shell根據下載的頁面會自動創建一些方便使用的對象,例如 Response 對象,以及 Selector 對象 (對HTML及XML內容)。

  • 當shell載入後,將得到一個包含response數據的本地 response 變量,輸入 response.body將輸出response的包體,輸出 response.headers 可以看到response的包頭。

  • 輸入 response.selector 時, 將獲取到一個response 初始化的類 Selector 的對象,此時可以通過使用 response.selector.xpath()或response.selector.css() 來對 response 進行查詢。

  • Scrapy也提供了一些快捷方式, 例如 response.xpath()或response.css()同樣可以生效(如之前的案例)。

Selectors選擇器

Scrapy Selectors 內置 XPath 和 CSS Selector 表達式機制
Selector有四個基本的方法,最常用的還是xpath:

  • xpath(): 傳入xpath表達式,返回該表達式所對應的所有節點的selector list列表
  • extract(): 序列化該節點爲字符串並返回list
  • css(): 傳入CSS表達式,返回該表達式所對應的所有節點的selector list列表,語法同 BeautifulSoup4
  • re(): 根據傳入的正則表達式對數據進行提取,返回字符串list列表

XPath表達式的例子及對應的含義:

/html/head/title: 選擇<HTML>文檔中 <head> 標籤內的 <title> 元素
/html/head/title/text(): 選擇上面提到的 <title> 元素的文字
//td: 選擇所有的 <td> 元素
//div[@class="mine"]: 選擇所有具有 class="mine" 屬性的 div 元素

嘗試Selector

我們用騰訊社招的網站http://hr.tencent.com/position.php?&start=0#a舉例:

# 啓動
scrapy shell "http://hr.tencent.com/position.php?&start=0#a"

# 返回 xpath選擇器對象列表
response.xpath('//title')
[<Selector xpath='//title' data='<title>職位搜索 | 社會招聘 | Tencent 騰訊招聘</title'>]

# 使用 extract()方法返回字符串列表
response.xpath('//title').extract()
['<title>職位搜索 | 社會招聘 | Tencent 騰訊招聘</title>']

# 打印列表第一個元素,沒有則返回None
print response.xpath('//title').extract_first()
<title>職位搜索 | 社會招聘 | Tencent 騰訊招聘</title>

#contains的用法,or的用法,last()的含義
In [6]: response.xpath('//*[contains(@class,"odd") or contains(@class,"even")]/td[last()]/text()').extract()
Out[6]:
['2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02',
 '2017-06-02']

 In [4]: response.xpath('//a[contains(@href,"position_detail.php?")]/text()').extract()
 Out[4]:
 ['19407-移動遊戲平臺合作(上海)',
  '19407-手遊商業化與本地化策劃(上海)',
  'OMG236-騰訊視頻平臺高級產品經理(深圳)',
  'OMG096-科技頻道記者(北京)',
  '18402-項目管理',
  'IEG-招聘經理(深圳)',
  'OMG097-視覺設計師(北京)',
  'OMG097-策略產品經理/產品運營(北京)',
  'OMG097-策略產品經理/產品運營(北京)',
  'OMG097-數據產品經理(北京)']

  In [5]: response.xpath('//*[contains(@class,"odd") or contains(@class,"even")]/td[last()-1]/text()').extract()
  Out[5]: ['上海', '上海', '深圳', '北京', '深圳', '深圳', '北京', '北京', '北京', '北京']

以後做數據提取的時候,可以把現在Scrapy Shell中測試,測試通過後再應用到代碼中。

當然Scrapy Shell作用不僅僅如此,但是不屬於我們課程重點,不做詳細介紹。

官方文檔:http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/shell.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章