scrapy分页抓取网页(抓取慕课网课程信息展示之scrapy框架数据的过程介绍 )

优采云 发布时间: 2021-11-07 00:14

  scrapy分页抓取网页(抓取慕课网课程信息展示之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文件中

  如下:

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线