【爬虫】Scrapy初次尝试 入门详细教程(爬取豆瓣top250电影信息)

本文详细介绍了如何使用Scrapy框架在Windows10环境下,通过Anaconda和PyCharm搭建爬虫项目,爬取豆瓣电影Top250榜单的电影详情,包括序号、名称、简介、评分、评论数及描述,并保存为JSON和XLS格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能
爬取豆瓣电影Top 250的电影信息(序号、电影名、介绍、星级、评论数、描述)。

运行环境
Windows10 + Anaconda + Pycharm

参考
https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id4
https://www.imooc.com/video/17516


一、创建项目

1.1 搭建环境

1 使用Anaconda配置好虚拟环境,包括依赖的安装。

Python3.6
scrapy
requests
urllib3
lxml 
libxml2
cssselect
parsel
w3lib
Twisted

安装方式:
Anaconda Prompt 常用命令

1 打开Anaconda Prompt
2 创建虚拟环境:conda create -n 环境名称 python=3.6
3 激活虚拟环境:conda activate 环境名称
4 安装库:pip install 名称 -i https://pypi.tuna.tsinghua.edu.cn/simple(使用镜像,下载更快)

安装scrapy时,会自动安装前置库。

2 打开PyCharm建立项目,并将刚刚建立的虚拟环境作为该项目编译器。
在这里插入图片描述

1.2 创建项目文件

打开PyCharm的Terminal界面,输入scrapy startproject 项目名,建立scrapy项目。

如: scrapy startproject douban
在这里插入图片描述

成功后获得如下项目目录:
在这里插入图片描述

scrapy.cfg: 项目的配置文件
douban/: 该项目的python模块。之后您将在此加入代码。
douban/items.py: 项目中的item文件.
douban/pipelines.py: 项目中的pipelines文件.
douban/settings.py: 项目的设置文件.
douban/spiders/: 放置spider代码的目录.

1.3 创建爬虫文件

打开terminal界面,输入:

cd douban
scrapy genspider douban_spider movie.douban.com

在这里插入图片描述

创建名为douban_spider.py的文件爬取movie.douban.com网站。
在这里插入图片描述

1.4 定义Item

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

首先根据需要从unsplash.com获取到的数据对item进行建模。 我们需要从unsplash中获取名字,url,以及网站的描述。 对此,在item中定义相应的字段。

import scrapy


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

1.5 编写Spider

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

import scrapy


class ImgSpider(scrapy.Spider):
    name = 'ImgSpider'  # 用于区别Spider,该名字必须是唯一的,不可以为不同的Spider设定相同的名字。
    allowed_domains = ['unsplash.com']
    start_urls = ['https://unsplash.com/']  # 包含了Spider在启动时进行爬取的url列表。

    def parse(self, response):  # spider的一个方法
        """
        每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。
        该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
        """

spider暂时不包含任何内容。

1.6 运行函数main

在Terminal内运行十分麻烦,所以创建一个main函数用于启动程序。
在这里插入图片描述

代码如下:

from scrapy import cmdline
cmdline.execute('scrapy crawl ImgSpider'.split())

二、编辑项目

2.1 items.py 编写

想要获取网页中的以下内容:序号、电影名、介绍、星级、评论数、描述。
在这里插入图片描述
编写items.py

import scrapy


class DoubanItem(scrapy.Item):
    serial_number = scrapy.Field()  # 序号
    movie_name = scrapy.Field()  # 电影名
    introduction = scrapy.Field()  # 介绍
    rating_num = scrapy.Field()  # 星级
    comment_num = scrapy.Field()  # 评论数
    quote = scrapy.Field()  # 描述

2.2 xpath定位

关于Xpath:https://www.jianshu.com/p/85a3004b5c06

首先为谷歌浏览器安装扩展程序:XPath
在这里插入图片描述
后面将使用XPath扩展程序定位要寻找的内容。
在这里插入图片描述
右键点击电影名——检查,即可定位到电影的位置。

该位置为<div class="article">\<ol class="grid_view">\<li>(共有25个,因为一页含有25个电影信息)

通过XPath进行定位,输入//div[@class="article"]//ol[@class="grid_view"]/li,可以看到,共找到25个结果,说明XPath输入的内容正确。
在这里插入图片描述
接下来通过XPath分别定位(XPath的写法不唯一):

  • serial_number序号
  • movie_name电影名
  • introduction介绍
  • rating_num星级
  • comment_num评论数
  • quote描述

//div[@class="article"]//ol[@class="grid_view"]/li基础上分别为:

