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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM