zoukankan      html  css  js  c++  java
  • Scrapy教程--豆瓣电影图片爬取

    一、先上效果

      

    二、安装Scrapy和使用

      官方网址:https://scrapy.org/。

      安装命令:pip install Scrapy

      安装完成,使用默认模板新建一个项目,命令:scrapy startproject xx

      

      上图很形象的说明了,scrapy的运行机制。具体各部分的含义和作用,可自行百度,这里不再赘述。我们一般,需要做的是以下步骤。

      1)配置settings,其他配置可根据自己的要求查看文档配置。

    DEFAULT_REQUEST_HEADERS = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.10 Safari/537.36'
    }
    DOWNLOAD_TIMEOUT = 30
    IMAGES_STORE = 'Images'

      2)定义items类,相当于Model类。如:

    class CnblogImageItem(scrapy.Item):
        image = scrapy.Field()
        imagePath = scrapy.Field()
        name = scrapy.Field()

      3)配置下载中间件,下载中间件的作用是自定义,怎么发请求。一般有处理代理的中间件、PhantomJs的中间件等。这里,我们只用到代理中间件。

    class GaoxiaoSpiderMiddleware(object):
    
        def process_request(self, request, spider):
            if len(request.flags) > 0 and request.flags[0] == 'img':
                return None
            driver = webdriver.PhantomJS()
            # 设置全屏
            driver.maximize_window()
            driver.get(request.url)
            content = driver.page_source
            driver.quit()
            return HtmlResponse(request.url, encoding='utf-8', body=content)
    
    
    class ProxyMiddleWare(object):
    
        def process_request(self, request, spider):
            request.meta['proxy'] = 'http://175.155.24.103:808'

      4)编写pipeline,作用是处理从Spider中传过来的item,保存excel、数据库、下载图片等。这里给出我的下载图片代码,使用的是官方的下载图片框架。

    class CnblogImagesPipeline(ImagesPipeline):
        IMAGES_STORE = get_project_settings().get("IMAGES_STORE")
    
        def get_media_requests(self, item, info):
            image_url = item['image']
            if image_url != '':
                yield scrapy.Request(str(image_url), flags=['img'])
    
        def item_completed(self, result, item, info):
            image_path = [x["path"] for ok, x in result if ok]
    
            if image_path:
                # 重命名
                if item['name'] != None and item['name'] != '':
                    ext = os.path.splitext(image_path[0])[1]
                    os.rename(self.IMAGES_STORE + '/' +
                              image_path[0], self.IMAGES_STORE + '/' + item['name'] + ext)
                item["imagePath"] = image_path
            else:
                item['imagePath'] = ''
            return item

      5)编写自己的Spider类,Spider的作用是配置一些信息、起始url请求、处理响应数据。这里的下载中间件配置、pipeline,可以放在settings文件中。这里我放在,各自的Spider中,因为项目中包含多个Spider,相互之间用的下载中间件不同,因此分开配置了。

    # coding=utf-8
    import sys
    import scrapy
    import gaoxiao.items
    import json
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    class doubanSpider(scrapy.Spider):
        name = 'douban'
        allowed_domains = ['movie.douban.com']
        baseUrl = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start='
        start = 0
        start_urls = [baseUrl + str(start)]
        custom_settings = {
            'DOWNLOADER_MIDDLEWARES': {
                'gaoxiao.middlewares.ProxyMiddleWare': 1,
                #             'gaoxiao.middlewares.GaoxiaoSpiderMiddleware': 544
            },
            'ITEM_PIPELINES': {
                'gaoxiao.pipelines.CnblogImagesPipeline': 1,
            }
        }
    
        def parse(self, response):
            data = json.loads(response.text)['subjects']
            for i in data:
                item = gaoxiao.items.CnblogImageItem()
                if i['cover'] != '':
                    item['image'] = i['cover']
                    item['name'] = i['title']
                else:
                    item['image'] = ''
                yield item
            if self.start < 400:
                self.start += 20
                yield scrapy.Request(self.baseUrl + str(self.start), callback=self.parse)
  • 相关阅读:
    一起谈.NET技术,SharePoint开发笔记SharePoint2010添加ASP.NET应用程序 狼人:
    一起谈.NET技术,系统架构技能之设计模式—代理模式 狼人:
    一起谈.NET技术,.NET中的异步编程(一)为什么需要异步 狼人:
    一起谈.NET技术,Microsoft NLayerApp案例理论与实践 项目简介与环境搭建 狼人:
    一起谈.NET技术,构建高性能ASP.NET站点之减少不必要的请求 狼人:
    一起谈.NET技术,分享在MVC3.0中使用jQuery DataTable 插件 狼人:
    一起谈.NET技术,ASP.NET 4的Demo实践:URL路由改进支持 狼人:
    一起谈.NET技术,构建高性能ASP.NET站点之优化HTTP请求 狼人:
    一起谈.NET技术,Silverlight 游戏开发小技巧:传说中的透视跑马灯 狼人:
    paip.Winista HTMLParser文本结点的获取
  • 原文地址:https://www.cnblogs.com/zhaoyihao/p/6952111.html
Copyright © 2011-2022 走看看