div[@class="item"]//em/text()
div[@class="info"]//div[@class="hd"]//span[@class="title"][1]//text()
div[@class="info"]//div[@class="bd"]//p[1]//text()
div[@class="info"]//div[@class="bd"]//span[@class="rating_num"]//text()
div[@class="info"]//div[@class="bd"]//div[@class="star"]//span[4]//text()
div[@class="info"]//div[@class="bd"]//p[@class="quote"]//span//text()

获取当前页面信息后,需要进行翻页,所以需要定位“后页”。
在这里插入图片描述
通过XPath进行定位,输入//span[@class="next"]//link//@href,可以获得一个结果?start=25&filter=,说明XPath输入的内容正确。

2.3 douban_spider.py编写

根据上面的规则修改douban_spider代码:

import scrapy
from items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'    # 爬虫名,该名字必须是唯一的,不可以为不同的Spider设定相同的名字。
    allowed_domains = ['movie.douban.com']  # 允许的域名,在这个域名内进行爬取
    start_urls = ['http://movie.douban.com/top250']  # 入口域名,扔到调度器中,包含了Spider在启动时进行爬取的url列表。

    # 默认解析方法
    def parse(self, response):
        # print(response.text)
        # 循环电影条数
        movie_list = response.xpath('//div[@class="article"]//ol[@class="grid_view"]//li')
        for i_item in movie_list:
            # 创建DoubanItem类,写详细的XPath并进行数据解析
            douban_item = DoubanItem()
            # 获取序号
            douban_item['serial_number'] = i_item.xpath(
                './/div[@class="item"]//em/text()').extract_first()  # 解析第一个数据
            # 获取电影名
            douban_item['movie_name'] = i_item.xpath(
                './/div[@class="info"]//div[@class="hd"]//span[@class="title"][1]//text()').extract_first()
            # 获取介绍
            content = i_item.xpath(
                './/div[@class="info"]//div[@class="bd"]//p[1]//text()').extract()
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduction'] = content_s
            # 获取星级
            douban_item['rating_num'] = i_item.xpath(
                './/div[@class="info"]//div[@class="bd"]//span[@class="rating_num"]//text()').extract_first()
            # 获取评论数
            douban_item['comment_num'] = i_item.xpath(
                './/div[@class="info"]//div[@class="bd"]//div[@class="star"]//span[4]//text()').extract_first()
            # 获取描述
            douban_item['quote'] = i_item.xpath(
                './/div[@class="info"]//div[@class="bd"]//p[@class="quote"]//span//text()').extract_first()

            # print(douban_item)
            # 将数据yield到piplines里面
            yield douban_item  # 进入到pipelines

        # 解析下一页规则,取后页的XPath
        next_link = response.xpath('//span[@class="next"]//link//@href').extract()
        if next_link:  # 判断是否到最后一页
            next_link = next_link[0]
            yield scrapy.Request("http://movie.douban.com/top250"+next_link, callback=self.parse)

运行main.py,获取相应的信息:
在这里插入图片描述

2.4 数据保存

2.4.1 json格式

首先需要在pipelines.py内定义保存格式:

import json

class JsonPipeline:
    def __init__(self):
        self.file = open('top250.json', 'wb')

    def process_item(self, item, spider):
        line = json.dumps(dict(item), ensure_ascii=False) + "\n"  # ensure_ascii=False 中文不乱码
        print(line)
        self.file.write(line.encode('utf-8'))
        return item

再修改settings.py文件,找到ITEM_PIPELINES选项:

ITEM_PIPELINES = {
    'douban.pipelines.JsonPipeline': 300
}

运行main.py记可得到top250.json
在这里插入图片描述

2.4.2 xls文件

首先需要在pipelines.py内定义保存格式:

import xlwt

class CsvPipeline:
    def __init__(self):
        self.book = xlwt.Workbook(encoding='utf-8')
        self.sheet = self.book.add_sheet('top250')
        self.sheet.write(0, 0, 'serial_number')
        self.sheet.write(0, 1, 'movie_name')
        self.sheet.write(0, 2, 'introduction')
        self.sheet.write(0, 3, 'rating_num')
        self.sheet.write(0, 4, 'comment_num')
        self.sheet.write(0, 5, 'quote')
        self.row = 1

    def process_item(self, item, spider):
        self.sheet.write(self.row, 0, item['serial_number'])
        self.sheet.write(self.row, 1, item['movie_name'])
        self.sheet.write(self.row, 2, item['introduction'])
        self.sheet.write(self.row, 3, item['rating_num'])
        self.sheet.write(self.row, 4, item['comment_num'])
        self.sheet.write(self.row, 5, item['quote'])

        self.row += 1
        self.close_file(item)

    def close_file(self, item):
        self.book.save('top250.xls')
        return item

再修改settings.py文件,找到ITEM_PIPELINES选项:

