scrapy爬取類似頁面及回調爬取問題(以慕課網爲例)

以爬取慕課網數據爲例
 
慕課網的數據很簡單,就是經過get方式獲取的
根據page參數來分頁
 
 
這個時候有兩種爬取方式
 
一種是獲取到跳轉到下一頁的連接,經過遞歸回調爬取函數來完成爬取過程
主要代碼以下:經過css選擇器獲取到下一頁的連接,再經過urljoin獲取到絕對連接
在這裏的scrapy.Request方法,這是 Scrapy的跟蹤連接機制:當你在回調方法中產生一個Request時,Scrapy會安排發送該請求並註冊一個回調方法,以便在該請求完成時執行
 
import scrapy
class imoocall_Spider(scrapy.Spider):
    name = "imoocall"
    start_urls = [
        'https://www.imooc.com/course/list?page=2',
    ]
 
    def parse(self, response):
        for course in response.css('div.course-card-container'):
            yield {
                '類別': course.css('label::text').extract_first(),
                '課程名': course.css('h3::text').extract_first(),
                '難度級別': course.css('span::text').extract(),
                '簡介': course.css('p::text').extract_first(),
            }
 
        next_page = response.css('div.page a::attr("href")')[9].extract()
        if next_page is not None:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, self.parse)

 

 
第二種就是for循環,主要用來處理重複頁面數較少,或者所要爬取頁面的分頁機制不是很規律就能夠使用for循環
 
主要代碼以下:
import scrapy
 
class imooc_Spider(scrapy.Spider):
    name = "imooc"
 
    def start_requests(self):
        for num in range(1,32):
            numstr = str(num)
            url = "https://www.imooc.com/course/list?page="+numstr
            yield scrapy.Request(url=url, callback=self.parse)
 
    def parse(self, response):
        for course in response.css('div.course-card-container'):
            yield {
                '類別': course.css('label::text').extract_first(),
                '課程名': course.css('h3::text').extract_first(),
                '難度級別': course.css('span::text').extract(),
                '簡介': course.css('p::text').extract_first(),
            }

 

注意要將int型強制轉換爲string後才能拼接
 
以後直接進入你的spider頁面運行  scrapy runspider imooc_spider.py -o imooc.csv就能夠了,
 
爬取的部分數據以下~
sa
 
以上就是爬取慕課網的所有過程,爬取極客學院和騰訊課堂、csdn學院等,均可以用這種方法爬取,他們的數據都是後臺傳值後直接寫進頁面的,若是是經過js加載數據的狀況經過這種方式就不行,網易雲課堂,網易雲公開課就是經過js加載post數據的。
相關文章
相關標籤/搜索