scrapy图片-爬取哈利波特壁纸
话不多说,直接开始,直接放上整个程序过程
1、创建工程和生成spiders就不用说了,会用scrapy的都知道。
2、items.py
class HarryItem(scrapy.Item): # define the fields for your item here like: img_url = scrapy.Field() img_name = scrapy.Field()
3、pipelines.py
import os from harry.settings import IMAGES_STORE as IMGS from scrapy.pipelines.images import ImagesPipeline from scrapy import Request class HarryPipeline(object): def process_item(self, item, spider): return item class HarryDownLoadPipeline(ImagesPipeline): def get_media_requests(self, item, info): for imgurl in item['img_url']: yield Request(imgurl) #以下代码为自定义图片名称的新增代码 # def item_completed(self, results, item, info): # print ('******the results is********:',results) # os.rename(IMGS + '/' + results[0][1]['path'], IMGS + '/' + item['img_name']) # def __del__(self): # #完成后删除full目录 # os.removedirs(IMGS + '/' + 'full')
4、settings.py
BOT_NAME = 'harry' SPIDER_MODULES = ['harry.spiders'] NEWSPIDER_MODULE = 'harry.spiders' ROBOTSTXT_OBEY = False IMAGES_URLS_FIELD = "img_url" # 对应item里面设定的字段,取到图片的url IMAGES_STORE = 'E:/harrypotter' ITEM_PIPELINES = { 'harry.pipelines.HarryDownLoadPipeline': 300, }
5、最主要的爬虫组件hr.py
# -*- coding: utf-8 -*- import scrapy from harry.items import HarryItem from scrapy import Request class HrSpider(scrapy.Spider): name = 'hr' allowed_domains = ['www.ivsky.com'] sts=[] st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018' for x in range(6,24): if x<10: sts.append(st+'0'+str(x)+'.html') else: sts.append(st+str(x)+'.html') start_urls = sts def parse(self, response): item=HarryItem() urls=response.xpath('//div[@id="pic_con"]/div/img[@id="imgis"]/@src').extract()
names=response.xpath('//div[@id="pic_con"]/div/img[@id="imgis"]/@src').extract()[0].split('/')[-1]
item['img_name']=names
print ('links is :--','\n',urls)
item['img_url']=urls yield item
6、执行爬虫
进入到工程路径,比如我的是harry这个路径中,执行 scrapy crawl hr #hr 是我设置的爬虫名称
7、总结
此次爬虫,有两方面的小收获。
收获①这个网站的网页设置很奇怪,用google浏览器F12打开看到图片链接结构是div/div/a/img/@src,但用 这个结构去爬取,发现链接都是空的(这也就是我的spiders中故意设置一 行print ('links is :--','\n',urls)的原因了,可以看到爬取过程的log,图片链接有没有正常爬取到)。所以直接邮件查看网页源代码,发现了猫腻,以下两张图片做对比可以发现实际只有div/div/img/@src这个结构才能真正获取到图片链接。怀疑是网站的程序猿将tag搞错<img> 和</a>配对了,在“查看网页源代码”可以看到是这样。
图片一:F12查看的结构
图片二、右键“查看网页源代码”
收获②
如果有些网页是类似下面数字翻页的,而且下一页中的链接不容易提取到的,那么可以用以下将要爬取的图片页面链接全部放置在start_urls这个list中
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101808.html
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101809.html
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101811.html
class HrSpider(scrapy.Spider): name = 'hr' allowed_domains = ['www.ivsky.com'] sts=[] st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018' for x in range(6,24): if x<10: sts.append(st+'0'+str(x)+'.html') else: sts.append(st+str(x)+'.html') start_urls = sts
欢迎大家留言讨论,转载请注明出处。