Scrapy 爬虫实例(一)

2021-06-10 14:21:17 浏览数 (1)

简介

网站为:https://movie.douban.com/top250

假设,我们抓取top250电影的序列号,电影名,介绍,星级,评价数,电影描述选项

实例

新建项目

在开始爬取之前,您必须创建一个新的Scrapy项目。 进入您打算存储代码的目录中,运行下列命令:

代码语言:javascript复制
scrapy startproject douban


scrapy.cfg: 项目的配置文件;(用于发布到服务器)
tutorial/: 该项目文件夹。之后将在此编写Python代码。
tutorial/items.py: 项目中的item文件;(定义结构化数据字段field).
tutorial/pipelines.py: 项目中的pipelines文件;(用于存放执行后期数据处理的功能,定义如何存储结构化数据)
tutorial/settings.py: 项目的设置文件;(如何修改User-Agent,设置爬取时间间隔,设置代理,配置中间件等等)
tutorial/spiders/: 放置spider代码的目录;(编写爬取网站规则)

定义Item

Item 定义结构化数据字段,用来保存爬取到的数据;其使用方法和python字典类似。可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item。

代码语言:javascript复制
import scrapy

class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 序列号
    number = scrapy.Field()
    # 电影名
    movie_name = scrapy.Field()
    # 介绍
    introduce = scrapy.Field()
    # 星级
    star = scrapy.Field()
    # 评价数
    evaluate = scrapy.Field()
    # 描述
    describe = scrapy.Field()
    pass

爬虫(Spider)

Spider是开发者编写用于从单个网站(或者一些网站)爬取数据的类。创建一个Spider,必须继承 'scrapy.Spider' 类, 需要定义以下三个属性:

  • name:spider名字,必须是唯一的
  • start_urls:初始的URL列表
  • parse(self, response):每个初始URL完成下载后被调用。
代码语言:javascript复制
这个函数要完成的功能:
1.负责解析返回的网页数据(response.body),提取结构化数据(生成item)
2.生成需要下一页的请求URL。

以下为我们的第一个Spider代码,保存在 douban/spiders 目录下的 douban.py 文件中:

代码语言:javascript复制
from douban.items import DoubanItem
import scrapy


class DoubanSpider(scrapy.Spider):
    name = 'douban'  # spider名字,必须是唯一的
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口URL
    start_urls = ['https://movie.douban.com/top250']  # 初始的URL列表

    # 这个函数要完成的功能:
    # 1.负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    # 2.生成需要下一页的请求URL。
    def parse(self, response):  # 每个初始URL完成下载后被调用
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        # 循环电影的条目
        for i_item in movie_list:
            # 导入item,进行数据解析
            douban_item = DoubanItem()

            douban_item['number'] = i_item.xpath(".//div[@class='item']//div[@class='pic']//em/text()").extract_first()

            douban_item['movie_name'] = i_item.xpath(".//div[@class='item']//div[@class='info']//div[@class='hd']/a/span[1]/text()").extract_first()

            # 如果文件有多行进行解析
            content = i_item.xpath(".//div[@class='item']//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s

            douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()

            douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()

            douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()

            print(douban_item)

            yield douban_item

        # 解析下一页,取后一页的XPATH
        next_link = response.xpath("//span[@class='next']/link/@href").extract()
        if next_link:
            next_link = next_link[0]
            yield scrapy.Request("https://movie.douban.com/top250"   next_link, callback=self.parse)

爬取内容

进入项目的根目录,执行下列命令启动spider:

代码语言:javascript复制
在命令行输入:
scrapy crawl douban -o 豆瓣电影Top250.json 
或者 
scrapy crawl douban -o 豆瓣电影Top250.csv

0 人点赞