文件准备:
- 安装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的工程文件夹
- spiders: 存放自己写的 爬虫规则文件
- items.py: 自定义获取数据的结构
- pipelines.py:自定义处理获取到的item结构数据
- settings.py: 设置和启动pipelines
Scrapy工作流程原理分析:
自定义获取数据的结构:(修改items.py文件)
#-*- coding: utf-8 -*-
#coding:UTF-8
import scrapy
#自定义要获取的数据Item的结构
class GifItem(scrapy.Item):
#自定义数据item的结构,这里的item只有gif_url一项
#要获取更多的数据,可以增加item的项
gif_url = scrapy.Field()
pass
编写自己爬虫文件:(在spiders里新建一个gif.py的文件)
#-*- coding: utf-8 -*-
#coding:UTF-8
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from gif.items import GifItem
class GifSpider(CrawlSpider):
#爬虫名字,唯一,用于区分以后新建的爬虫
name = "gif"
#可选,定义爬取区域,超出区域的链接不爬取
allowed_domains = ["duowan.com"]
#定义开始爬取的页面A
start_urls=["http://tu.duowan.com/scroll/100103.html"]
#定义规则,在页面A中爬取符合规则的链接,并调用函数处理
rules = [
Rule(SgmlLinkExtractor(allow=('/scroll/\d*/\d*.html')), callback = 'parse_gif', follow=True),
Rule(SgmlLinkExtractor(allow=('/scroll/\d*.html')), callback = 'parse_gif', follow=True),
]
def parse_gif(self, response):
#定义获取数据的结构
urlItem = GifItem()
#注意item是每个页面的数据集合,每个页面有一个item,搜集整理好交给Pipeline处理
urlItem['gif_url'] = response.selector.xpath('//*[@id="picture-pageshow"]/div[1]/div[@class="pic-box"]/a/img/@src').extract()
yield urlItem
编写Pipeline.py处理获取到的item数据:
#-*- coding: utf-8 -*-
#coding:UTF-8
import urllib
import urllib2
import time
import os
import shutil
from scrapy.exceptions import DropItem
import pymongo
#Pineline用于处理获取到的item数据
class GifPipeline(object):
#启动爬虫时执行,新建一个名为gaoxiao_gif的文件
#创建一个名为gif_url的mongo数据库, 并创建一个集合my_collection
#创建一个名为gif_url的txt文件
def __init__(self):
conn = pymongo.Connection('localhost', 27017)
db = conn['gif_url']
self.collection = db['gif_collection']
self.f = open('url_gif.txt', 'wb')
if os.path.exists('gaoxiao_gif'):
shutil.rmtree("gaoxiao_gif")
else:
os.mkdir("gaoxiao_gif")
#爬虫启动时调用,处理获取到的item数据,注意item是每一个页面的数据集合
def process_item(self, item, spider):
#去除没用的数据
if item['gif_url']:
#遍历每个页面item集合里面的所有url
#字符串判断,过滤所有.jpg和.png文件,只下载gif文件
#将url插入mongo数据库
#将url存放进txt,稍后可以用迅雷下载
for i in item['gif_url']:
if ".gif" in i:
self.f.write(i)
self.f.write('\r\n')
gif_url=[{"url":i}]
self.collection.insert(gif_url)
now = time.localtime(time.time())
fname = str(now)
urllib.urlretrieve(i, 'gaoxiao_gif/%s.gif' %fname)
else:
raise DropItem(item)
return item
#爬虫关闭时调用
def close_spider(self, spider):
print("Done")
设置Setting.py文件启动Pipeline功能:
# -*- coding: utf-8 -*-
BOT_NAME = 'gif'
SPIDER_MODULES = ['gif.spiders']
NEWSPIDER_MODULE = 'gif.spiders'
#启动对应的Pipeline,有多个Pipeline时,数字小的先执行
ITEM_PIPELINES={'gif.pipelines.GifPipeline': 1}
启动爬虫,下载gif
- 打开CMD,CD到项目目录
- 执行scrapy crawl gif