Python爬虫基础教程(24)Python Scrapy爬虫实战:今日影视之Scrapy爬虫编写:爬虫小白进阶记:手把手教你用Scrapy搞定今日影视,从此追剧不求人!

还记得那些年我们追剧的日子吗?对着屏幕疯狂刷新,在各个网站间反复横跳,就为找到能顺畅播放的资源。作为一名资深剧迷,我曾经也是个“资源乞丐”,直到我遇见了Scrapy——这个让Python爬虫变得像吃薯片一样简单的神器。今天,就让我带你亲手打造一个今日影视爬虫,告别求人分享的日子!放心,就算你是刚接触爬虫的小白,也能跟着这篇文章轻松上手。

第一章:为什么选择Scrapy?因为它真的很“懒人友好”

刚开始学爬虫时,我也试过用requests+BeautifulSoup的组合。那感觉就像是用手推车运货——能干活,但效率堪忧。每次都要自己处理请求、解析、存储,写到最后代码比我的购物车还长。

直到被朋友安利了Scrapy,我才发现新大陆。这玩意儿简直就是爬虫界的瑞士军刀!它自带的异步处理能力,让抓取速度像坐上了火箭;内置的选择器,解析HTML比用剪刀拆快递还顺手;还有那个管道系统,数据清洗存储一条龙服务。

最重要的是,Scrapy帮你把爬虫拆成了几个明明白白的模块,就像乐高积木一样,哪里需要改哪里,妈妈再也不用担心我的代码一团乱了。

第二章:环境准备:装好你的“爬虫工具箱”

在开始写代码前,咱们得先把工具准备好。别担心,过程比安装手机APP还简单。

打开你的命令行(Windows用户找cmd,Mac用户找Terminal),输入这个魔法咒语:

pip install scrapy

如果网络不太好(你懂的),可以使用清华的镜像源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy

安装完成后,验证一下是否成功:

scrapy version

看到版本号跳出来,就像收到“装备齐全,可以出发”的信号!

第三章:创建项目:搭建你的爬虫工厂

Scrapy采用项目制管理,这就像你要开工厂,得先选好厂址、建好厂房。

在你想存放项目的目录下,运行:

scrapy startproject movie_spider

这行命令会创建一个名为movie_spider的文件夹,里面已经贴心地帮你准备好了标准目录结构:

movie_spider/
    scrapy.cfg
    movie_spider/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

来个快速导览:

  • items.py:定义你要收集的数据结构,就像设计一张数据收集表
  • pipelines.py:数据处理流水线,清洗、去重、存储都在这里
  • settings.py:全局设置,爬虫的“控制面板”
  • spiders/:这里是爬虫的“员工宿舍”,你写的每个爬虫都住在这里

第四章:分析目标网站:像侦探一样观察

在开始写代码前,我们要先今日影视网站“踩点”。打开浏览器,按F12进入开发者模式,这就是我们的“侦查装备”。

观察今日影视的页面结构,我发现它有几个特点:

  1. 页面结构规整,每个影视项目都用类似的HTML标签包裹
  2. 分页规律明显,URL通常包含page参数
  3. 反爬措施相对温和,适合新手练习

重要提示:在写爬虫前,一定要检查网站的robots.txt文件(在网站域名后加/robots.txt)。虽然咱们是学习用途,但也要做个有道德的爬虫玩家。今日影视的robots.txt如果没有明确禁止爬取,咱们就可以继续,但请控制访问频率,别把人家服务器搞崩了。

第五章:编写Items:设计你的数据收集表

Items就像是你去超市带的购物清单,提前想好要买什么,到时候直接往篮子里放就行。

打开items.py文件,让我们定义需要收集的数据字段:

import scrapy

class MovieItem(scrapy.Item):
    # 影视名称
    title = scrapy.Field()
    # 评分
    rating = scrapy.Field()
    # 导演
    director = scrapy.Field()
    # 主演
    actors = scrapy.Field()
    # 类型
    movie_type = scrapy.Field()
    # 上映时间
    release_date = scrapy.Field()
    # 简介
    description = scrapy.Field()
    # 播放链接
    play_url = scrapy.Field()

这就好比我们决定要收集这些信息:名字、评分、谁演的、什么类型、什么时候上映、讲的是什么故事,以及在哪里能看。

第六章:编写爬虫:打造你的数据收割机

重头戏来了!在spiders文件夹下创建movie_spider.py文件:

import scrapy
from movie_spider.items import MovieItem

