使用scrapy爬虫框架爬取慕课网全部课程信息

爬取的链接: http://www.imooc.com/course/list
爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述
1.安装scrapy模块

pip install scrapy

2.新建项目

scrapy startproject mySpider(项目名)
cd mySpider
tree # 可以看到文件中的树状图
├── mySpider
│   ├── __init__.py
│   ├── items.py            # 提取的数据信息
│   ├── middlewares.py      # 中间键
│   ├── pipelines.py        # 管道, 如何存储数据
│   ├── __pycache__
│   ├── settings.py         # 设置信息
│   └── spiders             # 爬虫(解析页面的信息)
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

3.定义爬取的items内容(编写items.py)

class CourseItem(scrapy.Item):
    # 课程标题
    title = scrapy.Field()
    # 课程的url地址
    url = scrapy.Field()
    # 课程图片url地址
    image_url = scrapy.Field()
    # 课程的描述
    introduction = scrapy.Field()
    # 学习人数
    student = scrapy.Field()

4.创建一个爬虫,编写代码进行解析

scrapy  genspider  mooc(文件名,可自取) "www.imooc.com"(允许爬取的域名)
cd mySpider/spiders/
编写mooc.py文件

# 从items.py 导入Courseltem类
from mySpider.items import CourseItem

class MoocSpider(scrapy.Spider):
    # name: 用于区别爬虫, 必须是唯一的;
    name = 'mooc'
    # 允许爬取的域名;其他网站的页面直接跳过;
    allowed_domains = ['www.imooc.com']
    # 爬虫开启时第一个放入调度器的url地址;
    start_urls = ['http://www.imooc.com/course/list'] # 这里放入我们所需要的页面信息的url地址

    # 被调用时, 每个初始url完成下载后, 返回一个响应对象(response),
    # 负责将响应的数据分析, 提取需要的数据items以及生成下一步需要处理的url地址请求;
    def parse(self, response):

        # 1). 实例化对象, CourseItem
        course = CourseItem()
        # 分析响应的内容
        # scrapy分析页面使用的是xpath语法
        # 2). 获取每个课程的信息: <div class="course-card-container">
        courseDetails = response.xpath('//div[@class="course-card-container"]')
        for courseDetail in courseDetails:
            # 课程的名称:
            # "htmlxxxx"


            
            course['title'] = courseDetail.xpath('.//h3[@class="course-card-name"]/text()').extract()[0]
            # 学习人数
            course['student'] = courseDetail.xpath('.//span/text()').extract()[1]
            # 课程描述:
            course['introduction'] = courseDetail.xpath(".//p[@class='course-card-desc']/text()").extract()[0]
            # 课程链接, h获取/learn/9 ====》 http://www.imooc.com/learn/9
            course['url'] = "http://www.imooc.com" + courseDetail.xpath('.//a/@href').extract()[0]
            # 课程的图片url:
            course['image_url'] = 'http:' + courseDetail.xpath('.//img/@src').extract()[0]

            yield  course


			# 爬取新的网站, Scrapy里面进行调试(parse命令logging)
            # url跟进, 获取下一页是否有链接;href
            url  = response.xpath('.//a[contains(text(), "下一页")]/@href')[0].extract()
            if url:
                # 构建新的url
                page = "http://www.imooc.com" + url
                yield scrapy.Request(page, callback=self.parse)

5.存储爬虫(编写pipelines.py文件和settings.py文件)
1.编写pipelines.py文件
1).将爬取的信息保存为Json格式

class MyspiderPipeline(object):
    """将爬取的信息保存为Json格式"""
    def __init__(self):
        self.f = open('mooc.txt', 'w')

    def process_item(self, item, spider):
        # 默认传过来的item是json格式
        import json
        # 读取item中的数据, 并转成json格式;
        line = json.dumps(dict(item), ensure_ascii=False, indent=4)
        self.f.write(line + '\n')
        # 一定要加, 返回给调度器;
        return item
    def open_spider(self, spider):
        """开启爬虫时执行的函数"""
        pass

    def close_spider(self, spider):
        """当爬虫全部爬取结束的时候执行的函数"""
        self.f.close()

