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