关键词

实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250

标题:使用Scrapy爬取豆瓣电影TOP250

介绍

在本文中,我们将使用Python的爬虫框架Scrapy来抓取豆瓣电影TOP250的信息。Scrapy是一个高效且易于使用的Web爬虫框架,可以帮助我们快速地从网络上抓取所需要的信息。

步骤

  1. 创建一个Scrapy项目

在命令行中输入以下命令,创建一个Scrapy项目:

scrapy startproject douban_top250

这个命令会创建一个名为“douban_top250”的目录,其中包含了Scrapy的一些基本文件和目录。

  1. 创建一个Spider

在Scrapy的术语中,Spider是一个可以定义如何请求页面、抓取数据的类。我们需要创建一个Spider来告诉Scrapy如何抓取豆瓣电影TOP250。

在“douban_top250”目录中,创建一个名为“spiders”的子目录,然后在这个子目录中创建一个名为“douban_spider.py”的Python文件。这个文件中包含以下代码:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        # TODO

这个Spider的名称是“douban”,目标网站是“movie.douban.com”,初始请求的URL是“https://movie.douban.com/top250”。在“parse”方法中,我们将定义如何抓取页面并提取所需要的数据。

  1. 抓取页面并提取数据

在“parse”方法中,我们将使用XPath表达式来定位HTML页面中的各种元素,并提取出所需要的数据。例如,以下代码可以提取页面中的电影名、评分和导演信息:

def parse(self, response):
    for movie in response.xpath('//div[@class="info"]'):
        yield {
            'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(),
            'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(),
            'director': movie.xpath('div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[1]
        }

这个代码将遍历页面中所有的电影,用Python的字典类型表示每一部电影的信息,并将它们“yield”出来,以方便后续处理。

  1. 存储数据

默认情况下,Scrapy将会将抓取到的数据输出到标准输出中。我们可以将其存储到CSV或JSON文件中,以便后续处理。

在“douban_top250”目录中,创建一个名为“pipelines.py”的Python文件,并添加以下代码:

import csv

class CsvPipeline(object):
    def __init__(self):
        self.file = open('douban_top250.csv', 'w', newline='')
        self.writer = csv.writer(self.file)
        self.writer.writerow(['title', 'rating', 'director'])

    def process_item(self, item, spider):
        self.writer.writerow([item['title'], item['rating'], item['director']])
        return item

    def __del__(self):
        self.file.close()

这个代码创建了一个名为“CsvPipeline”的管道,用于将抓取到的数据存储到CSV文件中。

最后,在“douban_top250”目录中的“settings.py”文件中添加以下代码:

ITEM_PIPELINES = {
    'douban_top250.pipelines.CsvPipeline': 300,
}

这个代码将我们刚才创建的“CsvPipeline”管道添加到Scrapy的数据处理管道中。

  1. 运行Spider

最后,在命令行中输入以下命令,运行我们刚才创建的Spider:

scrapy crawl douban

这个命令将会启动Scrapy的爬虫引擎,然后依次抓取每个页面,并将提取到的数据存储到CSV文件中。

示例说明

示例一:提取电影名和评分

在“parse”方法中,我们可以使用XPath表达式来提取HTML页面中的元素。例如,以下代码可以提取页面中的电影名和评分:

def parse(self, response):
    for movie in response.xpath('//div[@class="info"]'):
        yield {
            'title': movie.xpath('div[@class="hd"]/a/span[@class="title"]/text()').extract_first(),
            'rating': movie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first(),
        }

这个代码将遍历页面中所有的电影,用Python的字典类型表示每一部电影的信息,并将它们“yield”出来,以方便后续处理。

示例二:存储数据到MongoDB中

可以将抓取到的数据存储到MongoDB数据库中。在“douban_top250”目录中的“pipelines.py”文件中,添加以下代码:

import pymongo

class MongoPipeline(object):
    def __init__(self):
        self.client = pymongo.MongoClient('mongodb://localhost:27017/')
        self.db = self.client['douban_top250']
        self.collection = self.db['movies']

    def process_item(self, item, spider):
        self.collection.insert(item)
        return item

    def __del__(self):
        self.client.close()

这个代码创建了一个名为“MongoPipeline”的管道,用于将抓取到的数据存储到MongoDB数据库中。在“settings.py”文件中,添加以下代码:

ITEM_PIPELINES = {
    'douban_top250.pipelines.MongoPipeline': 300,
}

这个代码将我们刚才创建的“MongoPipeline”管道添加到Scrapy的数据处理管道中。注意需要提前安装pymongo库。

本文链接:http://task.lmcjl.com/news/7099.html

展开阅读全文