2).将爬取的信息保存为csv数据格式

class CsvPipeline(object):
    #保存为csv数据格式
    def __init__(self):
        self.f  = open('mooc.csv','w')
    def process_item(self, item, spider):
        #默认传过来的item为json数据
        item =  dict(item)
        self.f.write("{0}:{1}:{2}:{3}:{4}\n".format(item['title'],
                                            item['student'],
                                            item['introduction'],
                                            item['url'],
                                            item['image_url']))
        return item

    def open_spider(self, spider):
        """开启爬虫时执行的函数"""
        pass

    def close_spider(self, spider):
        """当爬虫全部爬取结束的时候执行的函数"""
        self.f.close()

3).将爬取的信息存储到mysql数据库中

###创建Mooc数据库,并指定编码格式为utf-8
create database Mooc DEFAULT CHARACTER SET utf8
 
import pymysql

class MysqlPipeline(object):
    """
    将爬取的信息保存到数据库中
   
    """
    def __init__(self):
        super(MysqlPipeline, self).__init__()
        self.conn = pymysql.connect(
            host='localhost',
            user='root',
            password='redhat',
            db='Mooc',
            charset='utf8',
        )

        self.cursor = self.conn.cursor()

    def process_item(self, item, spider):
        # xxxx:xxxxx:xxxx
        # item时一个对象,
        item = dict(item)
        info = (item['title'], item['url'], item['image_url'], item['introduction'], item['student'])
        insert_sqli = "insert into moocinfo values('%s', '%s', '%s', '%s', '%s'); " %(info)
        # open('mooc.log', 'w').write(insert_sqli)
        # # 用来检测代码是否达到指定位置, 并用来调试并解析页面信息;
        self.cursor.execute(insert_sqli)
        self.conn.commit()
        return item

    def open_spider(self, spider):
        """开启爬虫时执行的函数"""
        create_sqli = "create table if not exists  moocinfo (title varchar(50), url varchar(200), image_url varchar(200), introduction varchar(500), student int)"
        self.cursor.execute(create_sqli)

    def close_spider(self, spider):
        """当爬虫全部爬取结束的时候执行的函数"""
        self.cursor.close()
        self.conn.close()

4).下载爬取信息中的图片

import  scrapy
from  scrapy.pipelines.images import ImagesPipeline

# scrapy框架里面,
class ImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        # 返回一个request请求, 包含图片的url地址
        yield  scrapy.Request(item['image_url'])

    # 当下载请求完成后执行的函数/方法
    def item_completed(self, results, item, info):

        # open('mooc.log', 'w').write(results)
        #  获取下载的地址
        image_path = [x['path'] for ok,x in results if ok]
        if not image_path:
            raise  Exception("不包含图片")
        else:
            return  item

2.编写settings.py文件

打开项目名字和爬虫模块说明,引擎根据这个信息找到爬虫
BOT_NAME = 'mySpider'

SPIDER_MODULES = ['mySpider.spiders']
NEWSPIDER_MODULE = 'mySpider.spiders'

ITEM_PIPELINES = {
    # 管道的位置: 优先级, 0~1000, 数字越小, 优先级越高;
   'mySpider.pipelines.MyspiderPipeline': 300,
   'mySpider.pipelines.CsvPipeline': 400,
   'mySpider.pipelines.MysqlPipeline': 500,
   'mySpider.pipelines.ImagePipeline': 200,

}

#图片存储的路径
IMAGES_STORE =  '/root/PycharmProjects/day29/mySpider/img'

6.运行爬虫

scrapy crawl mooc

结果:
在这里插入图片描述
mooc.txt
在这里插入图片描述
mooc.csv
在这里插入图片描述
在这里插入图片描述

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页