class TodayMovieSpider(scrapy.Spider):
    name = "today_movie"
    allowed_domains = ["www.jinriyingshi.com"]
    start_urls = ["https://www.jinriyingshi.com/movie/list/"]
    
    def parse(self, response):
        # 提取所有影视条目
        movies = response.css('.movie-item')
        
        for movie in movies:
            item = MovieItem()
            
            # 使用CSS选择器提取数据
            item['title'] = movie.css('.movie-title::text').get()
            item['rating'] = movie.css('.rating::text').get()
            item['director'] = movie.css('.director::text').get()
            item['actors'] = movie.css('.actors::text').get()
            item['movie_type'] = movie.css('.type::text').get()
            item['release_date'] = movie.css('.release-date::text').get()
            item['description'] = movie.css('.description::text').get()
            item['play_url'] = movie.css('.play-btn::attr(href)').get()
            
            yield item
        
        # 处理分页
        next_page = response.css('.next-page::attr(href)').get()
        if next_page:
            yield response.follow(next_page, callback=self.parse)

这个爬虫的工作原理很简单:

  1. 从start_urls开始访问
  2. 用parse方法解析响应,提取影视信息
  3. 找到下一页链接,继续爬取

实战技巧:如果网站是动态加载的,可以考虑使用Selenium中间件,但今日影视是静态页面,用Scrapy自带的选择器就足够了。

第七章:应对反爬:做个有礼貌的“访客”

现在的网站都有反爬机制,就像小区门禁一样。我们要做个有礼貌的访客,而不是硬闯的土匪。

在settings.py中配置这些参数:

# 遵守robots协议
ROBOTSTXT_OBEY = True

# 下载延迟,避免请求太快
DOWNLOAD_DELAY = 2

# 启用自定义User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

# 启用中间件
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
}

# 自动重试
RETRY_ENABLED = True

这些设置相当于:

  • 按门铃而不是砸门(遵守robots协议)
  • 走路而不是跑步(设置下载延迟)
  • 穿得像个正常人而不是蒙面侠(设置User-Agent)

第八章:数据处理:让杂乱的数据变整齐

爬下来的原始数据往往很乱,就像刚收获的土豆带着泥。我们需要在pipelines.py里清洗:

class MovieSpiderPipeline:
    def process_item(self, item, spider):
        # 清洗评分数据
        if item['rating']:
            item['rating'] = item['rating'].strip()
        
        # 处理演员数据
        if item['actors']:
            item['actors'] = [actor.strip() for actor in item['actors'].split(',')]
        
        # 去除描述中的多余空格
        if item['description']:
            item['description'] = ' '.join(item['description'].split())
        
        return item

别忘了在settings.py中启用这个管道:

ITEM_PIPELINES = {
    'movie_spider.pipelines.MovieSpiderPipeline': 300,
}

第九章:运行与调试:启动你的爬虫大军

一切准备就绪,是时候让我们的爬虫跑起来了!

scrapy crawl today_movie -o movies.json

这个命令会:

  • 启动名为today_movie的爬虫
  • 将结果保存到movies.json文件
  • 在控制台显示详细的爬取过程

常见翻车现场与解决方案

  1. 编码问题:如果看到乱码,在settings.py中设置FEED_EXPORT_ENCODING = 'utf-8'
  2. 被网站屏蔽:降低请求频率,增加下载延迟
  3. 选择器失效:定期检查网站结构是否变化,更新选择器
  4. 内存爆炸:在settings.py中设置CLOSESPIDER_ITEMCOUNT = 1000来限制爬取数量

第十章:进阶技巧:从新手到高手的必经之路

当你成功运行第一个爬虫后,可以尝试这些进阶操作:

分布式爬虫:使用Scrapy-Redis让多个爬虫协同工作,效率提升N倍:

# settings.py中添加
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://localhost:6379'

数据导出:除了JSON,还可以导出为CSV、XML,或者直接存入数据库:

scrapy crawl today_movie -o movies.csv
scrapy crawl today_movie -o movies.xml

定时任务:用APScheduler实现定时爬取,让爬虫自动工作:

from apscheduler.schedulers.twisted import TwistedScheduler
from scrapy.crawler import CrawlerProcess

scheduler = TwistedScheduler()
scheduler.add_job(crawl_job, 'interval', hours=1)
scheduler.start()

写在最后:爬虫之道,贵在节制

恭喜你!现在已经拥有了一个能干的今日影视爬虫。但记住能力越大责任越大,爬虫技术是把双刃剑。

几个原则请牢记:

  • 控制频率,别给人家服务器添麻烦
  • 遵守robots协议,做有道德的爬虫玩家
  • 仅用于学习目的,尊重版权和法律

爬虫最迷人的地方不在于能爬多少数据,而在于那种“让机器替你打工”的成就感。现在,你可以优雅地坐在电脑前,看着数据如流水般汇聚,而不用再像个无头苍蝇到处找资源了。

如果遇到问题,别忘了Scrapy有详细的官方文档和活跃的社区。爬虫之路,道阻且长,但行则将至。祝你在这个新技能树上越点越亮!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

值引力

持续创作,多谢支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值