Scarpy爬虫框架入门

前期准备:

(1)首先需要下载安装:

1、python环境,这里我使用的是python3.6,建议不要使用该版本之后的版本,因为后面还需要安装对应python版本的pywin32程序,而该程序暂时没有python3.6后面的对应版本。

2、scrapy 框架,这个直接使用pip install 进行安装就行。

3、对应python版本的pywin32程序,这个可以根据自己的电脑版本搜索对应的进行安装即可(这里有点小坑,一定要搜索对应自己python版本以及自己电脑位数的安装程序,我当时安装的时候怎么装都装不上,最后搜到了一个.whl的对应文件,通过pip install 才安装上)。

(2)有了软硬件环境,还需要知道scrapy中的运行逻辑,这里推荐看看这篇博客,写得很形象(但是按照它的教程一步一步下去会会出现很多错误,可能跟运行环境有关)。

创建项目

(1)在命令行中输入:

scrapy startproject mySpider

会得到如下的目录结构:

它们分别如下意义:

  • scrapy.cfg: 项目的配置文件。
  • mySpider/: 项目的Python模块,将会从这里引用代码。
  • mySpider/items.py: 项目的目标文件。
  • mySpider/pipelines.py: 项目的管道文件。
  • mySpider/settings.py: 项目的设置文件。
  • mySpider/spiders/: 存储爬虫代码目录。

定义结构

接下来需要定义我们爬取数据的存储结构,根据我们要爬取得目标(教课老师的信息),我们需要定义三个属性,分别是name、title、infor。他们分别代表老师的姓名、头衔、简介。

定义结构我们需要在之前生成的items.py文件中去定义。之前已经生成了mySpider这个类了,为了跟目录名进行区分,我们将该类名改为ItcastItem,并且给它定义三个属性:

import scrapy


class ItcastItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    name=scrapy.Field()
    title=scrapy.Field()
    infor=scrapy.Field()
    pass

启动pipline

为了实现对数据的去重、验证等操作,我们需要在piplines.py中进行相关的设置,并启用。

import codecs
import json

class MyspiderPipeline(object):
    def __init__(self):
        pass
        self.file = codecs.open('teacher.json', mode='wb', encoding='utf-8')


    def process_item(self, item, spider):
        line=json.dumps(dict(item),ensure_ascii=False)+'\n'
        self.file.write(line)

        return item

如上所示,__init__(self)函数是该类别的构造函数,用于初始化操作。在程序中,我们定义输出的文件名以及打开的方式等。

然后process_item函数是必须调用的用来处理item,并且返回值必须为Item类的对象,或者是抛出DropItem异常。并且上述方法将得到的item实现解码,以便正常显示中文,最终保存到json文件中。这里注意一定要在dumps中加入 ensure_ascii=False这句话,否则生成的json文件会以Unicode的编码格式存放。

最后别忘了还要在settings.py文件中加入如下代码:

ITEM_PIPELINES = {
    'mySpider.pipelines.MyspiderPipeline':300
}

该代码的作用是启动pipline实现对spider返回数据的按序处理。

编写爬虫脚本

经过前面的准备工作,最后就是编写爬虫脚本了。

首先需要在spiders文件夹下新建一个python文件,将它命名为itcast,新建ItcastSpider类,该类有三个必要属性和一个必要方法,其中name属性是启动爬虫时用以区分其它爬虫项目的标志,allowed_domains属性是用来限制爬虫链接所属的域的,start_url则是爬虫脚本第一次访问的链接地址。然后还有一个必要方法即parse方法,这个是定义用来解析爬取到网页的必须调用的一个方法。代码如下所示:

# -*- coding: utf-8 -*-
import scrapy
from mySpider.items import ItcastItem

class ItcastSpider(scrapy.Spider):
    name = 'itcast'
    allowed_domains = ['itcast.cn']
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml']

    def parse(self, response):
        print('开始爬虫...')
        for each in response.xpath("//div[@class='li_txt']"):
            item=ItcastItem()
            name=each.xpath("h3/text()").extract()
            title=each.xpath("h4/text()").extract()
            infor=each.xpath("p/text()").extract()
            item['name']=name[0]
            item['title']=title[0]
            item['infor']=infor[0]
            yield item

程序首先对div下所有class为"li_txt"的标签进行遍历,然后对其中的每个元素分别进行解析,然后迭代返回item对象给pipline进行存入处理。

运行结果

最后在命令行中运行启动爬虫:

scrapy crawl itcast

爬虫过程如下:

最后的爬虫结果如下:

猜你喜欢

转载自blog.csdn.net/ytz201201/article/details/84837291
今日推荐