Python】Scrapy抓取多玩Gif图片


文件准备
  • 安装python2.7.5
  • 安装pywin32
  • 安装py-setuptool
  • 要用到的文件打包下载:点击下载


安装Scrapy:

  • 配置环境变量:将【C:\Python27\】和【C:\Python27\Scripts\】加到系统变量Path中
  • 安装pip:打开CMD,执行   easy_install pip
  • 安装Scrapy:打开CMD,执行 pip install Scrapy


新建工程:

  • 在CMD中输入: scrapy  startproject  gif     新建一个名为gif的工程文件夹
  • Python】Scrapy抓取多玩Gif图片
  • spiders:       存放自己写的 爬虫规则文件
  • items.py:      自定义获取数据的结构
  • pipelines.py:自定义处理获取到的item结构数据
  • settings.py:  设置和启动pipelines


Scrapy工作流程原理分析:


自定义获取数据的结构:(修改items.py文件)

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3.   
  4. import scrapy  
  5.   
  6. #自定义要获取的数据Item的结构  
  7. class GifItem(scrapy.Item):  
  8.     #自定义数据item的结构,这里的item只有gif_url一项  
  9.     #要获取更多的数据,可以增加item的项  
  10.     gif_url = scrapy.Field()  
  11.     pass  


编写自己爬虫文件:(在spiders里新建一个gif.py的文件)

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3. from scrapy.contrib.spiders import CrawlSpider, Rule  
  4. from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor  
  5. from gif.items import GifItem  
  6.   
  7.   
  8. class GifSpider(CrawlSpider):  
  9.   
  10.     #爬虫名字,唯一,用于区分以后新建的爬虫  
  11.     name = "gif"  
  12.   
  13.     #可选,定义爬取区域,超出区域的链接不爬取  
  14.     allowed_domains = ["duowan.com"]  
  15.       
  16.     #定义开始爬取的页面A  
  17.     start_urls=["http://tu.duowan.com/scroll/100103.html"]  
  18.       
  19.     #定义规则,在页面A中爬取符合规则的链接,并调用函数处理  
  20.     rules = [  
  21.         Rule(SgmlLinkExtractor(allow=('/scroll/\d*/\d*.html')),  callback = 'parse_gif', follow=True),  
  22.         Rule(SgmlLinkExtractor(allow=('/scroll/\d*.html')),  callback = 'parse_gif', follow=True),  
  23.         ]  
  24.   
  25.     def parse_gif(self, response):  
  26.         #定义获取数据的结构  
  27.         urlItem = GifItem()  
  28.           
  29.         #注意item是每个页面的数据集合,每个页面有一个item,搜集整理好交给Pipeline处理  
  30.         urlItem['gif_url'] = response.selector.xpath('//*[@id="picture-pageshow"]/div[1]/div[@class="pic-box"]/a/img/@src').extract()  
  31.         yield urlItem  

编写Pipeline.py处理获取到的item数据:

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3. import urllib  
  4. import urllib2  
  5. import time  
  6. import os    
  7. import shutil  
  8. from scrapy.exceptions import DropItem  
  9. import pymongo  
  10.   
  11. #Pineline用于处理获取到的item数据  
  12. class GifPipeline(object):  
  13.   
  14.     #启动爬虫时执行,新建一个名为gaoxiao_gif的文件  
  15.     #创建一个名为gif_url的mongo数据库, 并创建一个集合my_collection  
  16.     #创建一个名为gif_url的txt文件  
  17.     def __init__(self):  
  18.         conn = pymongo.Connection('localhost'27017)  
  19.         db = conn['gif_url']  
  20.         self.collection = db['gif_collection']  
  21.   
  22.         self.f = open('url_gif.txt''wb')  
  23.           
  24.         if os.path.exists('gaoxiao_gif'):    
  25.             shutil.rmtree("gaoxiao_gif")    
  26.         else:    
  27.             os.mkdir("gaoxiao_gif")  
  28.   
  29.   
  30.     #爬虫启动时调用,处理获取到的item数据,注意item是每一个页面的数据集合  
  31.     def process_item(self, item, spider):  
  32.         #去除没用的数据  
  33.         if item['gif_url']:  
  34.               
  35.             #遍历每个页面item集合里面的所有url  
  36.             #字符串判断,过滤所有.jpg和.png文件,只下载gif文件  
  37.             #将url插入mongo数据库  
  38.             #将url存放进txt,稍后可以用迅雷下载  
  39.             for i in item['gif_url']:  
  40.                 if ".gif" in i:  
  41.                     self.f.write(i)  
  42.                     self.f.write('\r\n')  
  43.   
  44.                     gif_url=[{"url":i}]  
  45.                     self.collection.insert(gif_url)  
  46.                   
  47.                     now = time.localtime(time.time())  
  48.                     fname = str(now)  
  49.                     urllib.urlretrieve(i, 'gaoxiao_gif/%s.gif' %fname)  
  50.         else:  
  51.             raise DropItem(item)  
  52.         return item  
  53.   
  54.   
  55.     #爬虫关闭时调用  
  56.     def close_spider(self, spider):  
  57.         print("Done")  


设置Setting.py文件启动Pipeline功能:

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2.   
  3. BOT_NAME = 'gif'  
  4.   
  5. SPIDER_MODULES = ['gif.spiders']  
  6. NEWSPIDER_MODULE = 'gif.spiders'  
  7.   
  8.   
  9. #启动对应的Pipeline,有多个Pipeline时,数字小的先执行  
  10. ITEM_PIPELINES={'gif.pipelines.GifPipeline'1}  


启动爬虫,下载gif

  • 打开CMD,CD到项目目录
  • 执行scrapy crawl  gif
