爬取360图解电影

原创

目的:使用Scrapy爬取360图解电影,保存至MONGODB数据库,并将图集按电影名称分类保存至本地

目标网址:http://image.so.com/z?ch=video

分析/知识点:

  1. 爬取难度:
    a. 入门级,电影索引页/详情页都是返回json数据结果;
    b. 图片分类保存:需要对内置ImagesPipeline进行继承后改写几个方法;

实际步骤:

  1. 创建Scrapy项目/tujiemovie360(spider)
Terminal: > scrapy startproject tujiemovie360
Terminal: > scrapy genspider tujiemovie image.so.com/z?ch=video   
  1. 配置settings.py文件
# MONGODB配置
MONGO_URI = 'localhost'
MONGO_DB = 'maoyan_movie'# 图集保存默认路径
IMAGES_STORE = './movies/'# 不遵守爬取机器人协议
ROBOTSTXT_OBEY = False# 设置headers
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}# 启用ImagePipeline/MongoPipeline
ITEM_PIPELINES = {'tujiemovie360.pipelines.ImagePipeline': 300,'tujiemovie360.pipelines.MongoPipeline': 301,
}
  1. 编写items.py文件
    注:此处创建了电影图集索引Item/详情页Item
# 图集IndexItem
class IndexItem(Item):id = Field()            # 电影图集id,重要actor = Field()         # 演员director = Field()      # 导演group_title = Field()   # 电影名称total_count = Field()   # 电影图集图片总数# 图集DetailItem
class DetailItem(Item):id = Field()            # 电影图集id,重要imageid = Field()       # 图片IDgroup_id = Field()      # 图集IDpic_title = Field()     # 电影图集名称pic_url = Field()       # 图片url(命名升序, gm_1/gm_2...)qhimg_url = Field()     # 图片url(高清) pic_url对应的是960x540分辨率的图片
  1. 编写pipelines.py文件
    a) MongoPipeline:根据官方例子改写。根据Item中所含字段不同,分别予以处理
# !! 更新MONGODB,使用UPDATE方法,查重功能def process_item(self, item, spider):# 保存movie_index信息if 'group_title' in item.fields:self.db['movie_index'].update({'id': item['id']}, {'$set': item}, upsert=True)# 保存movie_detail信息(图集)elif 'imageid' in item.fields:self.db['movie_detail'].update({'imageid': item['imageid']}, {'$set': item}, upsert=True)return item

b) ImagePipeline:
i. 根据获取的图集中每张图片的url(qhimg_url),重新生成Request进行请求下载

# 重写ImagesPipeline类的此方法# 发送图片下载请求def get_media_requests(self, item, info):yield Request(item['qhimg_url'])

ii. 获取文件名(下载时)

# 每张图片文件名(下载时的文件名,后续还要改名)
def file_path(self, request, response=None, info=None):url = request.urlfile_name = url.split('/')[-1]return file_name

iii. 图片默认下载路径为:IMAGES_STORE/full/;
下载完成后,根据图集名称创建对应文件夹,并将对应图片全部转移至相对应文件夹中,使用内置库shutil.move(src, des)完成此项功能

# 重写item_completed方法
# 将下载的文件保存到不同的目录中
def item_completed(self, results, item, info):image_path = [x['path'] for ok, x in results if ok]if not image_path:raise DropItem('Image Downloaded Failed')# 定义图集目录保存路径movie_dir = '%s%s' % (self.img_store, item['pic_title'])# 目录不存在则创建目录if not os.path.exists(movie_dir):os.mkdir(movie_dir)# 将文件从默认下路路径移动到指定路径下,同时变更文件名(gm_1~X)shutil.move(self.img_store + image_path[0], movie_dir + '/' + item['pic_url'].split('/')[-1])return item
  1. 编写spiders > tujiemovie.py文件
    注意:
    a) 在解析完索引页(parse_index)后,需要分别生成对具体图集的Request请求。此时需要注意sn的上限值计算(total_count // 60 + 1)
def parse_index(self, response):'''解析索引页'''...(略)# 请求每部电影图集详情页id = movie.get('id')total_count = movie.get('total_count')for sn in range(0, total_count // 60 + 1):yield Request(url=self.detail_url.format(id=id, sn=sn * 60), callback=self.parse_detail,dont_filter=True)

b) 完整代码如下:

import jsonfrom scrapy import Spider, Request
from tujiemovie360.items import IndexItem, DetailItemclass TujiemovieSpider(Spider):name = 'tujiemovie'allowed_domains = ['image.so.com/z?ch=video']start_urls = ['http://image.so.com/z?ch=video/']# 索引页index_url = 'http://image.so.com/zj?ch=video&sn={sn}&listtype=new&temp=1'# 详情页detail_url = 'http://image.so.com/zvj?ch=video&id={id}&pn=60&sn={sn}'# 重写def start_requests(self):# 索引页请求for sn in range(0, 1):  # 修改上限值,可以把整个图解电影全爬下来yield Request(url=self.index_url.format(sn=sn * 30), callback=self.parse_index, dont_filter=True)def parse_index(self, response):'''解析索引页'''results = json.loads(response.text)if 'list' in results.keys():for movie in results.get('list'):item = IndexItem()item['id'] = movie.get('id')item['group_title'] = movie.get('group_title')item['total_count'] = movie.get('total_count')item['actor'] = movie.get('actor')item['director'] = movie.get('director')yield item# 请求每部电影图集详情页id = movie.get('id')total_count = movie.get('total_count')for sn in range(0, total_count // 60 + 1):yield Request(url=self.detail_url.format(id=id, sn=sn * 60), callback=self.parse_detail,dont_filter=True)def parse_detail(self, response):'''解析电影图集详情页(每张图片)'''results = json.loads(response.text)if 'list' in results.keys():for pic in results.get('list'):item = DetailItem()item['id'] = pic.get('group_id')  # 电影图集iditem['imageid'] = pic.get('imageid')item['pic_url'] = pic.get('pic_url')item['pic_title'] = pic.get('pic_title')item['qhimg_url'] = pic.get('qhimg_url')yield item