ITEM_PIPELINES = {
    'douban.pipelines.CsvPipeline': 300
}

运行main.py记可得到top250.xls
在这里插入图片描述

好的,以下是使用Scrapy爬取豆瓣Top250电影的步骤: 1. 首先安装Scrapy,可以使用pip命令进行安装: ``` pip install scrapy ``` 2. 创建一个新的Scrapy项目,可以使用以下命令: ``` scrapy startproject douban_top250 ``` 这将创建一个名为“douban_top250”的文件夹,其中包含了Scrapy项目的各个文件。 3. 进入项目文件夹,创建一个新的Spider,用于爬取Top250电影信息: ``` cd douban_top250 scrapy genspider douban_spider https://movie.douban.com/top250 ``` 这将在“douban_top250/spiders”文件夹中创建一个名为“douban_spider”的Spider,它将以“https://movie.douban.com/top250”作为起始URL。 4. 打开“douban_spider.py”文件,在其中添加以下代码: ```python import scrapy class DoubanSpider(scrapy.Spider): name = 'douban_spider' start_urls = ['https://movie.douban.com/top250'] def parse(self, response): # TODO: 实现解析HTML页面,提取电影信息的代码 pass ``` 在这个Spider中,我们定义了一个名称为“douban_spider”的Spider,并设置了它的起始URL为“https://movie.douban.com/top250”。在“parse”方法中,我们将编写解析HTML页面、提取电影信息的代码。 5. 在“parse”方法中,编写代码来解析HTML页面、提取电影信息。以下是一个可能的实现: ```python def parse(self, response): # 获取电影列表中所有电影的URL movie_links = response.css('.hd a::attr(href)').extract() # 遍历每个电影的URL,提取电影信息 for movie_link in movie_links: yield scrapy.Request(movie_link, callback=self.parse_movie) # 如果有下一页,继续爬取 next_page_link = response.css('.next a::attr(href)').extract_first() if next_page_link: yield scrapy.Request(next_page_link, callback=self.parse) def parse_movie(self, response): # 提取电影信息,例如电影名称、评分、导演、主演等等 title = response.css('h1 span::text').extract_first() rating = response.css('.rating_num::text').extract_first() directors = response.css('a[rel="v:directedBy"]::text').extract() actors = response.css('.actor .info a::text').extract() # 将提取的信息输出到控制台 print(title, rating, directors, actors) ``` 在这个实现中,我们首先使用CSS选择器获取电影列表中所有电影的URL。然后遍历每个电影的URL,使用“parse_movie”方法提取电影信息。在“parse_movie”方法中,我们使用CSS选择器提取电影信息,并将其输出到控制台。 6. 最后,在命令行中执行以下命令来运行Spider: ``` scrapy crawl douban_spider -好的,以下是使用Scrapy爬取豆瓣电影Top250的基本步骤: 1. 创建Scrapy项目 在终端中执行以下命令创建一个新的Scrapy项目: ``` scrapy startproject douban ``` 这将创建一个名为douban的新目录,其中包含了一个基本的Scrapy项目结构。 2. 创建Spider 在Scrapy中,Spider是爬虫的核心部分,负责定义如何抓取网站数据。在douban项目中,我们可以使用以下命令创建一个新的Spider: ``` scrapy genspider douban_movie_top250 https://movie.douban.com/top250 ``` 这将在spiders目录下创建一个名为douban_movie_top250.py的文件,并为我们定义一个基本的Spider,它可以从豆瓣电影Top250页面中提取数据。 3. 编写Spider代码 现在,我们需要编辑douban_movie_top250.py文件并添加提取数据的代码。以下是一个简单的示例,它将从页面中提取电影的名称、评分和评论数: ``` import scrapy class DoubanMovieTop250Spider(scrapy.Spider): name = 'douban_movie_top250' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): for movie in response.xpath('//div[@class="info"]'): yield { 'title': movie.xpath('div[@class="hd"]/a/span/text()').get(), 'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').get(), 'comments': movie.xpath('div[@class="bd"]/div[@class="star"]/span[last()]/text()').get().strip('()') } next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: yield response.follow(next_page.get(), self.parse) ``` 该代码使用XPath表达式从页面中提取信息,并使用Scrapy的response.follow方法继续跟随下一页链接。我们将数据作为字典形式的Python对象进行yield,这将使Scrapy将其保存到JSON格式的文件中。 4. 运行Spider 我们现在可以在终端中执行以下命令运行我们的Spider: ``` scrapy crawl douban_movie_top250 -o top250.json ``` 这将运行Spider并将提取的数据保存到名为top250.json的文件中。 以上就是使用Scrapy爬取豆瓣电影Top250的基本步骤。希望对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

望天边星宿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值