51Testing软件测试论坛
标题:
scrapy-3 利用框架,抓取图片
[打印本页]
作者:
My_JIE
时间:
2019-2-21 17:04
标题:
scrapy-3 利用框架,抓取图片
先到项目的目录下
/root/Scrapy/boge/boge
首先安装图片库的支持 Ubuntu apt-get install libjpeg-dev libfreetype6-dev zlib1g-dev
centos yum install libjpeg-devel freetype-devel zlib-devel
#############################################################################################################################
###PIL pip install PIL --allow-external PIL --allow-unverified PIL 不得不吐槽下这个库 真是难用,各种报错,我们就不用这个库了。。。。#
#############################################################################################################################
安装Pillow ==========> pip install Pillow 这个靠谱,建议用这个
root@Scrapy:~/Scrapy/boge/boge#cat items.py
from scrapy.item import Item, Field
class BogeItem(Item):
# define the fields for your item here like:
# name = Field()
image_urls = Field() 我们定义的菜单,类似字典的形式
images = Field()
root@Scrapy:~/Scrapy/boge/boge# cat pipelines.py
#定义项目管道
class BogePipeline(object):
def process_item(self, item, spider):
return item
下面这部分重写的操作如果不熟悉源码就不要写进来了
复制代码
下面这部分重写的操作如果不熟悉源码就不要写进来了
###############################################################################################################################################
#import scrapy
#from scrapy.contrib.pipeline.images import ImagesPipeline
#from scrapy.exceptions import DropItem
#
#class MyImagesPipeline(ImagesPipeline): 重写ImagesPipeline,我们需要在这里重写下载的函数才能下载
#
# def get_media_requests(self, item, info): | 源码 def get_media_requests(self, item, info):
# for image_url in item['image_urls']: | return [Request(x) for x in item.get(self.IMAGES_URLS_FIELD, [])]
# yield scrapy.Request(image_url) | #我们在这里自己定义了item字典中的urls如何传给图片管道
#
# def item_completed(self, results, item, info): |源码 def item_completed(self, results, item, info):
# image_paths = [x['path'] for ok, x in results if ok] | if self.IMAGES_RESULT_FIELD in item.fields:
# if not image_paths: | item[self.IMAGES_RESULT_FIELD] = [x for ok, x in results if ok]
# raise DropItem("Item contains no images") | return item
# item['image_paths'] = image_paths |
# return item |
###############################################################################################################################################
复制代码
root@Scrapy:~/Scrapy/boge/boge# cat settings.py
#开启图片管道以及定义图片的配置
BOT_NAME = 'boge'
SPIDER_MODULES = ['boge.spiders']
NEWSPIDER_MODULE = 'boge.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'boge (+http://www.yourdomain.com)'
ITEM_PIPELINES = {'scrapy.contrib.pipeline.images.ImagesPipeline': 1}
#1,2表示优先级,启用图片管道,我查看了下源码ImagesPipeline是继承了
FilesPipeline,所以这里不需要启用FilesPipeline
IMAGES_STORE = '/tmp/pic'
IMAGES_EXPIRES = 15
#IMAGES_MIN_HEIGHT = 110
#IMAGES_MIN_WIDTH = 110
/root/Scrapy/boge/boge/spiders
root@Scrapy:~/Scrapy/boge/boge/spiders# cat pa.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from scrapy import spider
from scrapy.selector import Selector #导入提取器
from boge.items import BogeItem #这里是导入了我们的item.py 里我们自己定义的类
class boge(spider.Spider): #重写Spider
name = "moive" #唯一的爬虫名字
allowed_domains = ["blu-raydisc.tv"] #允许的域,防止无限爬
start_urls = [ #开始的urls
"http://blu-raydisc.tv/",
]
def parse(self, response): #处理模块
sel = Selector(response) #实例化Selector,参数为reponse
item = BogeItem() #实例化我们自己定义item,可以理解为实例化字典
item['image_urls'] = sel.xpath('//img/@src').extract() #提取图片,前面一章已经讲解了xapth
return item
复制代码
好了,这里我们结构已经搭建好了。来运行一下如何
root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive
复制代码
这里输出太多了,就不打印出来了
如果你想保存这些链接
root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive -o urls.txt -t json
复制代码
以json的格式保存urls下载图片
root@Scrapy:~/Scrapy/boge/boge/spiders# cat pa.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from scrapy import spider
from scrapy.selector import Selector
from boge.items import BogeItem
import os
class boge(spider.Spider):
name = "moive"
allowed_domains = ["blu-raydisc.tv"]
start_urls = [
"http://blu-raydisc.tv/",
]
def parse(self, response):
sel = Selector(response)
item = BogeItem()
item['image_urls'] = sel.xpath('//img/@src').extract()
# item['image_urls'] = sel.xpath('//img/@src').re(r'.*[jpg|gif|png]我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来 迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。
)
item['images'] = sel.xpath('//img/@src').re(r'[^/]*.[jpg|png|gif]我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来 迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。
)
# [os.system('wget %s' %i) for i in item['image_urls']] 我们上面启用了下载管道,这句话就不科学了 果断注释掉
return item
复制代码
我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来 迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。
作者:
Miss_love
时间:
2020-12-31 09:51
支持分享
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2