6. 运行结果

小结

  1. 入门级项目,难度略微有所提升;
  2. 改写Scrapy内置ImagesPipeline,实现对图片的分类保存;
    *目前使用的是python内置库shutil/os,图片下载完成后再进行分类整理。但这样做的效率相对较低,需要进一步改进成在下载时就创建对应文件夹并保存。

Scrapy爬虫实战项目【003】 - 抓取360图解电影相关推荐

  1. Python爬虫实战六之抓取爱问知识人问题并保存至数据库

    大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...

  2. 十七、爬虫实战,多线程抓取大搜网新车的数据

    上次爬取毛豆新车的数据 十六.爬虫实战,多线程抓取毛豆新车的数据 这次爬取大搜车卖车 爬虫实战 对于之前学的知识,作一个整合,爬取大搜车卖车信息 目标:爬取大搜车卖车信息,并写入mongodb数据库 ...

  3. Python爬虫实战项目案例——爬取微信朋友圈

    项目实战   Appium爬取微信朋友圈   自动化爬取App数据 基于移动端的自动化测试工具Appium的自动化爬取程序. 步骤 1.JDK - Download JDK,Appium要求用户必须配 ...

  4. python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)

    上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架 跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为 ...

  5. python3 爬虫实战案例 (抓取淘宝信息)(淘宝加了搜索必须登录的验证,此方法所到的结果都是0)

    需求:对比足球,篮球,乒乓球,羽毛球,网球,相关物品的销售量保存到excle中 和抓取淘宝关键字相关信息的销售量,这和之前抓取csdn网站浏览量取不同,抓取csdn浏览量主要是通过bs4Tag标签,而 ...

  6. 十六、爬虫实战,多线程抓取毛豆新车的数据

    前言: 对于爬虫还有一点小知识 fake_useragent的使用 fake_useragent第三方库,来实现随机请求头的设置: 安装 -> pip3 install fake-userage ...

  7. app小程序手机端Python爬虫实战01-Uiautomator2自动化抓取工具介绍

    作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

  8. app小程序手机端Python爬虫实战02-uiautomator2自动化抓取开发环境搭建

    作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

  9. app小程序手机端Python爬虫实战13-fiddler如何抓取手机端数据包

    作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!

最新文章

  1. SpringBoot复习:2(@Configuration注解)
  2. 【颜值检测神器】来,请拿出你们的绝活(这颜值,对得起观众么?)
  3. 全民创业时代,谁在大潮退去前“活”下来?
  4. python3示例_Python3 实例(七)
  5. java获取mp3的时长和播放mp3文件
  6. nodejs学习(一)--express+ejs生成项目
  7. android 定时器 耗电,Android定时器
  8. 现金贷风控生命周期——贷前风控
  9. 痴人、信徒、先驱:深度学习三巨头等口述神经网络复兴史
  10. pytorch .item_从数据到模型,你可能需要1篇详实的pytorch踩坑指南
  11. cnsul linux环境后台启动_Linux环境下批量启动、停止或重启jar服务的shell脚本
  12. CAM350 V14.6 检查gerber文件
  13. 谷歌浏览器网页翻译失效,无法翻译成中文,且谷歌翻译api报404问题
  14. 使用python控制其他软件运行并操作处理数据_Python 运行其他程序
  15. 炒冷饭的“象棋人机大战”
  16. Cocos Creator性能优化-4-内存优化
  17. 小米网卡驱动linux,小米笔记本pro 15.6寸安装ubuntu16.04无法使用wifi的解决方法
  18. 网络游戏是如何开发的?
  19. 流氓软件强夺用户数据,马斯克截胡扎克伯格!
  20. 关于 运算符号 (与运算)、|(或运算)、^(异或运算)以及与 和 || 逻辑运算符区别

热门文章

  1. 值得信赖的全球投资者法律顾问ROSEN提醒Brookdale Senior Living, Inc.投资者注意BKD证券集体诉讼的重要截止日期
  2. Docker学习笔记3
  3. Programmer Log8[反射]_19.09.02
  4. 写给前端的 K8S 上手指南
  5. zookeeper 原理及使用场景2
  6. NO.2 QN9021 延时函数
  7. 苹果电脑快速安装双系统 Winclone镜像包,2021最新一键安装Windows7/Windows10/windows11镜像
  8. 考后对答案!2022年一级建造师考试真题答案
  9. PDF图片大小怎样调整?
  10. 澳洲移民 技术移民_我如何用Linux笔记本电脑欢迎移民家庭