彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 新闻动态 > 初识scrapy,美空网图片爬取实战,

初识scrapy,美空网图片爬取实战,

发布时间:2019-08-31 20:47编辑:新闻动态浏览(148)

    初识scrapy,美空网图片爬取实战,

          这俩天研究了下scrapy爬虫框架,遂准备写个爬虫练练手。平时做的较多的事情是浏览图片,对,没错,就是那种艺术照,我骄傲的认为,多看美照一定能提高审美,并且成为一个优雅的程序员。O(∩_∩)O~ 开个玩笑,那么废话不多说,切入正题吧,写一个图片爬虫。       设计思路:爬取目标为美空网模特照片,利用CrawlSpider提取每张照片的url地址,并将提取的图片url写入一个静态html文本作为存储,打开即可查看图片。 我的环境是win8.1, python2.7+Scrapy 0.24.4,如何配环境我就不说了,大家自行百度一下。        参照官方文档,我总结了建立爬虫程序大致有四个步骤:

    • 创建一个scrapy project
    • 定义需要从网页中提取的元素item
    • 实现一个spider类,通过接口完成爬取url和提取item的功能
    • 实现一个item pipeline类,完成Item的存储功能。

            接下来就很简单了,参照着步骤一步步做就好,首先在终端里面建立一个项目,项目名咱就命名为moko吧。输入指令scrapy startproject moko, scrapy会在当前目录创建一个moko的文件目录,里面有一些初使的文件,文件用处大伙感兴趣查下文档,我主要介绍我们这次用到的文件。

    定义Item  在items.py里面定义我们要抓取的数据:

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # http://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class MokoItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        url = scrapy.Field()
    

     

    • 这里的url用来存储最后结果的dict号,稍后会继续解释,名字是随意命名的。比如说我还需要爬图片作者的名字,那么我们就可以添加一项name = scrapy.Field(),依次类推。
    • 接下来我们进入spiders文件夹,里面建立一个python文件,名字咱这里就取mokospider.py,添加核心代码实现Spider:
    • Spider是一个继承自scrapy.contrib.spiders.CrawlSpider的Python类,有三个必需的定义的成员

      name: 名字,这个spider的标识,必须是唯一的,不同的爬虫定义不同的名字

      start_urls:一个url列表,spider从这些网页开始抓取

      parse():解析的方法,调用的时候传入从每一个URL传回的Response对象作为唯一参数,负责解析并匹配抓取的数据(解析为item),跟踪更多的URL。

    # -*- coding: utf-8 -*-
    #File name :spyders/mokospider.py
    #Author:Jhonny Zhang
    #mail:[email protected]
    #create Time : 2014-11-29
    #############################################################################
    
    from scrapy.contrib.spiders import CrawlSpider,Rule
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from moko.items import MokoItem
    import re
    from scrapy.http import Request
    from scrapy.selector import Selector
    
    
    class MokoSpider(CrawlSpider):
        name = "moko"
        allowed_domains = ["moko.cc"]
        start_urls=["http://www.moko.cc/post/aaronsky/list.html"]
        rules = (Rule(SgmlLinkExtractor(allow=('/post/d*.html')),  callback = 'parse_img', follow=True),)
        def parse_img(self, response):
            urlItem = MokoItem()
            sel = Selector(response)
            for divs in sel.xpath('//div[@class="pic dBd"]'):
                img_url=divs.xpath('.//img/@src2').extract()[0]
                urlItem['url'] = img_url
                yield urlItem
    

     

                咱们的项目命名为moko, 爬虫允许的领域allowed_domains限制在moko.cc,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页。爬虫起始地址从       目标 ,每个图片的链接都有规律可循,比如说随意点一个打开就是 = (Rule(SgmlLinkExtractor(allow=('/post/d*.html')),  callback = 'parse_img', follow=True),)  指当前网页,所有符合/post/d*.html后缀的网页都进行爬取,调用parse_img处理。       接下来定义解析函数parse_img,这地方比较关键,他传入的参数是爬虫打开url后返回的response对象,response对象里面内容说白了就是很大一些字符串,咱们就是利用爬虫将我们需要的内容过滤出来。如何过滤呢???哈哈,有个牛逼的Selector方法,利用他的xpath()路径表达公式来解析内容,解析前需要具体分析下web页面,我们这里利用的工具就是firebug。截取的web核心代码就是图片 1   我们需要的是src2部分!他在<div class="pic dBd">标签下的<img>里面, 首先实例一个在Items.py里面定义的MokoItem()的对象urlItem,用牛逼的Selector传入response,我这里用了一个循环,每次处理一个url,利用xpath路径表达式解析取出url,至于xpath如何用,自行百度下。结果存储到urlItem里面,这里用到了我们Items.py里面定义的url了!       然后定义一下pipelines,这部分管我们的内容存储。

    from moko.items import MokoItem
    
    class MokoPipeline(object):
        def __init__(self):
            self.mfile = open('test.html', 'w')
        def process_item(self, item, spider):
            text = '<img src="' + item['url'] + '" alt = "" />'
            self.mfile.writelines(text)
        def close_spider(self, spider):
            self.mfile.close()
    

     

         建立一个test.html文件用来存储结果。注意我的process_item里用到了一些html规则,作用是直接在html里面显示图片。结尾在定义一个关闭文件的方法,在爬虫结束时候调用。      最后定义设置一下settings.py

    BOT_NAME = 'moko'
    
    SPIDER_MODULES = ['moko.spiders']
    NEWSPIDER_MODULE = 'moko.spiders'
    
    # Crawl responsibly by identifying yourself (and your website) on the user-agent
    #USER_AGENT = 'moko (+http://www.yourdomain.com)'
    
    ITEM_PIPELINES={'moko.pipelines.MokoPipeline': 1,}     
    

     

            最后展示一下效果图吧,祝各位玩的快乐 ^_^ 图片 2                

    这俩天研究了下scrapy爬虫框架,遂准备写个爬虫练练手。平时做的较多的事情是浏览图片,对,没错,就...

    一、为什么要用异步?

    许多之前没有听说过异步地朋友可能看到标题地第一反应就是:什么是异步?为什么要用异步?

    我们先来讲讲为什么要用异步,对于爬虫来说,在能够爬取到数据地前提下当然是越快越好,显然传统地同步代码不能满足我们对速度地需求。

    这时候我们想到了多线程,虽然多线程能够提高速度,但是单论效率来说多线程是不如同步代码的,因为还要花费资源来管理线程

    而且多线程还有资源竞争的问题,这就不得不使用资源锁来保证同一时间只有一个线程访问,而这使得多线程的速度更加慢,这也是为什么在上一篇我们使用十个线程却只达到 9倍速度的原因。

    而异步却没有这些问题,异步虽然被称作异步,但本质上异步代码都是同步的,它们都运行在一个线程里,这样就不需要考虑线程管理和资源竞争的问题了。

    并且异步的速度非常快,为什么是非常快而不是很快?因为异步真的太快了。

    不说废话,我们拿数据说事:

    正常情况下我们请求一个页面大概是 0.3到 0.8秒左右

    也就是说如果我们请求同一个页面 100次的话,最少也得花费 30秒

    如果换成异步呢?

    使用异步如果只请求一个页面的话,和同步差不多,也是在 0.3到 0.8之间

    但是如果请求同一个页面 100次的话,只需要要 3秒左右

    国外有人做过测试:

    请求次数 花费时间
    100 3.48s
    1000 7s
    10k 23s
    100k 53s
    1000k 9 min 3s

    (数据来源:Making 1 million requests with python-aiohttp)

    从表中的数据可以看出来异步的最大速度可以达到 100k每分钟,可以说是非常快了。

    在我的的测试中,最快达到了 2k每分钟,与上面的数据相差较大(难道是我的打开方式不对?)。

    不过不管怎样,我们能够确定异步很快。

    对于一些异步的基本概念不了解的朋友可以去看这篇文章: 深入理解 Python 异步编程

    下面我们以一个简单的例子来了解一下异步的使用

    本文由彩世界平台发布于新闻动态,转载请注明出处:初识scrapy,美空网图片爬取实战,

    关键词: