scrapy爬取豆瓣热门电影

本文介绍了一个基于Python和Scrapy的豆瓣热门电影爬虫项目,包括如何采集电影基本信息(如导演、编剧等),并将其存储到MySQL数据库。项目通过Item定义字段、Spider实现登录与数据抓取、Pipelines处理数据存储。

放弃谁都可以,千万不要放弃自己!

640?wx_fmt=png


目标

采集豆瓣热门电影的基本信息,导演、编剧、主演、上映时间等并将数据存入MySql中。

该项目中使用的开发环境:

  • python3.6

  • scrapy1.5

  • mysql5.7


scrapy编写

scrapy三部曲Item、spider、pipelines,下面我们依次来编写者三个模块的代码。

Item

item中主要定义要采集的字段,我们主要采集电影标题、导演、编剧、主演等字段,具体字段如下:


Pipelines

pipelines管道主要用来初始化数据库的连接和相关数据可的操作。所以我们将涉及数据库的操作都放在这里进行,项目中pipelines的代码如下:



spider

spider是scrapy的核心部分,在该项目中应用了scrapy提供的表单模拟登录功能进行登录,在不登录的情况下,有可能会被系统检测到非法操作,从而禁止你的IP访问。经过我对豆瓣热门电影的分析,在列表页利用的是js渲染数据,详情页则没有使用js渲染,故获取列表页是,我们从js中获取数据,利用json.loads将数据转换成json数据,便于数据的提取,详情页利用scrapy提供的xpath解析数据。spider代码如下:

最后

运行结果就不在这里贴出来了,项目github地址豆瓣电影,需要注意的一个地方,需要将Setting中的ROBOTSTXT_OBEY设置为False,js获取电影列表数据是好像设置了不让爬取。



### 爬取豆瓣热门电影的前两条数据 为了爬取豆瓣热门电影列表中的前两条数据,需要定义一个Scrapy爬虫,并通过特定的逻辑控制只提取前两条记录。以下是一个完整的实现步骤和示例代码。 #### 1. 创建Scrapy项目 如果尚未创建Scrapy项目,请运行以下命令: ```bash scrapy startproject douban_hot cd douban_hot ``` 接着生成爬虫文件: ```bash scrapy genspider hot_movie movie.douban.com ``` #### 2. 定义Item字段 在 `items.py` 中定义要爬取的数据字段: ```python import scrapy class DoubanHotItem(scrapy.Item): # 电影名称 name = scrapy.Field() # 导演 director = scrapy.Field() # 类型 genre = scrapy.Field() # 分 rating = scrapy.Field() ``` #### 3. 编写爬虫逻辑 编辑 `spiders/hot_movie.py` 文件,添加解析逻辑并限制只获取前两条数据: ```python import scrapy from douban_hot.items import DoubanHotItem class HotMovieSpider(scrapy.Spider): name = 'hot_movie' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/cinema/nowplaying/beijing/'] # 豆瓣正在热映页面 def __init__(self, *args, **kwargs): super(HotMovieSpider, self).__init__(*args, **kwargs) self.count = 0 # 计数器用于限制数据量 def parse(self, response): # 提取所有电影条目 movies = response.css('li.release-list-item') for movie in movies: if self.count >= 2: # 如果已经收集到两条数据,则停止 return item = DoubanHotItem() item['name'] = movie.css('a.movie-name-text::text').get() item['director'] = movie.css('div.meta span::text').getall()[0].strip() item['genre'] = movie.css('div.meta span::text').getall()[1].strip() item['rating'] = movie.css('span.rating_num::text').get() yield item self.count += 1 # 每采集一条数据计数器加一 ``` #### 4. 配置Pipeline(可选) 在 `settings.py` 中启用Pipeline以保存数据: ```python ITEM_PIPELINES = { 'douban_hot.pipelines.DoubanHotPipeline': 300, } ``` #### 5. 运行爬虫 使用以下命令启动爬虫并输出前两条数据: ```bash scrapy crawl hot_movie -o output.json ``` 这将把结果保存到 `output.json` 文件中,且仅包含前两条记录。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值