热爱生活,从电影开始

     人和人刚认识的时候,虚伪又热情,新鲜又浪漫。即使生活再不好,也要爱自己,比如多看点电影,一起感悟下人生也是蛮好的,本次小编就来试着爬取了豆瓣电影Top 250来小试牛刀,快跟着小编一起探索吧,不喜勿喷哦~

1、创建Scrapy项目

创建一个新项目,用于爬取豆瓣电影排行榜

命令:

scrapy startproject DoubanMovies

截图:

创建完后使用Pycharm打开创建的新项目

2、创建Scrapy程序

使用命令创建一个scrapy程序,名字随你就好,毕竟只是一个程序名而已

命令:

scrapy genspider douban douban.com

截图:

3、配置数据库等信息

在settings.py里面设置你要保存的数据库信息

BOT_NAME = 'DoubanMovies'

SPIDER_MODULES = ['DoubanMovies.spiders']
NEWSPIDER_MODULE = 'DoubanMovies.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Edg/86.0.622.69'

# Obey robots.txt rules
ROBOTSTXT_OBEY = True

#HTTPERROR_ALLOWED_CODES = [400]#上面报的是403,就把403加入。

# MONGODB地址
MONGODB_HOST = '127.0.0.1'
# 端口号,默认27017
MONGODB_PORT = 27017
# 设置数据库名称
MONGODB_DBNAME = 'Douban'
# 设置集合名称
MONGODB_COL = 'movies'
ITEM_PIPELINES = {
   'DoubanMovies.pipelines.DoubanmoviesPipeline': 300,
}

在pipelines.py里面设置数据管道,这里小编封装了一层,数据库和集合的名字可以在程序中传递过来

from pymongo import MongoClient

from DoubanMovies import settings


class DoubanmoviesPipeline:
    def __init__(self):
        # 获取setting中主机名,端口号和集合名
        host = settings.MONGODB_HOST
        port = settings.MONGODB_PORT
        # dbname = settings.MONGODB_DBNAME
        # col = settings.MONGODB_COL

        # 创建一个mongo实例
        client = MongoClient(host=host, port=port)

        # 访问数据库
        # db = client[dbname]

        # 访问集合
        # self.col = db[col]

        # 访问数据连接器
        self.client = client

    def process_item(self, item, spider):
        data = dict(item)
        my_dbname = spider.dbname #自定义的数据库名--来自scrapy程序里面的dbname
        my_col = spider.col #自定义的集合名--来自scrapy程序里面的col
        self.client[my_dbname][my_col].insert(data)
        # self.col.insert(data)
        return item

然后打开目标网站:豆瓣电影 Top 250 (douban.com),然后分析网站结构,比如需要爬取电影名字,排名,导演以及主演等信息

打开F12,对你想要爬取的元素,可以复制其对应的xpath路径,爬取数据的时候会用到

分析完目标网站后,在items.py里面定义想要爬取的字段

#用于保存电影数据的item
class DoubanMovieItem(scrapy.Item):

    movie_name = scrapy.Field()  # 电影名字

    rank = scrapy.Field()  # 电影排名

    actors = scrapy.Field() #导演以及主演

    year = scrapy.Field() #上映年份

    area = scrapy.Field() #地域

    type = scrapy.Field() #类型

    rating_num = scrapy.Field() #评分

    short_comment = scrapy.Field() #短评

4、编写爬取程序

上面的数据库配置以及item设置好之后,开始编写爬取程序,注意xpath路径的正确性,不然爬取不到目标数据

由于要爬取前250名的电影数据,比较笨的方法就是start_urls里面写多个要爬取的url,比如像小编这样写的简单明了

import scrapy

from DoubanMovies.items import DoubanMovieItem


class DoubanSpider(scrapy.Spider):
    name = 'douban' #scrapy程序名
    allowed_domains = ['douban.com'] #允许的域名
    dbname = 'Douban'  # 数据库名字
    col = 'douban_movie250'  # 集合名字
    start_urls = ['https://movie.douban.com/top250',
                  'https://movie.douban.com/top250?start=25',
                  'https://movie.douban.com/top250?start=50',
                  'https://movie.douban.com/top250?start=75',
                  'https://movie.douban.com/top250?start=100',
                  'https://movie.douban.com/top250?start=125',
                  'https://movie.douban.com/top250?start=150',
                  'https://movie.douban.com/top250?start=175',
                  'https://movie.douban.com/top250?start=200',
                  'https://movie.douban.com/top250?start=225'] #需要爬取的网站url列表

    def parse(self, response):
        print(response)
        list = response.xpath('//*[@id="content"]/div/div[1]/ol/li') #xpath目标列表
        for li in list:
            # print(li)
            rank = li.xpath('div/div[1]/em/text()').extract()[0]
            movie_name = li.xpath('div/div[2]/div[1]/a/span[1]/text()').extract()[0]
            actors = li.xpath('div/div[2]/div[2]/p[1]/text()').extract()[0].strip()
            year = li.xpath('div/div[2]/div[2]/p[1]/text()').extract()[1].strip()
            rating_num = li.xpath('div/div[2]/div[2]/div/span[2]/text()').extract()[0].strip()
            if li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract():
                short_comment = li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract()[0].strip()
            else:
                short_comment = ''
            print(rank + ":" + movie_name + ":" + rating_num + ":" + short_comment)
            item = DoubanMovieItem()
            item['rank'] = int(rank) #排名
            item['movie_name'] = movie_name #电影名
            item['actors'] = actors #演职员
            item['year'] = year.split('/')[0] #上映年份
            item['area'] = year.split('/')[1] #上映地区
            item['type'] = year.split('/')[2] #电影类型
            item['rating_num'] = rating_num #豆瓣评分
            item['short_comment'] = short_comment #短评
            yield item #保存数据

5、开始爬取数据

程序写好了之后,就可以开始爬取数据了,当然过程中可能会有报错之类的,那就只能靠你自己修正了~

爬取命令:

scrapy crawl douban

爬取命令截图:

爬取过程截图:

爬取结果截图:

 

PS:以上便是简单的豆瓣电影Top 250的爬取过程了,相信热爱生活的你,能一直对生活充满好奇心,毕竟生活要有点期待,潇洒一点,开心最重要~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值