scrapy爬取动态网页_动漫爱好者必会的Scrapy爬虫框架之———— 多页爬取图片的信息...
ok, 接下来我们要将怎样多页爬取图片的信息,以及如何下载图片。
知识点涉及到:
- 自动的翻页爬取
- 多个parse 之间的request 传递
- 构建图片爬取的通道
さあ!始めようぜ!
首先我们要爬取的网站是这个: 知名的动漫壁纸网 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爬虫框架之———— 多页爬取图片的信息...相关推荐
- python动态页面元素爬取_爬取动态网页python+Web kit
上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...
- python动态渲染抓取网页_爬取动态网页python+Web kit
上一篇文章爬取动态网页python+selenium+webdriver介绍了爬取动态网站的一种模拟浏览器的方法,该方法的优劣也很明显 优: 可以模拟任何人的操作,输入账号密码,点击登录等等操作 劣: ...
- java爬虫系列(二)——爬取动态网页
准备工作 项目地址 网页解析工具地址 启动网页解析器 根据系统选择所需文件 指定端口号启动工具 项目配置 seimi.properties SeimiAgentDemo.java 分析原网页代码 Bo ...
- chrome动态ip python_用Python爬虫爬取动态网页,附带完整代码,有错误欢迎指出!...
系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...
- Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...
- Python爬虫爬取动态网页
系统环境: 操作系统:Windows8.1专业版 64bit Python:anaconda.Python2.7 Python modules:requests.random.json Backgro ...
- 【爬虫】Selenium爬取动态网页的base64图片
文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...
- python爬取动态网页图片
爬取某知名网站图片(爬取动态网页) python爬取动态网页图片 python爬取动态网页图片 环境: python3.pycharm 库: requests.urllib.json 思路: 1.分析 ...
- 爬取动态网页数据的软件-抓取动态网页数据的工具
爬取动态网页数据,随着时代的进步,互联网的发展,不管是企业还是个人都知道了数据的重要性.今天给大家分享一款免费爬取动态网页数据的软件.只要点点鼠标就能轻松爬取到你想要的数据,不管是导出还是自动发布都支 ...
最新文章
- 使用 Xmlrpc 来控制cobbler api
- 图文方式管理Linux服务器(Webmin)
- studio 3t 在ubuntu中使用_在ubuntu中使用ufw配置防火墙
- Faster-RCNN训练时遇到的问题
- Shell命令-文件及内容处理之split、paste
- (*长期更新)软考网络工程师学习笔记——Section 5 数据链路层
- SAP 电商云 Spartacus UI DeliveryComponent 的依赖设计
- MacBook笔记本的几个快捷键的使用(学会事半功倍)
- 一行命令 优化上传速度
- 【CCS】CCS全局搜索
- hive中实现行转列_Hive之行转列lateral view用法
- oracle DML错误日志(笔记)
- 看完微软大神写的 求平均值代码,我意识到自己还是 too young 了
- mac 安装appium
- [转载]W3C XML Schema 与文档类型定义
- 应用内悬浮窗适配方案实战
- React初尝试-仿写CNode社区
- 滴滴2020校招算法笔试 2019.08.27
- 消失的数字(C语言)
- android shell打包报错
热门文章
- 多伦多大学计算机专业校区,多伦多大学计算机专业 简单介绍多伦多大学三个校区...
- Sui链上事务处理概述
- lepad k1 android 4,软硬齐升级 安卓3.1版联想乐Pad K1评测(7)
- Struts2,Spring,Hibernate框架的优缺点
- likely unlikely
- 乘风破浪的姐姐2都来了,你还在用之前的老式企业邮箱吗?
- STM32中重映射的功能和机理
- oracle tfa,oracle_TFA介绍以及相关操作
- 【C语言】专升本招生考试《C语言程序设计》试题
- 鸟哥Linux私房菜