scrapy分页抓取网页(抓取慕课网课程信息展示之scrapy框架数据的过程介绍 )
优采云 发布时间: 2021-11-07 00:14scrapy分页抓取网页(抓取慕课网课程信息展示之scrapy框架数据的过程介绍
)
本例主要通过抓取Mukenet的课程信息来演示scrapy框架爬取数据的过程。
1、抢夺网站 简介
爬网网站:
截取内容:截取内容为所有课程名称、课程介绍、课程网址、课程图片网址、课程编号(由于动态渲染)
网站图片:
2、创建项目
以命令行方式创建项目
scrapy startprojectscrapy_course
建立完成后,用pycharm打开,目录如下:
scrapy.cfg:项目配置文件
scrapytest/:项目的python模块。稍后您将在此处添加代码。
scrapytest/items.py:项目中的item文件。
scrapytest/pipelines.py:项目中的管道文件。
scrapytest/settings.py:项目的设置文件。
scrapytest/spiders/:蜘蛛代码放置的目录。
3、创建爬虫
下面的步骤解释了如何编写一个简单的爬虫。
我们要写一个爬虫,首先是创建一个Spider
我们在scrapy_course/spiders/目录下创建一个文件MySpider.py
该文件收录一个 MySpider 类,该类必须继承 scrapy.Spider 类。
同时它必须定义三个属性:
-name:用于区分Spider。名称必须唯一,不能为不同的蜘蛛设置相同的名称。
-start_urls:收录Spider启动时会爬取的URL列表。因此,要检索的第一页将是其中之一。从初始 URL 获得的数据中提取后续 URL。
-parse() 是蜘蛛的一种方法。调用时,在下载每个初始 URL 后生成的 Response 对象将作为唯一参数传递给函数。该方法负责解析返回的数据(响应数据),提取数据(生成项),生成需要进一步处理的URL的Request对象。
MySpider.py创建后的代码如下
定义爬虫项目
创建好Spider文件后,先别急着写爬虫代码
我们首先定义一个容器来存放要爬取的数据。
所以我们使用Item
为了定义常用的输出数据,Scrapy 提供了 Item 类。Item 对象是一个简单的容器,用于保存爬取的数据。它提供了类似字典的 API 和用于声明可用字段的简单语法。
我们可以在项目目录中看到一个项目文件,我们可以更改这个文件或创建一个新文件来定义我们的项目。
在这里,我们在同一层上创建一个新的项目文件 CourseItems.py
根据上面的代码,我们创建了一个名为courseItem的容器来存储和抓取信息。
title->课程名称,url->课程url,image_url->课程标题图片,介绍->课程描述,学生->学号
创建项目文件后,我们可以使用类似字典的 API 和简单的语法来声明可用字段。
常用方法如下
4、编写Spider代码
定义好item后,我们就可以开始爬取部分的工作了。
为简单起见,我们首先抓取页面上的信息。
首先我们编写爬取代码
正如我们上面所说,爬取部分是在 MySpider 类的 parse() 方法中执行的。
parse() 方法负责处理响应并返回处理后的数据和/或 URL 以供后续处理。
此方法和其他 Request 回调函数必须返回一个收录 Request 和/或 Item 的可迭代对象。
我们在之前创建的 MySpider.py 中编写以下代码。
注意上面与 MySpider.py 的区别
# -*- coding:utf8-*-
import scrapy
import sys
import time
reload(sys)
sys.setdefaultencoding(\'utf-8\')
from scrapy_course.items import CourseItem
from scrapy.selector import Selector
sys.stdout = open(\'output.txt\', \'w\')
pageIndex = 0
class MySpider(scrapy.Spider):
#用于区别Spider
name = "MySpider"
#允许访问的域
allowed_domains = [\'imooc.com\']
#爬取的地址
start_urls = ["http://www.imooc.com/course/list"]
#爬取方法
def parse(self, response):
# 实例一个容器保存爬取的信息
item = CourseItem()
# 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定
# 先获取每个课程的div
sel = Selector(response)
title = sel.xpath(\'/html/head/title/text()\').extract() # 标题
print title[0]
# sels = sel.xpath(\'//div[@class="course-card-content"]\')
sels = sel.xpath(\'//a[@class="course-card"]\')
pictures = sel.xpath(\'//div[@class="course-card-bk"]\')
index = 0
global pageIndex
pageIndex += 1
print u\'%s\' % (time.strftime(\'%Y-%m-%d %H-%M-%S\'))
print \'第\' + str(pageIndex)+ \'页 \'
print \'----------------------------------------------\'
for box in sels:
print \' \'
# 获取div中的课程标题
item[\'title\'] = box.xpath(\'.//h3[@class="course-card-name"]/text()\').extract()[0].strip()
print \'标题:\' + item[\'title\']
# 获取div中的课程简介
item[\'introduction\'] = box.xpath(\'.//p/text()\').extract()[0].strip()
print \'简介:\' + item[\'introduction\']
# 获取每个div中的课程路径
item[\'url\'] = \'http://www.imooc.com\' + box.xpath(\'.//@href\').extract()[0]
print \'路径:\' +item[\'url\']
# 获取div中的学生人数
item[\'student\'] = box.xpath(\'.//div[@class="course-card-info"]/text()\').extract()[0].strip()
print item[\'student\']
# 获取div中的标题图片地址
item[\'image_url\'] = pictures[index].xpath(\'.//img/@src\').extract()[0]
print \'图片地址:\' + item[\'image_url\']
index += 1
yield item
time.sleep(1)
print u\'%s\' % (time.strftime(\'%Y-%m-%d %H-%M-%S\'))
# next =u\'下一页\'
# url = response.xpath("//a[contains(text(),\'" + next + "\')]/@href").extract()
# if url:
# # 将信息组合成下一页的url
# page = \'http://www.imooc.com\' + url[0]
# # 返回url
# yield scrapy.Request(page, callback=self.parse)
使用 Pipeline 处理数据
在我们成功获取信息后,我们需要对信息进行验证和存储。这里我们以存储为例。
当 Item 在 Spider 中被采集到时,它会被传递到 Pipeline,一些组件会按照一定的顺序执行 Item 的处理。
流水线经常执行以下操作:
清理 HTML 数据
验证爬取的数据(检查项目是否收录某些字段)
重复检查(并丢弃)
目前,抓取结果暂时保存在文本中
这里只进行简单的将数据存储在json文件中的操作。
pipelines.py 代码如下
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don\'t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import codecs
import json
class ScrapyCoursePipeline(object):
def __init__(self):
# self.file = open(\'data.json\', \'wb\')
# self.file = codecs.open(
# \'spider.txt\', \'w\', encoding=\'utf-8\')
self.file = codecs.open(
\'spider.json\', \'w\', encoding=\'utf-8\')
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close()
要使用Pipeline,您必须先注册Pipeline
找到settings.py文件,这个文件就是爬虫的配置文件
添加进去
ITEM_PIPELINES = {
\'scrapy_course.pipelines.ScrapyCoursePipeline\':300
}
上面的代码是用来注册Pipeline的,其中scrapy_course.pipelines.ScrapyCoursePipeline是你要注册的类,右边的'300'是Pipeline的优先级,范围从1到1000。管道越小,越早执行。
经过以上操作,我们最基本的爬取操作之一就完成了
然后我们运行
5、运行
在命令行下运行scrapy crawl MySpider
如何将数据存储在文本文件中,在代码前添加如下代码,
sys.stdout = open(\'output.txt\', \'w\'),这会将数据保存到当前项目路径下的output.txt文件中
如下: