pythonScrapy批量采集妹子图网的图片
这部分相当有用,咱们不多说,目前是2016.6.22日亲测可用.环境方面是linux_ubuntu_15.04python_scrapy的环境搭建有问题请看之前的scrapy笔记
代码在:githubhttps://github/luyishisi/WebCrawlers/tree/master/scrapy_code/meizitu
先上最终截图,有动力好好学习了没?
0.创建项目
Python
1.修改item.py
importscrapyclassMeizituItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()url=scrapy.Field()name=scrapy.Field()tags=scrapy.Field()image_urls=scrapy.Field()images=scrapy.Field()
2.修改pipelines.py
123456789101112131415161718192021222324252627282930313233343536373839404142
#-*-coding:utf-8-*-#图片下载部分(自动增量)importrequestsfrommeizituimportsettingsimportos#图片下载类classImageDownloadPipeline(object):defprocess_item(self,item,spider):if'image_urls'initem:#如果‘图片地址’在项目中images=[]#定义图片空集dir_path='%s/%s'%(settings.IMAGES_STORE,spider.name)#建立目录名字和项目名称一致ifnotos.path.exists(dir_path):os.makedirs(dir_path)#根据item字典进行查询forimage_urlinitem['image_urls']:us=image_url.split('/')[3:]image_file_name='_'.join(us)file_path='%s/%s'%(dir_path,image_file_name)images.append(file_path)#如果这个文件存在则跳过ifos.path.exists(file_path):continue#进行图片文件写入,wb模式打开文件,然后requests.get获取图片流,withopen(file_path,'wb')ashandle:response=requests.get(image_url,stream=True)forblockinresponse.iter_content(1024):#获取的流如果有不存在的,则使用break结束,如果没有一次结束则进行写入ifnotblock:breakhandle.write(block)item['images']=images#即使注释了也一样效果,不知道为何returnitem
3.修改settings.py
#-*-coding:utf-8-*-BOT_NAME='meizitu'SPIDER_MODULES=['meizitu.spiders']NEWSPIDER_MODULE='meizitu.spiders'#载入ImageDownLoadPipeline类ITEM_PIPELINES={'meizitu.pipelines.ImageDownloadPipeline':1}#图片储存IMAGES_STORE='.'
4.建立spiders/meizi.py
注意这里名字不可以和项目文件夹的名字一样就是说不可以是meizitu。否则会报错
原scrapyImportError:Nomodulenameditems
ImportError:Nomodulenameditems
https://groups.google/forum/#!msg/scrapy-users/aYrpirKBK8Q/i1Su6UJbwjEJ
spiders目录中的.py文件不能和项目名同名。
1234567891011121314151617181920212223242526272829303132333435363738394041424344
#-*-coding:utf-8-*-importscrapyfromscrapy.selectorimportSelector#ItemLoaders提供了一种便捷的方式填充抓取到的:Itemsfromscrapy.contrib.loaderimportItemLoader,Identityfrommeizitu.itemsimportMeizituItemclassMeiziSpider(scrapy.Spider):name="meizi"allowed_domains=["meizitu"]start_urls=('http://meizitu/',)defparse(self,response):#sel是页面源代码,载入scrapy.selectorsel=Selector(response)#每个连接,用@href属性forlinkinsel.xpath('//h2/a/@href').extract():#请求=Request(连接,parese_item)request=scrapy.Request(link,callback=self.parse_item)yieldrequest#返回请求#获取页码集合pages=sel.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()print('pages:%s'%pages)#打印页码iflen(pages)>2:#如果页码集合>2page_link=pages[-2]#图片连接=读取页码集合的倒数第二个页码page_link=page_link.replace('/a/','')#图片连接=page_link(a替换成空)request=scrapy.Request('http://meizitu/a/%s'%page_link,callback=self.parse)yieldrequest#返回请求defparse_item(self,response):#l=用ItemLoader载入MeizituItem()l=ItemLoader(item=MeizituItem(),response=response)#名字l.add_xpath('name','//h2/a/text()')#标签l.add_xpath('tags',"//p[@id='maincontent']/p[@class='postmetaclearfix']/p[@class='metaRight']/p")#图片连接l.add_xpath('image_urls',"//p[@id='picture']/p/img/@src",Identity())#urll.add_value('url',response.url)returnl.load_item()
5.运行
6.检查效果
在执行命令的这个目录下就可以看到啦一个meizi的文件夹