在用Python的urllib和BeautifulSoup写过了很多爬虫之后,本人决定尝试著名的Python爬虫框架——Scrapy.

  本次分享将详细讲述如何利用Scrapy来下载豆瓣电影Top250, 主要解决的问题有:

  • 如何利用ImagesPipeline来下载图片
  • 如何对下载后的图片重命名,这是因为Scrapy默认用Hash值来保存文件,这并不是我们想要的

  首先我们要爬取的豆瓣电影Top250网页截图如下:

![豆瓣电影Top250网页](http://img.blog.csdn.net/20180314130625190?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

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

scrapy startproject doubanMovie

该项目的文件树形结构如下:

![文件树形结构](http://img.blog.csdn.net/20180314131154143?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  修改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即可运行爬虫。

![查看和运行爬虫](http://img.blog.csdn.net/20180314133712315?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  movie爬虫的运行结果如下:

![爬虫运行结果](http://img.blog.csdn.net/20180314133902904?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

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

![下载图片](http://img.blog.csdn.net/20180314134256806?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  Surprise!Wonderful! 里面有没有你喜欢的电影呢?

  本项目的Github地址为 https://github.com/percent4/doubanMovieSpider, 欢迎大家访问哦~~

注意:本人现已开通两个微信公众号: 因为Python(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

Scrapy爬虫(4)爬取豆瓣电影Top250图片的更多相关文章

  1. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python requests的使用. 1.准备工作 在pycharm中安装request库 ...

  2. 零基础爬虫----python爬取豆瓣电影top250的信息(转)

    今天利用xpath写了一个小爬虫,比较适合一些爬虫新手来学习.话不多说,开始今天的正题,我会利用一个案例来介绍下xpath如何对网页进行解析的,以及如何对信息进行提取的. python环境:pytho ...

  3. scrapy框架 + selenium 爬取豆瓣电影top250......

    废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ...

  4. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  5. Scrapy中用xpath/css爬取豆瓣电影Top250:解决403HTTP status code is not handled or not allowed

    好吧,我又开始折腾豆瓣电影top250了,只是想试试各种方法,看看哪一种的方法效率是最好的,一直进行到这一步才知道 scrapy的强大,尤其是和selector结合之后,速度飞起.... 下面我就采用 ...

  6. scrapy爬取豆瓣电影top250

    # -*- coding: utf-8 -*- # scrapy爬取豆瓣电影top250 import scrapy from douban.items import DoubanItem class ...

  7. Python爬虫入门:爬取豆瓣电影TOP250

    一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...

  8. python 爬虫&爬取豆瓣电影top250

    爬取豆瓣电影top250from urllib.request import * #导入所有的request,urllib相当于一个文件夹,用到它里面的方法requestfrom lxml impor ...

  9. urllib+BeautifulSoup无登录模式爬取豆瓣电影Top250

    对于简单的爬虫任务,尤其对于初学者,urllib+BeautifulSoup足以满足大部分的任务. 1.urllib是Python3自带的库,不需要安装,但是BeautifulSoup却是需要安装的. ...

随机推荐

  1. Centos7配置hadoop伪分布式

    修改hostname(可选) 通过下面命令查看hostname信息 hostnamectl 通过下面命令修改hostname hostnamectl set-hostname gy01 如图所示 下面 ...

  2. Windows下安装BeautifulSoup4显示'You are trying to run the Python 2 version of Beautiful Soup under Python 3.(`python setup.py install`) or by running 2to3 (`2to3 -w bs4`).'

    按照网上教程,将cmd的目录定位到解压缩文件夹地址,然后 >>python setup.py install ( Window下不能直接解压tar.giz文件,可以使用7z解压软件提取解压 ...

  3. HTB Linux queuing discipline manual - user guide笔记

    1. Introduction HTB is meant as a more understandable, intuitive and faster replacement for the CBQ ...

  4. 浅析B/S架构数据库连接方式

    前言 在许许多多的B/S架构系统中都涉及到了数据库的链接,那么对于数据库连接的方式有哪些?可能出现的问题是什么?   目录 1.普通连接方式 2.单例模式 3.连接池   分析 普通连接: 下面是我们 ...

  5. 吴恩达机器学习笔记42-大边界的直观理解(Large Margin Intuition)

    这是我的支持向量机模型的代价函数,在左边这里我画出了关于

  6. Java学习笔记一:数据类型I

    GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/IntPractice1.java https://github.com ...

  7. idea src下源文件和class编译文件不一致

    今天遇到一个神奇BUG,一个和elasticsearch没有任何关系的项目,报错ES某个包找不到,刚开始以为是依赖了父项目的某个包,并且本项目主启动类ComponentScan扫描了相关的类进入Spr ...

  8. 机器学习入门05 - 泛化 (Generalization)

    原文链接:https://developers.google.com/machine-learning/crash-course/generalization 泛化是指模型很好地拟合以前未见过的新数据 ...

  9. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  10. 解决使用display:inline-block时元素间隔问题

    在写个人博客页时出现了一个百思不得其解的问题,不知道为什么出现以下情况: 可以看到,下面的a标签中出现了一个间隔,怎么都去不掉,查阅资料后发现,问题原因如下: 1.第一种解决办法,去掉HTML元素中的 ...