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