scrapy框架学习(三)Spiders
Spider類(lèi)定義了如何爬取某個(gè)(或某些)網(wǎng)站。包括了爬取的動(dòng)作(例如:是否跟進(jìn)鏈接)以及如何從網(wǎng)頁(yè)的內(nèi)容中提取結(jié)構(gòu)化數(shù)據(jù)(爬取item)。 也就是說(shuō)我們對(duì)網(wǎng)頁(yè)的解析需要在Spider類(lèi)中定義。
Spider類(lèi)的爬取方式:
①spider中初始的request是通過(guò)調(diào)用 start_requests() 來(lái)獲取的。 start_requests() 讀取 start_urls 中的URL, 并以 parse 為回調(diào)函數(shù)生成 Request。
②在回調(diào)函數(shù)內(nèi)分析返回的(網(wǎng)頁(yè))內(nèi)容,返回 Item 對(duì)象或者 Request 或者一個(gè)包括二者的可迭代容器。 返回的Request對(duì)象之后會(huì)經(jīng)過(guò)Scrapy處理,下載相應(yīng)的內(nèi)容,并調(diào)用設(shè)置的callback函數(shù)(函數(shù)可相同)。
接下來(lái)要完成的是對(duì)貓眼電影TOP100的電影進(jìn)行翻頁(yè)提取電影名+相對(duì)地址
1.更改one_spider.py文件
class SamSpider(scrapy.Spider):name = "sam"start_urls = ["https://maoyan.com/board/4"]url = 'https://maoyan.com/board/4'def parse(self, response):print('>'*50,'獲取數(shù)據(jù)')for sel in response.xpath('//*[@id="app"]/div/div/div/dl/dd'):item = SamzhuItem()item['name'] = sel.xpath('div/div/div[1]/p[1]/a/@title').extract()item['url'] = sel.xpath('div/div/div[1]/p[1]/a/@href').extract()print(item)print('>'*50,'獲取下一頁(yè)請(qǐng)求')a=response.css('.list-pager li:last-child a::attr(href)').extract()[0] #選擇到‘下一頁(yè)’的按鈕if re.search(r'offset',a,re.M|re.I)!=None:print('換頁(yè)成功')yield scrapy.Request(self.url+a, callback=self.parse) #返回一個(gè)requset,設(shè)置callback函數(shù)為parseprint('+'*50)else:print('到達(dá)終點(diǎn)')2.運(yùn)行結(jié)果:
可以發(fā)現(xiàn)每次獲取完一頁(yè)數(shù)據(jù)后,都會(huì)DEBUG輸出一條信息,代表我們發(fā)起了一個(gè)新的請(qǐng)求,可以看到請(qǐng)求的網(wǎng)址就是我們下一頁(yè)的網(wǎng)址,因?yàn)槲覀兿乱豁?yè)的回調(diào)函數(shù)也是本身,所以便構(gòu)成了迭代效果。
?
小結(jié):
上面采用了內(nèi)置的scrapy.Spider,除了這個(gè),還有CrawlSpider。
從這里開(kāi)始已經(jīng)可以開(kāi)始感受到Scrapy的一些魅力了,能夠使自己把更多的時(shí)間精力放在具體的爬蟲(chóng)工作上,而非邏輯搭建。
總結(jié)
以上是生活随笔為你收集整理的scrapy框架学习(三)Spiders的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CCF-CSP真题《202209-4—吉
- 下一篇: MovieClip序列帧动画 视频教程