Scrapy教程--豆瓣电影图片爬取

栏目: 编程工具 · 发布时间: 8年前

内容简介:Scrapy教程--豆瓣电影图片爬取

一、先上效果

Scrapy教程--豆瓣电影图片爬取

二、安装Scrapy和使用

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

安装命令: pip install Scrapy

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

Scrapy教程--豆瓣电影图片爬取

上图很形象的说明了,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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Automate This

Automate This

Christopher Steiner / Portfolio / 2013-8-9 / USD 25.95

"The rousing story of the last gasp of human agency and how today's best and brightest minds are endeavoring to put an end to it." It used to be that to diagnose an illness, interpret legal docume......一起来看看 《Automate This》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换