ok, 接下来我们要将怎样多页爬取图片的信息,以及如何下载图片。

知识点涉及到:

  1. 自动的翻页爬取
  2. 多个parse 之间的request 传递
  3. 构建图片爬取的通道

さあ!始めようぜ!

首先我们要爬取的网站是这个: 知名的动漫壁纸网 http://Konachan.net

确定了目标之后,我们的第一个任务是创建一个爬虫项目以及一个爬虫

scrapy startproject konachan  scrapy genspider kona konachan.net

然后就是我们要解析这个网页,主页给的都是缩略图,我们要高清大图,就像点开这样:

所以我们还需要一个内置的网页的url, 我们可以在主页中进行爬取

那么我们任务开始,首先确定要爬取的内容,在items.py规定:(item.py文件如下)

# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass KonachanItem(scrapy.Item):# define the fields for your item here like:#由于我们使用的是scrapy 自带的图片下载通道,所以url 和图片名称必须按照配置文件设置# 即 Item里面 url 信息设置为 image_urls, 图片名称信息 设置为imagesimage_urls = scrapy.Field()  # 即 Item里面 url 信息设置为 image_urlsimages=scrapy.Field()        # 图片名称信息 设置为imagesdetailed=scrapy.Field()      # 高清页面的url

#由于我们使用的是scrapy 自带的图片下载通道,所以url 和图片名称必须按照配置文件设置 # 即 Item里面 url 信息设置为 image_urls, 图片名称信息 设置为images

然后是观察我们爬取信息的元素,使用F12(鼠标右键——检查) 进行元素的查看:

