Scrapy入门教程
本文參考Scrapy Tutorial里面的文檔,翻譯出來加上自己的理解,供大家學習。
在本文中,我們將學會如何使用Scrapy建立一個爬蟲程序,并爬取指定網站上的內容,這一切在Scrapy框架內實現將是很簡單輕松的事情。
本教程主要內容包括一下四步:
1.?創建一個新的Scrapy Project
2.?定義你需要從網頁中提取的元素Item
3.?實現一個Spider類,通過接口完成爬取URL和提取Item的功能
4.?實現一個Item PipeLine類,完成Item的存儲功能
新建工程
首先,為我們的爬蟲新建一個工程,首先進入一個目錄(任意一個我們用來保存代碼的目錄),執行:
| 1 | scrapy startproject Domz |
最后的Domz就是項目名稱。這個命令會在當前目錄下創建一個新目錄Domz,結構如下:
| 1 2 3 4 5 6 7 8 9 | dmoz/scrapy.cfg dmoz/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py |
scrapy.cfg: 項目配置文件
items.py: 需要提取的數據結構定義文件
pipelines.py: 管道定義,用來對items里面提取的數據做進一步處理,如保存等
settings.py: 爬蟲配置文件
spiders: 放置spider的目錄
定義Item
在items.py里面定義我們要抓取的數據:
| 1 2 3 4 5 6 | from scrapy.item import Item, Fieldclass DmozItem(Item):title = Field()link = Field()desc = Field() |
這里我們需要獲取dmoz頁面上的標題,鏈接,描述,所以定義一個對應的items結構,不像Django里面models的定義有那么多種類的Field,這里只有一種就叫Field(),再復雜就是Field可以接受一個default值。
實現Spider
spider只是一個繼承字scrapy.spider.BaseSpider的Python類,有三個必需的定義的成員
name:?名字,這個spider的標識
start_urls:?一個url列表,spider從這些網頁開始抓取
parse():?一個方法,當start_urls里面的網頁抓取下來之后需要調用這個方法解析網頁內容,同時需要返回下一個需要抓取的網頁,或者返回items列表
所以在spiders目錄下新建一個spider,dmoz_spider.py:
| 1 2 3 4 5 6 7 8 9 10 | class DmozSpider(BaseSpider):name = "dmoz.org"start_urls = ["http://www.dmoz.org/Computers/Programming/Languages/Python/Books/","http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"]def parse(self, response):filename = response.url.split("/")[-2]open(filename, 'wb').write(response.body) |
提取Item
提取數據到Items里面,主要用到XPath提取網頁數據:
scrapy有提供兩個XPath選擇器,HtmlXPathSelector和XmlXPathSelector,一個用于HTML,一個用于XML,XPath選擇器有三個方法
select(xpath): 返回一個相對于當前選中節點的選擇器列表(一個XPath可能選到多個節點)
extract(): 返回選擇器(列表)對應的節點的字符串(列表)
re(regex): 返回正則表達式匹配的字符串(分組匹配)列表
一種很好的方法是在Shell里面對XPath進行測試:
| 1 | scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/ |
現在修改parse()方法看看如何提取數據到items里面去:
| 1 2 3 4 5 6 7 8 9 10 11 | def parse(self, response):hxs = HtmlXPathSelector(response)sites = hxs.select('//ul/li')items = []for site in sites:item = DmozItem()item['title'] = site.select('a/text()').extract()item['link'] = site.select('a/@href').extract()item['desc'] = site.select('text()').extract()items.append(item)return items |
實現PipeLine
PipeLine用來對Spider返回的Item列表進行保存操作,可以寫入到文件、或者數據庫等。
PipeLine只有一個需要實現的方法:process_item,例如我們將Item保存到一個文件中:
| 1 2 3 4 5 | def __init__(self):self.file = open('jingdong.txt', 'wb')def process_item(self, item, spider):self.file.write(item['title'] + '\t'+ item['link'] + '\t' + item['desc']+'\n') |
到現在,我們就完成了一個基本的爬蟲的實現,可以輸入下面的命令來啟動這個Spider:
| 1 | scrapy crawl dmoz.org |
原創文章,轉載請注明:轉載自CodeLogic[http://www.icodelogic.com]
本文鏈接地址:?http://www.icodelogic.com/?p=441
總結
以上是生活随笔為你收集整理的Scrapy入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 爬虫抓站
- 下一篇: scapy递归爬