Scrapy爬虫(4)爬取豆瓣电影Top250图片
在用Python的urllib和BeautifulSoup写过了很多爬虫之后,本人决定尝试著名的Python爬虫框架——Scrapy.
本次分享将详细讲述如何利用Scrapy来下载豆瓣电影Top250, 主要解决的问题有:
- 如何利用ImagesPipeline来下载图片
- 如何对下载后的图片重命名,这是因为Scrapy默认用Hash值来保存文件,这并不是我们想要的
首先我们要爬取的豆瓣电影Top250网页截图如下:

网页的结构并不复杂,所以,我们决定把所有的250部电影的图片都下载下来。接下来,就开始我们的Scrapy之旅啦~~
首先我们新建一个Scrapy项目,叫做doubanMovie.
scrapy startproject doubanMovie
该项目的文件树形结构如下:

修改items.py如下:
# -*- coding: utf-8 -*-
import scrapy
class DoubanmovieItem(scrapy.Item):
# two items: url and name of image
url = scrapy.Field()
img_name = scrapy.Field()
这是我们用来存放图片的url和name的部分。
接着,在spiders文件夹下,新建爬虫(Spider)文件:doubanMovieSpider.py, 文件代码如下:
import scrapy
from scrapy.spiders import Spider
from scrapy.selector import Selector
from doubanMovie.items import DoubanmovieItem
class movieSpider(Spider):
# name of Spider
name = "movie"
#start urls
start_urls = ["https://movie.douban.com/top250"]
for i in range(1,10):
start_urls.append("https://movie.douban.com/top250?start=%d&filter="%(25*i))
#parse function
def parse(self, response):
item = DoubanmovieItem()
sel = Selector(response)
images = sel.xpath('//*[@id="content"]/div/div[1]/ol/li')
item['url'] = []
item['img_name'] = []
# append the url and name of the image in item
for image in images:
# extract url and name of the image
site = image.xpath('div/div[1]/a/img/@src').extract_first()
img_name = image.xpath('div/div[1]/a/img/@alt').extract_first()
item['url'].append(site)
item['img_name'].append(img_name)
yield item
该部分代码主要利用xpath来提出网页中的电影图片的url和name,并添加到item中。
为了能够对下载后的图片进行重命名,我们需要修改pipeline.py文件,代码如下:
# -*- coding: utf-8 -*-
from scrapy.pipelines.images import ImagesPipeline
from scrapy.http import Request
class DoubanmoviePipeline(object):
def process_item(self, item, spider):
return item
class MyImagesPipeline(ImagesPipeline):
# yield meta for file_path() function
def get_media_requests(self, item, info):
for url in item['url']:
yield Request(url, meta={'item': item, 'index':item['url'].index(url)})
# rename the image
def file_path(self, request, response=None, info=None):
item = request.meta['item']
index = request.meta['index']
image_name = item['img_name'][index]
return 'full/%s.jpg' % (image_name)
在这儿我们添加了MyImagesPipeline类,主要目的是用来对下载后的图片进行重命名。
最后一步,也是关键的一步,就是修改settings.py文件,将其中的ROBOTSTXT_OBEY设置为False, 这是为了防止爬虫被禁,并且添加以下代码:
USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0"
ITEM_PIPELINES {'doubanMovie.pipelines.DoubanmoviePipeline': 2,
'doubanMovie.pipelines.MyImagesPipeline':1 }
IMAGES_URLS_FIELD = 'url'
IMAGES_STORE = r'.'
在上面的代码中,我们设置了USER_AGENT, 这是为了在Linux系统中模拟浏览器的设置,读者可以根据自己的系统和浏览器来设置不同的USER_AGENT. 同时, 我们又加了ITEM_PIPELINES管道和图片的保存路径。
一切就绪,我们就可以运行爬虫啦。切换到spiders文件夹下,输入scrapy list可以查看爬虫的名字,输入scrapy crawl movie即可运行爬虫。

movie爬虫的运行结果如下:

该爬虫下载了250个文件,用时约13秒,效率惊人啊!
下载后的图片保存在当前文件夹(spiders)下的full文件夹下,我们来看一下里面的内容:

Surprise!Wonderful! 里面有没有你喜欢的电影呢?
本项目的Github地址为 https://github.com/percent4/doubanMovieSpider, 欢迎大家访问哦~~
注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~
Scrapy爬虫(4)爬取豆瓣电影Top250图片的更多相关文章
- 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用
学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...
- 零基础爬虫----python爬取豆瓣电影top250的信息(转)
今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...
- scrapy框架 + selenium 爬取豆瓣电影top250......
废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ...
- scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250
scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...
- Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed
好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...
- scrapy爬取豆瓣电影top250
# -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...
- Python爬虫入门:爬取豆瓣电影TOP250
一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...
- python 爬虫&爬取豆瓣电影top250
爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...
- urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250
对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...
随机推荐
- h5上传视频文件
从一开始我就掉坑里了,<input type="file" style="display: block;" id="img-upload&quo ...
- ppt演讲者模式
步骤如下: 1 win+p 2 选择扩展 3 选幻灯片放映 4 设置幻灯片放映 5 显示器二 6 勾选显示演示者视图
- Linux编程之fork函数
在Linux中,fork函数的功能就是在一个进程中创建一个新的进程,当前调用fork函数的进程就是产生的新进程的父进程,新进程在以下也称为子进程.在新进程生成之后就会在系统中开始执行. 函数原型:pi ...
- 安装vue-cli脚手架构建工具
vue安装 1.vue安装: $ cnpm install vue 2.安装vue-cli脚手架构建工具: # 全局安装 vue-cli $ cnpm install --global vue-cli ...
- 我所理解Java集合框架的部分的使用(Collection和Map)
所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...
- 河北大学python选修课00次作业
学习python认为挺好玩的一件事.看到很多关于python的东西在网上,看到有这个课,认为只是选修课,别人也可以选,自己想不能被别人落下,别人都会,我不会可不行. 而且认为python是一个很强大的 ...
- JAVA主流框架---SSM整合
1.通过监听器的形式引入spring 2.SpringMVC容器和Spring容器间的关系 3.汇通的主旨 让大家熟练掌握SSM调用过程.并且将后台调用彻底掌握. 4.传统项目的搭建的弊端 1.传 ...
- 吴恩达机器学习笔记40-用调和平均数F来进行查准率和查全率之间的权衡(Trading Off Precision and Recall by F sore)
在很多应用中,我们希望能够保证查准率和查全率的相对平衡. 我们可以将不同阀值情况下,查全率与查准率的关系绘制成图表,曲线的形状根据数据的不同而不同: 我们希望有一个帮助我们选择这个阀值的方法.一种方法 ...
- JavaScript中+操作符的特殊性
在JavaScript中+操作符有两个作用: (1)加法运算 (2)字符串连接 在使用+操作符进行运算时,当+操作符两边都是数值类型的时候,进行加法运算; 当+操作符两边有任意一边是字符串,则进行字符 ...
- MySQL:数据库表的空间回收
1. 表数据的存储方式 表数据既可以存储在共享表空间,也可以时单独的文件.这个行为由参数 innodb_file_per_table 控制: 设置为 OFF 时,表示表数据存储在共享表空间: 设置为 ...