通过检查我们可以发现,在每个class为inner的div下的一个class="thumb" 里面的href属性对应的 url地址(相对于http://kona.net的相对地址),我们可以通过xpath进行提取:

    def parse(self, response):#获得要爬取的url的相对地址url_list = response.xpath("//div[@class='inner']//a[@class='thumb']/@href").extract()# 获得url的绝对地址for url in url_list:item1=KonachanItem()item1["detailed"] = urlitem1["detailed"] = "http://konachan.net" + item1["detailed"]

然后我们还要爬取下一页信息,我们同样可以进行检查:

我们看到了,在这个里面 Next对应的网址是 在class="next_page"的a标签中。那么,我们同样可以通过xpath进行提取,

next_url= response.xpath("//a[@class='next_page']/@href").extract_first()next_url='http://konachan.net'+ next_url#这里仅仅是测试哈,考虑内存只爬取两页if(self.cnt<2):self.cnt+=1# 回调给自己,继续解析yield scrapy.Request(next_url,callback=self.parse)

然后,我们需要在写一个parse 函数爬取详情页的图片地址,我们将其命名为parse_detail

我们首先观察详情页:

对应的图片信息的url在class=content的div 下的 id为image的image标签里面的src属性,同样用xpath爬取。不过parse_detail函数必须首先获得parse里面爬取到detail 的url 的request请求,并且获得item里面的url信息,并且以此为爬取的网页。因此,我们补充parse函数的具体内容:

    def parse(self, response):#获得要爬取的url的相对地址url_list = response.xpath("//div[@class='inner']//a[@class='thumb']/@href").extract()# 获得url的绝对地址for url in url_list:item1=KonachanItem()item1["detailed"] = urlitem1["detailed"] = "http://konachan.net" + item1["detailed"]#将绝对地址给第二个解析函数 parse_detail 进行解析yield scrapy.Request(item1["detailed"],callback = self.parse_detail,meta={"item":item1}  #meta 以字典的形式传递item信息)

我们加入的如下部分,构造了一个Request请求,给pars_detail执行,并且把url信息用meta传递。

 yield scrapy.Request(item1["detailed"],callback = self.parse_detail,meta={"item":item1}  #meta 以字典的形式传递item信息)

结合上述所写,我们来写parse_detail 函数:

  #定义解析详情页的函数def parse_detail(self,response):#接受parse函数传递的请求,接受item信息item1=response.meta["item"]#解析网页item1["image_urls"] = response.xpath("//div[@class='content']//img/@src").extract()#确定每次都传一个urlif len(item1["image_urls"])<2:item1["image_urls"] = item1["image_urls"]yield item1

ok,写完后,我们去写pipline.py

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.htmlimport logging
logger= logging.getLogger(__name__)
class KonachanPipeline(object):def process_item(self, item, spider):logger.warning(item["inner_url"])return item

这里不过是让它把爬到的信息 以日志的形式输出而已(便于查看),可以不写不改。

接下来我们要使用scrapy自带的图片管道去下载图片,首先在spider中插入引用:

# -*- coding: utf-8 -*-
import scrapy
#引入定义的item
from  konachan.items import  KonachanItem
# 引入 scrapy 自带的图片爬取通道,注意在setting里面要进行注释。
from  scrapy.pipelines.images import ImagesPipeline

这个scrapy.pipelins.image.ImagePipeline需要在settings.py里面注册:

ITEM_PIPELINES = {'konachan.pipelines.KonachanPipeline': 300,# 对图片通道进行注册'scrapy.pipelines.images.ImagesPipeline':299}

然后我们需要在settings.py 里面设置图片存取的文件名地址,以及用item的什么字段做需要下载的url.

我们可以看一个scrapy自带的ImagePiplines里面的source code:

MEDIA_NAME = 'image'# Uppercase attributes kept for backward compatibility with code that subclasses# ImagesPipeline. They may be overridden by settings.MIN_WIDTH = 0MIN_HEIGHT = 0EXPIRES = 90THUMBS = {}#这就是之前我们设置item属性为 image_urls以及images的原因:DEFAULT_IMAGES_URLS_FIELD = 'image_urls'DEFAULT_IMAGES_RESULT_FIELD = 'images'def __init__(self, store_uri, download_func=None, settings=None):super(ImagesPipeline, self).__init__(store_uri, settings=settings,download_func=download_func)if isinstance(settings, dict) or settings is None:settings = Settings(settings)resolve = functools.partial(self._key_for_pipe,base_class_name="ImagesPipeline",settings=settings)self.expires = settings.getint(resolve("IMAGES_EXPIRES"), self.EXPIRES)if not hasattr(self, "IMAGES_RESULT_FIELD"):self.IMAGES_RESULT_FIELD = self.DEFAULT_IMAGES_RESULT_FIELDif not hasattr(self, "IMAGES_URLS_FIELD"):self.IMAGES_URLS_FIELD = self.DEFAULT_IMAGES_URLS_FIELDself.images_urls_field = settings.get(resolve('IMAGES_URLS_FIELD'),self.IMAGES_URLS_FIELD)self.images_result_field = settings.get(resolve('IMAGES_RESULT_FIELD'),self.IMAGES_RESULT_FIELD)self.min_width = settings.getint(resolve('IMAGES_MIN_WIDTH'), self.MIN_WIDTH)self.min_height = settings.getint(resolve('IMAGES_MIN_HEIGHT'), self.MIN_HEIGHT)self.thumbs = settings.get(resolve('IMAGES_THUMBS'), self.THUMBS)

所以按照固定,我们还要在settings.py写图片的存储地址:

import  os
BOT_NAME = 'konachan'SPIDER_MODULES = ['konachan.spiders']
NEWSPIDER_MODULE = 'konachan.spiders'
# 定义log等级,只显示warning
LOG_LEVEL="WARNING"project_dir=os.path.abspath(os.path.dirname(__file__))  #获取当前爬虫项目的绝对路径
IMAGES_STORE = os.path.join(project_dir,'images')  #组装新的图片路径IMAGES_URLS_FIELD='image_urls'  #图片使用的字段# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/66.0'# Obey robots.txt rules
ROBOTSTXT_OBEY = True

ok,完事大吉,我们可以运行我们的爬虫了!

scrapy crawl kona

结果 输出为:

我们可以看懂,yield 返回了许多item ,并且都打印出来的item里面的url

我们查看我们保存图片的文件:

可以,看到图片被很好download了。

查看完全代码,可以查看我的github

https://github.com/Magicboomliu/ScrapyImage

scrapy爬取动态网页_动漫爱好者必会的Scrapy爬虫框架之———— 多页爬取图片的信息...相关推荐

  1. python动态页面元素爬取_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  2. python动态渲染抓取网页_爬取动态网页python+Web kit

    上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...

  3. java爬虫系列(二)——爬取动态网页

    准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...

  4. chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...

    系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...

  5. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  6. Python爬虫爬取动态网页

    系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...

  7. 【爬虫】Selenium爬取动态网页的base64图片

    文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...

  8. python爬取动态网页图片

    爬取某知名网站图片(爬取动态网页) python爬取动态网页图片 python爬取动态网页图片 环境: python3.pycharm 库: requests.urllib.json 思路: 1.分析 ...

  9. 爬取动态网页数据的软件-抓取动态网页数据的工具

    爬取动态网页数据,随着时代的进步,互联网的发展,不管是企业还是个人都知道了数据的重要性.今天给大家分享一款免费爬取动态网页数据的软件.只要点点鼠标就能轻松爬取到你想要的数据,不管是导出还是自动发布都支 ...

最新文章

  1. 使用 Xmlrpc 来控制cobbler api
  2. 图文方式管理Linux服务器(Webmin)
  3. studio 3t 在ubuntu中使用_在ubuntu中使用ufw配置防火墙
  4. Faster-RCNN训练时遇到的问题
  5. Shell命令-文件及内容处理之split、paste
  6. (*长期更新)软考网络工程师学习笔记——Section 5 数据链路层
  7. SAP 电商云 Spartacus UI DeliveryComponent 的依赖设计
  8. MacBook笔记本的几个快捷键的使用(学会事半功倍)
  9. 一行命令 优化上传速度
  10. 【CCS】CCS全局搜索
  11. hive中实现行转列_Hive之行转列lateral view用法
  12. oracle DML错误日志(笔记)
  13. 看完微软大神写的 求平均值代码,我意识到自己还是 too young 了
  14. mac 安装appium
  15. [转载]W3C XML Schema 与文档类型定义
  16. 应用内悬浮窗适配方案实战
  17. React初尝试-仿写CNode社区
  18. 滴滴2020校招算法笔试 2019.08.27
  19. 消失的数字(C语言)
  20. android shell打包报错

热门文章

  1. 多伦多大学计算机专业校区,多伦多大学计算机专业 简单介绍多伦多大学三个校区...
  2. Sui链上事务处理概述
  3. lepad k1 android 4,软硬齐升级 安卓3.1版联想乐Pad K1评测(7)
  4. Struts2,Spring,Hibernate框架的优缺点
  5. likely unlikely
  6. 乘风破浪的姐姐2都来了,你还在用之前的老式企业邮箱吗?
  7. STM32中重映射的功能和机理
  8. oracle tfa,oracle_TFA介绍以及相关操作
  9. 【C语言】专升本招生考试《C语言程序设计》试题
  10. 鸟哥Linux私房菜