萌新爬虫的动力就是爬取妹子图!批量爬取妹子图哟!
进群:960410445 即可获取源码! 目录
前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需求。那我们的 scrapy 能爬取图片吗?答案是,当然的。说来惭愧,我也是上个月才知道,在 zone7 粉丝群中,有群友问 scrapy 怎么爬取图片数据?后来搜索了一下才知道。现在总结一下分享出来。 Media Pipeline 我们的 itempipeline 处理可以处理文字信息以外,还可以保存文件和图片数据,分别是 FilesPipeline 和 ImagesPipeline Files Pipeline
FilesPipeline的典型工作流程如下:
Images Pipeline
启用Media Pipeline # 同时启用图片和文件管道 ITEM_PIPELINES = { # 使用时,请修改成你自己的 ImgPipeline 'girlScrapy.pipelines.ImgPipeline': 1,} FILES_STORE = os.getcwd() + '/girlScrapy/file' # 文件存储路径 IMAGES_STORE = os.getcwd() + '/girlScrapy/img' # 图片存储路径 # 避免下载最近90天已经下载过的文件内容 FILES_EXPIRES = 90 # 避免下载最近90天已经下载过的图像内容 IMAGES_EXPIRES = 30 # 设置图片缩略图 IMAGES_THUMBS = { 'small': (50,50),'big': (250,250),} # 图片过滤器,最小高度和宽度,低于此尺寸不下载 IMAGES_MIN_HEIGHT = 128 IMAGES_MIN_WIDTH = 128 需要说明的是,你下载的图片名最终会以图片 URL 的 hash 值命名,例如: 0bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg 最终的保存地址为: your/img/path/full/0bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg 使用 ImgPipeline 这是我 demo 中的一个 ImgPipeline,里面重写了两个方法。 from scrapy.pipelines.images import ImagesPipeline class ImgPipeline(ImagesPipeline):#继承 ImagesPipeline 这个类 def get_media_requests(self,item,info): for image_url in item['image_urls']: image_url = image_url yield scrapy.Request(image_url) def item_completed(self,results,info): image_paths = [x['path'] for ok,x in results if ok] if not image_paths: raise DropItem("Item contains no images") return item 分别是: get_media_requests(self,info): item_completed(self,info): get_media_requests(self,info): 在这里,我们可以获取到 parse 中解析的 item 值,因此我们可以获取到相应的图片地址。在这里返回一个 scrapy.Request(image_url) 去下载图片。 item_completed(self,info): item 和 info 打印出来都是 url 地址列表。其中 results 打印出来是如下值。 # 成功 [(True,{'path': 'full/0bddea29939becd7ad1e4160bbb4ec2238accbd9.jpg','checksum': '98eb559631127d7611b499dfed0b6406','url': 'http://mm.chinasareview.com/wp-content/uploads/2017a/06/13/01.jpg'})] # 错误 [(False,Failure(...))] 抓取妹子图 ok,理论部分也讲完了,那我们来实践一下吧 spider spider 部分很简单,如下: class GirlSpider(scrapy.spiders.Spider): name = 'girl' start_urls = ["http://www.meizitu.com/a/3741.html"] def parse(self,response): soup = BeautifulSoup(response.body,'html5lib') pic_list = soup.find('div',id="picture").find_all('img') # 找到界面所有图片 link_list = [] item = ImgItem() for i in pic_list: pic_link = i.get('src') # 拿到图片的具体 url link_list.append(pic_link) # 提取图片链接 item['image_urls'] = link_list print(item) yield item item class ImgItem(scrapy.Item): image_urls = scrapy.Field()#图片的链接 images = scrapy.Field() ImgPipeline class ImgPipeline(ImagesPipeline):#继承 ImagesPipeline 这个类 def get_media_requests(self,x in results if ok] if not image_paths: raise DropItem("Item contains no images") return item 启动 scrapy crawl girl 最终爬取结果如下: 删除了某些不适内容,哈哈哈 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |