Python爬蟲學習(七)----Scrapy框架實踐

Scrapy框架

Scrapy框架是一個快速抓取web內容的框架,比我之前寫的那個爬蟲會更簡單,更便捷。

事先說明

本人轉載至http://blog.csdn.net/zjiang1994/article/details/52779537#comments
經原博主同意

具體分析

和原博主一樣,我也是爬取慕課網的頁面(http://www.imooc.com/course/list

下面是具體實現代碼
因爲慕課網的頁面已經改變,所以我重新編寫了選擇器相關代碼,和原博主一樣採用xpath的方式。
難點已經註釋,如有不懂,可以在評論區留下問題


MySpider.py
用來定義爬蟲的基本信息和過濾器方法

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
__author__ = 'Gary'

# 引入庫文件
import scrapy
from lxml import etree
from scrapytest.CourseItem import CourseItem

# 定義爬蟲
class MySpider(scrapy.Spider):
    # 爬蟲的名字,這個在後續會用到
    name = "myspider"
    # 允許訪問的域
    allowed_domains = ["immoc.com"]
    # 爬取的初地址
    start_urls = ["http://www.imooc.com/course/list"]
    # 爬取方法
    def parse(self, response):
        # 實例一個容器保存一個爬取信息
        item = CourseItem()
        # 這部分是爬取部分,使用xpath 選擇
        # 獲取每個課程的div
        for box in response.xpath('//div[@class="course-card-container"]/a[@target="_blank"]'):
            # 獲取每個div中的課程路徑
            item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]
            # 獲取div中的課程標題
            item['title'] = box.xpath('.//div[@class="course-card-content"]/h3/text()').extract()[0]
            # 獲取div中的標題圖片地址
            item['image_url'] = box.xpath('.//div[@class="course-card-top"]/img/@src').extract()[0]
            # 獲取div中的學生人數
            item['student'] = box.xpath('.//span/text()').extract()[1]
            # 獲取div中的課程簡介
            item['introduction'] = box.xpath('.//p/text()').extract()
            # 返回信息
            yield item
            # url跟進開始
            # 獲取下一頁的url信息
        url = response.xpath("//div[contains(.,'下一頁')]//@href").extract()[-2]
        if url:
            # 將信息組合成下一頁的url
            page = 'http://www.imooc.com' + url
            # 返回url
            # 停用過濾功能
            yield scrapy.Request(page, callback=self.parse, dont_filter=True)
            # url跟進結束

pipelines.py
用來與文件相關操作

最後爬取完的頁面使用json文件存儲的,然後圖片下載在當前目錄的images
你只需要在settting裏這樣設置

ITEM_PIPELINES = {
‘scrapytest.pipelines.MyPipeline’: 1,
‘scrapytest.pipelines.ImgPipleLine’: 100,
}
ITEM_PIPELINES是用於註冊pipelines,逗號後的數字表示處理的優先級,1-1000


IMAGES_STORE = ‘/Users/wjh/Desktop/Python/web_crawler/scrapytest/images’
IMAGES_STORE是爲了設置你圖片下載完儲存的目錄


# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import scrapy
from scrapy.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
import json

class ScrapytestPipeline(object):
    def process_item(self, item, spider):
        return item

class MyPipeline(object):
    def __init__(self):
        # 打開文件
        self.file = open('data.json', 'w', encoding = 'utf-8')
    # 該方法用於處理數據
    def process_item (self, item, spider):
        # 讀取item中的數據
        line = json.dumps(dict(item), ensure_ascii=False) + '\n'
        # 寫入文件
        self.file.write(line)
        # 返回item
        return item
    # 該方法在spider被開啓時被調用
    def open_spider(self, spider):
        pass
    def close_spider(self, spider):
        pass

class ImgPipleLine(ImagesPipeline):
    # 通過抓取的圖片url獲取一個Request用於下載
    def get_media_requests(self, item, info):
        # 返回Request 根據托盤url下載
        yield scrapy.Request('http:'+item['image_url'])
    # 當下載請求完成後執行該方法
    def item_completed(self, results, item, info):
        # 獲取下載地址
        image_path = [x['path'] for ok, x in results if ok]
        # 判斷是否成功
        if not image_path:
            raise DropItem('Item contains no images')
        # 將地址存入Item
        item['image_url'] = image_path
        return item

爬取結果如下

這裏寫圖片描述

至此,爬蟲的階段暫一段落,分別利用了無框架和有框架結構,有興趣想下載完整代碼的同學可以訪問我的Github,網址如下

以下爲2個爬蟲項目
https://github.com/Spacider/Spider
https://github.com/Spacider/Scrapy_Programming

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章