Scrapy爬取天天美剧封面照及剧集下载地址

简介:

其实我只是想试试爬取图片而已j_0007.gif,先看看网页,需要爬的地方有两个,一是封面图,二是下载地址,挺简单的

wKioL1ZKmlPhdfkBAAI4-swYALQ626.png


Item定义:

1
2
3
4
5
6
7
8
9
10
import  scrapy
 
 
class  TiantianmeijuItem(scrapy.Item):
     name  =  scrapy.Field()
     image_urls  =  scrapy.Field()
     images  =  scrapy.Field()
     image_paths  =  scrapy.Field()
     episode  =  scrapy.Field()
     episode_url  =  scrapy.Field()

name是保存名字

image_urls和images 是爬取图片的pipeline用的,一个是保存图片URL,一个是保存图片存放信息

image_paths其实没什么实际作用,只是记录下载成功的图片地址

epiosde和episode_url是保存集数和对应下载地址


Spider:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import  scrapy
from  tiantianmeiju.items  import  TiantianmeijuItem 
import  sys
reload (sys)  # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding( 'utf-8' )
 
class  CacthUrlSpider(scrapy.Spider):
     name  =  'meiju'
     allowed_domains  =  [ 'cn163.net' ]
     start_urls  =  [ "http://cn163.net/archives/{id}/" . format ( id = id for  id  in  [ '16355' '13470' '18766' '18805' ]]
             
     def  parse( self , response):
         item  =  TiantianmeijuItem()
         item[ 'name' =  response.xpath( '//*[@id="content"]/div[2]/div[2]/h2/text()' ).extract()
         item[ 'image_urls' =  response.xpath( '//*[@id="entry"]/div[2]/img/@src' ).extract()
         item[ 'episode' =  response.xpath( '//*[@id="entry"]/p[last()]/a/text()' ).extract()
         item[ 'episode_url' =  response.xpath( '//*[@id="entry"]/p[last()]/a/@href' ).extract()
         yield  item

页面比较简单


Pipelines:这里写了两个管道,一个是把下载链接保存到文件,一个是下载图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import  json
import  os
from  scrapy.pipelines.images  import  ImagesPipeline
from  scrapy.exceptions  import  DropItem
from  scrapy.http  import  Request
from  settings  import  IMAGES_STORE
 
class  TiantianmeijuPipeline( object ):
     def  process_item( self , item, spider):
         return  item
     
     
class  WriteToFilePipeline( object ):  
     def  process_item( self , item, spider):
         item  =  dict (item)
         FolderName  =  item[ 'name' ][ 0 ].replace( '/' , '')  
         downloadFile  =  'download_urls.txt'
         with  open (os.path.join(IMAGES_STORE, FolderName, downloadFile),  'w' ) as  file :
             for  name,url  in  zip (item[ 'episode' ], item[ 'episode_url' ]):
                 file .write( '{name}: {url}\n' . format (name = name, url = url))
         return  item
     
class  MyImagesPipeline(ImagesPipeline):  
     def  get_media_requests( self , item, info):
         for  image_url  in  item[ 'image_urls' ]:
             yield  Request(image_url, meta = { 'item' : item})
               
     def  item_completed( self , results, item, info):
         image_paths  =  [x[ 'path' for  ok,x  in  results  if  ok]
         if  not  image_paths:
             raise  DropItem( "Item contains no images" )
         item[ 'image_paths' =  image_paths
         return  item
     
     def  file_path( self , request, response = None , info = None ):
         item  =  request.meta[ 'item' ]
         FolderName  =  item[ 'name' ][ 0 ].replace( '/' , '')
         image_guid  =  request.url.split( '/' )[ - 1 ]
         filename  =  u '{}/{}' . format (FolderName, image_guid)
         return  filename


get_media_requests和item_completed,因为默认的图片储存路径是

<IMAGES_STORE>/full/3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg,

我需要把full改成以美剧名字目录来保存,所以重写了file_path


settings打开pipelines相关配置:

1
2
3
4
5
6
7
8
ITEM_PIPELINES  =  {
     'tiantianmeiju.pipelines.WriteToFilePipeline' 2 ,
     'tiantianmeiju.pipelines.MyImagesPipeline' 1 ,
}
IMAGES_STORE  =  os.path.join(os.getcwd(),  'image' )    # 图片存储路径
IMAGES_EXPIRES  =  90
IMAGES_MIN_HEIGHT  =  110
IMAGES_MIN_WIDTH  =  110

爬下来之后就是这个效果了:

wKiom1ZK5eHwX9p2AACkME9RTbw155.png

wKioL1ZK5jPAQ7jKAAB1PPPDOCI622.png

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1713531如需转载请自行联系原作者


lihuipeng

相关文章
|
3月前
|
数据采集 Python
Scrapy框架 -- 深度爬取并持久化保存图片
Scrapy框架 -- 深度爬取并持久化保存图片
50 0
|
8月前
|
XML 数据采集 JSON
scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。
|
4月前
|
数据采集 JavaScript 开发者
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
|
6月前
|
数据采集 存储 中间件
Amazon图片下载器:利用Scrapy库完成图像下载任务
本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理中间件,以提高爬虫的效率和稳定性。
Amazon图片下载器:利用Scrapy库完成图像下载任务
|
8月前
|
数据采集 XML 存储
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
这个案例展示了如何使用 Scrapy 框架构建一个简单的爬虫项目,从网页中提取数据并保存到文件中。通过配置、编写爬虫代码、定义数据模型和数据处理管道,你可以灵活地构建各种爬虫应用。
210 0
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
|
数据采集 存储 JSON
「Python」爬虫-9.Scrapy框架的初识-公交信息爬取
本文将讲解如何使用scrapy框架完成北京公交信息的获取。
637 0
|
10月前
|
数据采集 开发者 Python
如何使用Scrapy框架爬取301跳转后的数据
如何使用Scrapy框架爬取301跳转后的数据
|
数据采集 Web App开发 存储
使用 Scrapy + Selenium 爬取动态渲染的页面
使用 Scrapy + Selenium 爬取动态渲染的页面
397 0
使用 Scrapy + Selenium 爬取动态渲染的页面
|
Python 容器
使用 Scrapy 框架来爬取数据
创建一个 Scrapy 项目,项目文件可以直接用 scrapy 命令生成,命令如下所示:scrapy startproject doubanmovie250 这个命令可以在任意文件夹运行。如果提示权限问题,可以加 sudo 运行该命令。
205 0
|
数据采集 数据库 Python
Scrapy爬取豆瓣
使用Scrapy爬取豆瓣Top250数据