Python】Scrapy抓取多玩Gif图片
文件准备
  • 安装python2.7.5
  • 安装pywin32
  • 安装py-setuptool
  • 要用到的文件打包下载:点击下载


安装Scrapy:

  • 配置环境变量:将【C:\Python27\】和【C:\Python27\Scripts\】加到系统变量Path中
  • 安装pip:打开CMD,执行   easy_install pip
  • 安装Scrapy:打开CMD,执行 pip install Scrapy


新建工程:

  • 在CMD中输入: scrapy  startproject  gif     新建一个名为gif的工程文件夹
  • Python】Scrapy抓取多玩Gif图片
  • spiders:       存放自己写的 爬虫规则文件
  • items.py:      自定义获取数据的结构
  • pipelines.py:自定义处理获取到的item结构数据
  • settings.py:  设置和启动pipelines


Scrapy工作流程原理分析:


自定义获取数据的结构:(修改items.py文件)

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3.   
  4. import scrapy  
  5.   
  6. #自定义要获取的数据Item的结构  
  7. class GifItem(scrapy.Item):  
  8.     #自定义数据item的结构,这里的item只有gif_url一项  
  9.     #要获取更多的数据,可以增加item的项  
  10.     gif_url = scrapy.Field()  
  11.     pass  


编写自己爬虫文件:(在spiders里新建一个gif.py的文件)

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3. from scrapy.contrib.spiders import CrawlSpider, Rule  
  4. from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor  
  5. from gif.items import GifItem  
  6.   
  7.   
  8. class GifSpider(CrawlSpider):  
  9.   
  10.     #爬虫名字,唯一,用于区分以后新建的爬虫  
  11.     name = "gif"  
  12.   
  13.     #可选,定义爬取区域,超出区域的链接不爬取  
  14.     allowed_domains = ["duowan.com"]  
  15.       
  16.     #定义开始爬取的页面A  
  17.     start_urls=["http://tu.duowan.com/scroll/100103.html"]  
  18.       
  19.     #定义规则,在页面A中爬取符合规则的链接,并调用函数处理  
  20.     rules = [  
  21.         Rule(SgmlLinkExtractor(allow=('/scroll/\d*/\d*.html')),  callback = 'parse_gif', follow=True),  
  22.         Rule(SgmlLinkExtractor(allow=('/scroll/\d*.html')),  callback = 'parse_gif', follow=True),  
  23.         ]  
  24.   
  25.     def parse_gif(self, response):  
  26.         #定义获取数据的结构  
  27.         urlItem = GifItem()  
  28.           
  29.         #注意item是每个页面的数据集合,每个页面有一个item,搜集整理好交给Pipeline处理  
  30.         urlItem['gif_url'] = response.selector.xpath('//*[@id="picture-pageshow"]/div[1]/div[@class="pic-box"]/a/img/@src').extract()  
  31.         yield urlItem  

编写Pipeline.py处理获取到的item数据:

[python] view plain copy
  1. #-*- coding: utf-8 -*-  
  2. #coding:UTF-8  
  3. import urllib  
  4. import urllib2  
  5. import time  
  6. import os    
  7. import shutil  
  8. from scrapy.exceptions import DropItem  
  9. import pymongo  
  10.   
  11. #Pineline用于处理获取到的item数据  
  12. class GifPipeline(object):  
  13.   
  14.     #启动爬虫时执行,新建一个名为gaoxiao_gif的文件  
  15.     #创建一个名为gif_url的mongo数据库, 并创建一个集合my_collection  
  16.     #创建一个名为gif_url的txt文件  
  17.     def __init__(self):  
  18.         conn = pymongo.Connection('localhost'27017)  
  19.         db = conn['gif_url']  
  20.         self.collection = db['gif_collection']  
  21.   
  22.         self.f = open('url_gif.txt''wb')  
  23.           
  24.         if os.path.exists('gaoxiao_gif'):    
  25.             shutil.rmtree("gaoxiao_gif")    
  26.         else:    
  27.             os.mkdir("gaoxiao_gif")  
  28.   
  29.   
  30.     #爬虫启动时调用,处理获取到的item数据,注意item是每一个页面的数据集合  
  31.     def process_item(self, item, spider):  
  32.         #去除没用的数据  
  33.         if item['gif_url']:  
  34.               
  35.             #遍历每个页面item集合里面的所有url  
  36.             #字符串判断,过滤所有.jpg和.png文件,只下载gif文件  
  37.             #将url插入mongo数据库  
  38.             #将url存放进txt,稍后可以用迅雷下载  
  39.             for i in item['gif_url']:  
  40.                 if ".gif" in i:  
  41.                     self.f.write(i)  
  42.                     self.f.write('\r\n')  
  43.   
  44.                     gif_url=[{"url":i}]  
  45.                     self.collection.insert(gif_url)  
  46.                   
  47.                     now = time.localtime(time.time())  
  48.                     fname = str(now)  
  49.                     urllib.urlretrieve(i, 'gaoxiao_gif/%s.gif' %fname)  
  50.         else:  
  51.             raise DropItem(item)  
  52.         return item  
  53.   
  54.   
  55.     #爬虫关闭时调用  
  56.     def close_spider(self, spider):  
  57.         print("Done")  


设置Setting.py文件启动Pipeline功能:

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2.   
  3. BOT_NAME = 'gif'  
  4.   
  5. SPIDER_MODULES = ['gif.spiders']  
  6. NEWSPIDER_MODULE = 'gif.spiders'  
  7.   
  8.   
  9. #启动对应的Pipeline,有多个Pipeline时,数字小的先执行  
  10. ITEM_PIPELINES={'gif.pipelines.GifPipeline'1}  


启动爬虫,下载gif

  • 打开CMD,CD到项目目录
  • 执行scrapy crawl  gif
Python】Scrapy抓取多玩Gif图片