python爬虫框架scrapy实例详解_python爬虫框架scrapy实例详解
生成項(xiàng)目
scrapy提供一個(gè)工具來(lái)生成項(xiàng)目,生成的項(xiàng)目中預(yù)置了一些文件,用戶需要在這些文件中添加自己的代碼。
打開命令行,執(zhí)行:scrapy startproject tutorial,生成的項(xiàng)目類似下面的結(jié)構(gòu)
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
scrapy.cfg是項(xiàng)目的配置文件
用戶自己寫的spider要放在spiders目錄下面,一個(gè)spider類似
name屬性很重要,不同spider不能使用相同的name
start_urls是spider抓取網(wǎng)頁(yè)的起始點(diǎn),可以包括多個(gè)url
parse方法是spider抓到一個(gè)網(wǎng)頁(yè)以后默認(rèn)調(diào)用的callback,避免使用這個(gè)名字來(lái)定義自己的方法。
當(dāng)spider拿到url的內(nèi)容以后,會(huì)調(diào)用parse方法,并且傳遞一個(gè)response參數(shù)給它,response包含了抓到的網(wǎng)頁(yè)的內(nèi)容,在parse方法里,你可以從抓到的網(wǎng)頁(yè)里面解析數(shù)據(jù)。上面的代碼只是簡(jiǎn)單地把網(wǎng)頁(yè)內(nèi)容保存到文件。
開始抓取
你可以打開命令行,進(jìn)入生成的項(xiàng)目根目錄tutorial/,執(zhí)行 scrapy crawl dmoz, dmoz是spider的name。
解析網(wǎng)頁(yè)內(nèi)容
scrapy提供了方便的辦法從網(wǎng)頁(yè)中解析數(shù)據(jù),這需要使用到HtmlXPathSelector
HtmlXPathSelector使用了Xpath來(lái)解析數(shù)據(jù)
//ul/li表示選擇所有的ul標(biāo)簽下的li標(biāo)簽
a/@href表示選擇所有a標(biāo)簽的href屬性
a/text()表示選擇a標(biāo)簽文本
a[@href="abc"]表示選擇所有href屬性是abc的a標(biāo)簽
我們可以把解析出來(lái)的數(shù)據(jù)保存在一個(gè)scrapy可以使用的對(duì)象中,然后scrapy可以幫助我們把這些對(duì)象保存起來(lái),而不用我們自己把這些數(shù)據(jù)存到文件中。我們需要在items.py中添加一些類,這些類用來(lái)描述我們要保存的數(shù)據(jù)
from scrapy.item import Item, Field
class DmozItem(Item):
title = Field()
link = Field()
desc = Field()
然后在spider的parse方法中,我們把解析出來(lái)的數(shù)據(jù)保存在DomzItem對(duì)象中。
在命令行執(zhí)行scrapy的時(shí)候,我們可以加兩個(gè)參數(shù),讓scrapy把parse方法返回的items輸出到j(luò)son文件中
scrapy crawl dmoz -o items.json -t json
items.json會(huì)被放在項(xiàng)目的根目錄
讓scrapy自動(dòng)抓取網(wǎng)頁(yè)上的所有鏈接
上
面的示例中scrapy只抓取了start_urls里面的兩個(gè)url的內(nèi)容,但是通常我們想實(shí)現(xiàn)的是scrapy自動(dòng)發(fā)現(xiàn)一個(gè)網(wǎng)頁(yè)上的所有鏈接,然后再
去抓取這些鏈接的內(nèi)容。為了實(shí)現(xiàn)這一點(diǎn)我們可以在parse方法里面提取我們需要的鏈接,然后構(gòu)造一些Request對(duì)象,并且把他們返回,scrapy
會(huì)自動(dòng)的去抓取這些鏈接。代碼類似:
parse
是默認(rèn)的callback,
它返回了一個(gè)Request列表,scrapy自動(dòng)的根據(jù)這個(gè)列表抓取網(wǎng)頁(yè),每當(dāng)抓到一個(gè)網(wǎng)頁(yè),就會(huì)調(diào)用parse_item,parse_item也會(huì)
返回一個(gè)列表,scrapy又會(huì)根據(jù)這個(gè)列表去抓網(wǎng)頁(yè),并且抓到后調(diào)用parse_details
為了讓這樣的工作更容易,scrapy提供了另一個(gè)spider基類,利用它我們可以方便的實(shí)現(xiàn)自動(dòng)抓取鏈接. 我們要用到CrawlSpider
相
比BaseSpider,新的類多了一個(gè)rules屬性,這個(gè)屬性是一個(gè)列表,它可以包含多個(gè)Rule,每個(gè)Rule描述了哪些鏈接需要抓取,哪些不需
要。這是Rule類的文檔http://doc.scrapy.org/en/latest/topics
/spiders.html#scrapy.contrib.spiders.Rule
這些rule可以有callback,也可以沒(méi)有,當(dāng)沒(méi)有callback的時(shí)候,scrapy簡(jiǎn)單的follow所有這些鏈接.
pipelines.py的使用
在pipelines.py中我們可以添加一些類來(lái)過(guò)濾掉我們不想要的item,把item保存到數(shù)據(jù)庫(kù)。
如果item不符合要求,那么就拋一個(gè)異常,這個(gè)item不會(huì)被輸出到j(luò)son文件中。
要使用pipelines,我們還需要修改settings.py
添加一行
ITEM_PIPELINES = ['dirbot.pipelines.FilterWordsPipeline']
現(xiàn)在執(zhí)行scrapy crawl dmoz -o items.json -t json,不符合要求的item就被過(guò)濾掉了
總結(jié)
以上是生活随笔為你收集整理的python爬虫框架scrapy实例详解_python爬虫框架scrapy实例详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 民生银行附属卡欠款谁来还
- 下一篇: python组合函数_Python---