爬取的链接: 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