小白scrapy试炼-爬取慕课网免费课程

本文参考博客:
scrapy爬虫-爬取慕课网全部课程
scrapy爬虫框架入门实例

准备工作:

anaconda(为了简单安装scrapy)

  • 安装scrapy的方法有好多种,原来在pip上花了挺多时间并且还没安装成功,
  • 后来下载了anaconda只用几行指令就成功了,HTTPERROR时可以尝试换镜像或者重启。
  • (如果懒得动手配置环境变量的话安装时把上面的选项打钩)

scrapy(根据框架编写爬虫)

  • 在cmd中使用 scrapy startproject projectname(自定义项目名) 即可创建框架
  • 启动则在项目根路径中 scrapy crawl spiderName(spider类中的name属性)
  • 在cmd中清屏为cls,换路径为cd

可能遇到的坑:

  • 启动时没用到类中字段name对应的名字。
  • item类继承scrapy.item,spiderl类继承的是scrapy.Spider,不要打错了
  • 解析时报错:list index out of range时可能是没获取到字段,应该检查XPaths是否有效

流程

  • 编写流程:item->spider->pipelines
  • 思路流程:获取URL->获取页面->解析页面->存储数据

①创建框架

打开cmd,scrapy startproject name(自定义)

②item类

根据自己想爬取的内容设置字段
name = scrapy.Field()

import scrapy

class CourseItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #标题
    title= scrapy.Field()
    #页面路径
    url= scrapy.Field()
    #图片路径
    image_url= scrapy.Field()
    #课程描述
    introduction= scrapy.Field()
    #观看量
    student= scrapy.Field()

②Spider类

  • url跟进可在完成单页爬取后再加入。
  • 为了更好的匹配字段需要掌握XPath,当然用其他方式也行。
  • 在进行url跟进时,用“下一页”为标记进行URL寻找比较方便。
    name:spider名,启动时需要对应该字段,scrapy crawl name
    allowed_domains:允许域名
    start_urls:爬取的网址
    parse:爬取方法
import scrapy
from imooc_spider.CourseItems import CourseItem

class MySpider (scrapy.Spider):
    #spider启动名
    name="imoocspider"
    #允许访问的域
    allowed_domains=["imooc.com"]
    #爬取地址
    start_urls=["http://www.imooc.com/course/list"]
    #改写parse爬取方法
    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('.//h3/text()').extract()[0].strip()
            #获取div中的标题图片地址
            item['image_url'] = box.xpath('.//@data-original').extract()[0]
            #获取div中的学生人数
            item['student'] = box.xpath('.//span/text()').extract()[1].strip()
            #获取div中的课程简介
            item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()
            #返回信息
            yield item
            
            #url跟进开始(爬取完整的信息)
            url=response.xpath('//a[contains(text(),"下一页")]/@href').extract()
            if url:
                #将信息组合成下一页的url
                page='http://www.imooc.com' + url[0]
                #返回url
                yield scrapy.Request(page,callback=self.parse)
            #url跟进结束

③pipelines类

pipelines用于存储数据,本案例将item存储为json格式
应该是我这理问题,依照参考博们的代码使用__int__方法后
报错指向文件生成这行:self.file.write(line)

from scrapy.exceptions import DropItem
import json

class MyPipeline(object):
    #def __int__(self):
    #	也可以将读取文件置入__int__方法中
    #  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):
        #打开文件
        self.file = open('data.json', 'w', encoding='utf-8')  
    #该方法在spider关闭时被调用
    
    def close_spider(self,spider):
        self.file.close()

结果

在项目根目录出现了data.json文件

小白scrapy试炼-爬取慕课网免费课程_第1张图片

你可能感兴趣的:(python,python)