Scrapy入門案例——爬取豆瓣電影

請謹記如下三條命令:

scrapy startproject xxx    創建scrapy項目
scrapy genspider xxx "xxx.com"  創建爬蟲spider,名字不能和項目名一樣
scrapy crawl xxx  運行某個爬蟲項目

首先scrapy startproject douban 建立項目,其次切換到spiders目錄下,scrapy genspider douban_movie 建立爬蟲。

我們要爬取的數據很簡單,是豆瓣電影排行榜。之所以說它簡單是因爲它請求返回的數據我們可以轉換成規整的json列表,並且獲取分頁鏈接也很簡單。



我們只獲得title和url的信息。明確了請求目標後,我們開始編寫items

import scrapy

class DoubanItem(scrapy.Item):
    title = scrapy.Field()
    url = scrapy.Field()

其次編輯spiders下的爬蟲文件

# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem
import json


class DoubanMovieSpider(scrapy.Spider):
    name = 'douban_movie'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20']
    offset = 0
    def parse(self, response):
        item = DoubanItem()
        content_list = json.loads(response.body.decode())
        if (content_list == []):
            return
        for content in content_list:
            item['title'] = content['title']
            item['url'] = content['url']
            yield item
        self.offset += 20
        url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start='+str(self.offset) + '&limit=20'
        yield scrapy.Request(url=url,callback=self.parse)

response.body 獲得數據是<class 'bytes'>型,我們需要轉換爲str型,response.body.decode()。然後通過json.loads()將字符串裝換成json 列表,列表裏的元素其實就是dict型。

然後保存數據,編輯pipelines.py

import json

class DoubanPipeline(object):
    def open_spider(self,spider):
        self.file = open("douban.json","w")
        self.num = 0
    def process_item(self, item, spider):
        self.num+=1
        content = json.dumps(dict(item),ensure_ascii=False)+'\n'
        self.file.write(content)
        return item
    def close_spider(self,spider):
        print('一共保存了'+str(self.num)+'條數據')
        self.file.close()

在運行前需要設置settings.py


#打開這兩個註釋:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.15 Safari/537.36'  #模擬瀏覽器

ITEM_PIPELINES = {
   'douban.pipelines.DoubanPipeline': 300,
}   #編輯好管道要記得註冊管道

#ROBOTSTXT_OBEY = True  註釋掉robot協議,不然會報錯

項目源碼:
https://gitee.com/stefanpy/Scrapy_projects/tree/dev/douban

推薦Scrapy學習網站:http://www.scrapyd.cn/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章