1.遞歸爬取解析多頁頁面數據框架
-需求:將糗事百科頁面的做業和段子內容數據進行爬取持久化存儲dom
-需求分析:每個頁面對應一個url,則scrapy工程須要對每個頁面對應的url依次發起請求,而後經過對應的解析方法進行做者和段子內容的解析異步
實現方法:scrapy
1.將每個頁面對應的url存放到爬取文件的其實url列表(start_list)中.ide
2.使用request方法手動發起請求函數
代碼示例:post
# -*- coding: utf-8 -*- import scrapy from qiushibaike.items import QiushibaikeItem # scrapy.http import Request class QiushiSpider(scrapy.Spider): name = 'qiushi' allowed_domains = ['www.qiushibaike.com'] start_urls = ['https://www.qiushibaike.com/text/'] #爬取多頁 pageNum = 1 #起始頁碼 url = 'https://www.qiushibaike.com/text/page/%s/' #每頁的url def parse(self, response): div_list=response.xpath('//*[@id="content-left"]/div') for div in div_list: #//*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2 author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first() author=author.strip('\n') content=div.xpath('.//div[@class="content"]/span/text()').extract_first() content=content.strip('\n') item=QiushibaikeItem() item['author']=author item['content']=content yield item #提交item到管道進行持久化 #爬取全部頁碼數據 if self.pageNum <= 13: #一共爬取13頁(共13頁) self.pageNum += 1 url = format(self.url % self.pageNum) #遞歸爬取數據:callback參數的值爲回調函數(將url請求後,獲得的相應數據繼續進行parse解析),遞歸調用parse函數 yield scrapy.Request(url=url,callback=self.parse)
2.五大核心組件工做流程:url
引擎(scrapy)spa
用來處理整個系統的數據流處理,觸發四十五(框架核心)code
調度器(scheduler)
用來接收引擎發過來的請求,壓入隊列中,並在引擎再次請求的時候返回,能夠想象成一個url(抓取網頁的網址或者說是連接)的優先隊列,由它來決定下一個要抓取的網址是什麼,同時去除重複的網址
下載器(downloader)
用於下載網頁內容,並將網頁內容返回給蜘蛛(scrapy)下載器是創建在twisted這個高效的異步模塊上的
爬蟲(spiders)
爬蟲主要是幹活的,用於從特定的網頁中提取本身須要的信息,即所謂的實體i(item),用戶也能夠從中提取出連接,讓scrpay繼續抓取下一個頁面
項目管道(pipeline)
負責處理爬蟲從網頁中爬取的實體,主要功能是持久化實體,驗證明體的有效性,清楚不須要的信息,當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據.
3.post請求發送
問題:在以前的代碼中,咱們歷來沒有手動對start_urls列表中存儲的其實url進行過請求的發送,可是其實url的確是進行了請求的發送,那這是如何實現的呢?
解答:實際上是由於爬蟲文件中的爬蟲類繼承到了spider父類中的start_requests(self)這個方法,該方法就能夠對start_url發起請求:
def start_requests(self): for u in self.start_urls: yield scrapy.Request(url=u,callback=self.parse)
[注意]:該方法默認的實現,是對其實的url發起get請求,若是想發起post請求,則須要子類重寫該方法
-方法:重寫start_requests方法,讓其發起post請求
def start_requests(self): #請求的url post_url = 'http://fanyi.baidu.com/sug' # post請求參數 formdata = { 'kw': 'wolf', } # 發送post請求 yield scrapy.FormRequest(url=post_url, formdata=formdata, callback=self.parse)