一谋作、Scrapy框架的使用步驟:
- 創(chuàng)建項目:
scrapy startproject project_name
- 創(chuàng)建項目:
- cd進(jìn)項目目錄:
cd project_name
- cd進(jìn)項目目錄:
- 創(chuàng)建項目應(yīng)用程序:
scrapy genspider app_name start_url
- 創(chuàng)建項目應(yīng)用程序:
- 編寫爬蟲文件代碼喂窟、settings配置:
codes........
- 編寫爬蟲文件代碼喂窟、settings配置:
- 執(zhí)行爬蟲程序:
scrapy crawl app_name
- 執(zhí)行爬蟲程序:
二、Scrapy初始Url的兩種寫法:
- 一種是常量start_urls,并且需要定義一個方法parse()
import scrapy
class simpleUrl(scrapy.Spider):
name = "simpleUrl"
start_urls = [ #另外一種寫法痕届,無需定義start_requests方法
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
# 此方法名必須為:parse
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'mingyan-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('保存文件: %s' % filename)
- 另一種是直接定義一個方法:star_requests()
import scrapy
class simpleUrl(scrapy.Spider):
name = "simpleUrl"
def start_requests(self):
urls = [
#爬取的鏈接由此方法通過下面鏈接爬取頁面
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
三级乍、Scrapy調(diào)試工具之scrapy shell使用方法:
調(diào)試就是驗證scrapy到底有木有提取到數(shù)據(jù)的工具,如果木有它你根本不知道你寫的規(guī)則到底有木有提取到數(shù)據(jù)竣贪,所以這個工具是個剛需军洼!其實也很簡單,就是在命令行輸入下面一行代碼而已:
scrapy shell start_url
:注意:執(zhí)行此命令時需先cd到項目目錄下
比如我們想提取http://lab.scrapyd.cn
的title
演怎,我們可以在[s]:
后面輸入:response.css('title')
匕争,然后回車, 立馬就得到如下結(jié)果:
似不似很直觀的驗證了你提取的數(shù)據(jù)對不對爷耀?如果正確了甘桑,我們再把上面的代碼放到我們蜘蛛里面,那這樣就會正確的得到你想要的數(shù)據(jù)歹叮,而不會出現(xiàn)意外了跑杭,這就是scrapy調(diào)試工具的應(yīng)用!
四咆耿、Scrapy 爬取下一頁德谅,scrapy整站爬取
接下來,還是繼續(xù)爬热荨:http://lab.scrapyd.cn (鏈接獨白:為神馬受傷的總是我女阀?)!我們既然要爬取下一頁屑迂,那我們首先要分析鏈接格式浸策,找到下一頁的鏈接,那爬取就簡單了
主要代碼實現(xiàn)
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
五惹盼、Scrapy arguments:指定蜘蛛?yún)?shù)爬取
Using spider arguments庸汗,這個東西對于許多朋友來說,簡直是雪中送炭手报,因為有了參數(shù)配置爬取蚯舱,就能加大我們爬取的靈活性改化,而不必重復(fù)修改、編寫爬蟲代碼了枉昏。
比如我們要爬取http://lab.scrapyd.cn里面的數(shù)據(jù)陈肛,原先我們需要全站的,過了幾天需求變了兄裂,我們只需要:“人生”這個標(biāo)簽下面的內(nèi)容句旱,那我們又需要更改爬蟲代碼,又過了幾天晰奖,需求又變谈撒,我們又需要標(biāo)簽:“勵志”下面的內(nèi)容,那我們又得改爬蟲……
如果爬蟲量少還好匾南,那如果有十個啃匿、一百個……那一天到晚我們只能不斷的修改、不斷的伺候這些爬蟲了蛆楞!
那怎樣才能讓我們的爬蟲更靈活呢溯乒?scrapy給我提供了可傳參的爬蟲,有了這么個功能豹爹,那人生就更加美麗了裆悄,上面不斷變化的爬蟲我們就可以這樣來玩,首先按scrapy 參數(shù)格式定義好參數(shù)帅戒,如下:
import scrapy
class ArgsspiderSpider(scrapy.Spider):
name = "argsSpider"
def start_requests(self):
url = 'http://lab.scrapyd.cn/'
# 獲取tag值,也就是爬取時傳過來的參數(shù)
tag = getattr(self, 'tag', None)
# 判斷是否存在tag崖技,若存在逻住,重新構(gòu)造url
if tag is not None:
# 構(gòu)造url若tag=愛情,url= "http://lab.scrapyd.cn/tag/愛情"
url = url + 'tag/' + tag
# 發(fā)送請求爬取參數(shù)內(nèi)容
yield scrapy.Request(url, self.parse)
def parse(self, response):
mingyan = response.css('div.quote')
for v in mingyan:
text = v.css('.text::text').extract_first()
tags = v.css('.tags .tag::text').extract()
tags = ','.join(tags)
fileName = '%s-語錄.txt' % tags
with open(fileName, "a+") as f:
f.write(text)
f.write('\n')
f.write('標(biāo)簽:' + tags)
f.write('\n-------\n')
f.close()
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
代碼寫好之后迎献,那我們要如何傳參呢瞎访?如何運行呢?
比如我們要爬取標(biāo)簽:愛情吁恍,我們可以這樣:
scrapy crawl argsSpider -a tag=愛情
要爬取標(biāo)簽:勵志扒秸,我們可以這樣:
scrapy crawl argsSpider -a tag=勵志
參數(shù):tag=愛情、tag=勵志就可以在爬取的時候傳進(jìn)去我們蜘蛛里面冀瓦,我們就可以不修改蜘蛛伴奥,愉快的爬取了!
六翼闽、scrapy命令明細(xì):
1. Scrapy框架的命令也就十四五個,最常用的命令也就三個拾徙,即:
scrapy startproject(創(chuàng)建項目)、
scrapy crawl XX(運行XX蜘蛛)感局、
scrapy shell http://www.scrapyd.cn(調(diào)試網(wǎng)址為http://www.scrapyd.cn的網(wǎng)站)
2. scrapy命令分為:全局命令尼啡、項目命令暂衡;
很好理解,全局命令就是在哪都能用崖瞭;項目命令就是只能依托你的項目
全局命令
- startproject:
創(chuàng)建項目
scrapy startproject(創(chuàng)建項目)
- genspider:
這個命令的話是根據(jù)爬蟲模板創(chuàng)建爬蟲py文件的命令
scrapy genspider spider_app_name start_url
- settings:
看字面意思狂巢,相信聰明的你已經(jīng)知道它是干嘛的了!其實它就是方便你查看到你對你的scray設(shè)置了些神馬參數(shù)书聚!
比如我們想得到爬蟲項目的下載延遲唧领,我們可以使用:
scrapy settings --get DOWNLOAD_DELAY
比如我們想得到爬蟲項目的名字:
scrapy settings --get BOT_NAME
- runspider:
這個命令有意思,之前我們運行爬蟲項目除了使用:scrapy crawl XX
之外寺惫,我們還能用:runspider
疹吃,前者是基于項目運行,后者是基于文件運行西雀,也就是說你按照scrapy的爬蟲項目格式編寫了一個py文件萨驶,那你不想創(chuàng)建項目,那你就可以使用runspider艇肴,比如你編寫了一個:scrapyd_cn.py的爬蟲文件腔呜,你要直接運行就是:
scrapy runspider scrapy_cn.py
- shell:
這個命令比較重要,主要是調(diào)試用
scrapy shell [http://www.scrapyd.cn](http://www.scrapyd.cn/)
- fetch:
這個命令其實也可以歸結(jié)為調(diào)試命令的范疇再悼!它的功效就是模擬我們的蜘蛛下載頁面核畴,也就是說用這個命令下載的頁面就是我們蜘蛛運行時下載的頁面,這樣的好處就是能準(zhǔn)確診斷出,我們的到的html結(jié)構(gòu)到底是不是我們所看到的,然后能及時調(diào)整我們編寫爬蟲的策略蒜胖!
scrapy fetch [http://www.scrapyd.cn](http://www.scrapyd.cn/)
- version:
查看scrapy版本
scrapy version
項目命令
- crawl:
運行爬蟲文件
scrapy crawl my_project
- check:
檢查爬蟲文件
scrapy check my_project
- list:
顯示有多少個爬蟲文件
scrapy list
- edit:
編輯文件(類似于linux系統(tǒng)下的vim)
scrapy edit my_project
- parse
常用參數(shù)預(yù)覽
scrapy parse my_project
- bench
項目詳細(xì)運行情況
scrapy bench my_project