Scrapy入门教程

Scrapy入门教程


前言

Scrapy是最经典的python爬虫框架之一,使用Scrapy框架可以有效减少爬虫开发的工作量,帮助开发者快捷的建立一个功能强大的爬虫项目。本文通过一个简单的实例,讲解了Scrapy开发运用的全过程,希望能够对初学者有一定的参考价值。


提示:以下是本篇文章正文内容,下面案例可供参考

一、安装Scrapy

pip安装即可

pip install Scrapy

检验安装是否成功:

Scrapy

Scrapy入门教程_第1张图片

二、创建一个Scrapy项目

1.进入需要创建项目的目录

代码如下(示例):

cd E://Scrapy_demo

2.新建一个Scrapy项目

代码如下(示例):

Scrapy startproject demo_1

Scrapy startproject 后接项目名称(此处为demo_1)


3.项目目录下各文件作用

  • demo_1/scrapy.cfg:项目配置文件,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • demo_1/demo_1:该项目的python模块,之后将在此加入代码
    • demo_1/demo_1/spyder:放置spyder代码的目录,爬虫目录,如:创建文件,编写爬虫规则
    • demo_1/demo_1/items.py:该项目的item文件,设置数据存储模板,用于结构化数据
    • demo_1/demo_1/middlewares.py:中间件,用于数据的定制化处理,辅助开发
    • demo_1/demo_1/pipelines.py:数据处理行为,如:一般结构化的数据持久化
    • demo_1/demo_1/settings.py: 配置文件,如:递归的层数、并发数,延迟下载等

4.定义item容器

item是保存爬取到的数据的容器,其使用方法和python字典类似,并且提供了额外保护机制来避免因拼写错误导致的未定义字段错误。

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


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

以抓取美剧天堂的前100最新为例,这里只考虑了名称一个属性,如果要添加其他属性写法同上,源网页如下图所示:

Scrapy入门教程_第2张图片

5.编写爬虫类Spyder

   Spyder是用户编写的用于从网站上爬取数据的类
   Spyder类包含一个用于下载的初始url、跟进url并分析页面内容的方法逻辑、提取生成item的方法三项主要内容
   创建一个自定义的Spyder类时,必须继承scrapy.Spyder类,并定义以下三个属性:
  • name:用于区分不同的Spydre,该名字必须是唯一的,不可以为不同的Spyder设定相同的name
  • start_urls:包含了Spyder在启动时进行爬取的url列表。因此,第一个被获取到的页面必定时其中之一。后续的url则从初始的url获取到的数据中提取
  • parse():Spyder类的一个回调函数。当下载器返回Response的时候,该函数就会被调用,每个初始url完成下载后生成的Response对象将会作为唯一的参数传递给该函数。该方法负责解析Response的数据、提取数据以及生成需要进一步处理的url的request对象。
   PS:创建Spyder文件时,一般以网站域名命名对应的py文件

代码如下(示例):

# meiju.py

# -*- coding: utf-8 -*-

import scrapy

from demo_1.items import Demo1Item


class MeijuSpider(scrapy.Spider):
    name = 'meijutt'

    allowed_domains = ['meijutt.tv']

    start_urls = ['http://www.meijutt.tv/new100.html']

    def parse(self, response):
        movies = response.xpath('//ul[@class="top-list  fn-clear"]/li')

        for each_movie in movies:
            item = Demo1Item()

            item['name'] = each_movie.xpath('./h5/a/@title').extract()[0]

            yield item

6.按需修改settings.py配置文件

本例中在这里修改一下item的数量为100

代码如下(示例):

ITEM_PIPELINES = {
   'demo_1.pipelines.Demo1Pipeline': 100,
}

7.修改pipelines.py文件(对采集到的数据进行处理\持久化存储)

代码如下(示例):

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter


class Demo1Pipeline:
    def process_item(self, item, spider):

        with open("./demo_meiju.txt",'a') as fp:

            print(type(item['name']))

            fp.write(item['name'] + "\n")

8.运行项目

代码如下(示例):

cd demo_1
scrapy crawl demo_1

总结

   对于90%的爬虫应用场景来说,不使用爬虫框架的一般爬虫程序即可胜任。笔者个人认为爬虫框架的目的在于提供标准化、易于理解的爬虫开发平台和流程;减轻开发大型爬虫项目的工作量。
   总的来说,一般开发者对于爬虫开发框架的需求并不强烈,正确看待即可!

你可能感兴趣的:(Python及其工具,http,https,大数据,pycharm,python)