Python3.x使用Scrapy将爬取数据存储成Json

豆瓣电影排名前250链接 https://movie.douban.com/top250

注:前提安装好python及所需的环境

1.scrapy安装

pip install scrapy

如果提示:no module named ‘win32api’ 则使用下面方式解决

pip install pypiwin32

pip install scrapy

2.创建项目(进入要创建的目录)

scrapy startproject [项目名称]
例如:scrapy startproject douban_scrapy

3.创建爬虫

scrapy genspider 项目名 "域名" 
例如:scrapy genspider douban_scrapy "douban.com"

4.使用工具打开刚刚创建的项目(我是用的是pycharm)

douban_spider.py可见就是编写爬虫的地方了

python 爬虫的json用法 scrapy爬取json网页数据_ide


5.打开settings.py简单的设置如下

ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 3

DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'
}

ITEM_PIPELINES = {
#存储数据需要将爬取的数据送到pipelines.py,300为优先级
   'douban_scrapy.pipelines.DoubanScrapyPipelineJson': 300,
}

6.item.py编写需要获取的字段名

import scrapy


class DoubanScrapyItem(scrapy.Item):

    title = scrapy.Field()
    daoyan = scrapy.Field()
    bianju = scrapy.Field()
    zhuyan = scrapy.Field()
    type = scrapy.Field()
    time = scrapy.Field()

7.进入douban_spider.py编写爬虫代码

首先将start_urls改成要爬取的url
如:start_urls = ['https://movie.douban.com/top250']
import scrapy
from douban_scrapy.items import DoubanScrapyItem

class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'
    allowed_domains = ['douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        urls = response.xpath('//ol[@class="grid_view"]/li//div[@class="pic"]/a/@href').getall()
        print(len(urls))
        for url in urls:
            yield scrapy.Request(
                url=url,
                callback=self.detail
            )
        next_urls = response.xpath('//span[@class="next"]/a/@href').get()
        next_url = "https://movie.douban.com/top250" + next_urls
        print("我是下一页",next_url,"="*1000)
        if next_url:
            yield scrapy.Request(
                url=next_url,
                callback=self.parse
            )

    def detail(self,response):
        item = DoubanScrapyItem()
        item["title"] = response.xpath('//div[@id="content"]/h1/span[1]/text()').get() #标题
        item["daoyan"] = response.xpath('//div[@id="info"]/span[1]/span[@class="attrs"]/a/text()').get() #导演
        item["bianju"] = "".join(response.xpath('//div[@id="info"]/span[2]/span[@class="attrs"]//a/text()').getall()) #导演
        item["zhuyan"] = "".join(response.xpath('//div[@id="info"]/span[3]/span[@class="attrs"]//text()').getall()) #导演
        item["type"] = "".join(response.xpath('//div[@id="info"]//span[@property="v:genre"]//text()').getall()) #类型
        item["time"] = response.xpath('//div[@id="info"]//span[@property="v:runtime"]/text()').get() #时长
        yield item

8.编写pipelines.py代码

import codecs
import json
import os

class DoubanScrapyPipelineJson(object):

    def __init__(self):
        self.df = codecs.open("douban.json","w",encoding="utf-8")
        self.df.write("[")


    def open_spider(self,spider):
        print("json存储开始")

    def process_item(self, item, spider):
        try:
            value = dict(item)
            json_str = json.dumps(value,ensure_ascii=False)
            self.df.write(json_str)
            self.df.write(",\n")
        except Exception as e:
            print("存储失败",e)
        return item

    def close_spider(self,spider):
        self.df.seek(-2,os.SEEK_END)
        self.df.truncate()
        self.df.write("]")
        self.df.close()

9.创建start.py文件

from scrapy import cmdline

cmdline.execute("scrapy crawl douban_spider".split())

10.右击运行"Run Start"执行爬虫

步骤9,10可省略,直接进入该项目,运行scrapy crawl也可执行

爬取部分结果:

[{“title”: “泰坦尼克号 Titanic”, “daoyan”: “詹姆斯·卡梅隆”, “bianju”: “詹姆斯·卡梅隆”,
 “zhuyan”: “莱昂纳多·迪卡普里奥 / 凯特·温丝莱特 / 比利·赞恩 / 凯西·贝茨 / 弗兰西丝·费舍 / 格劳瑞亚·斯图尔特
 / 比尔·帕克斯顿 / 伯纳德·希尔 / 大卫·沃纳 / 维克多·加博 / 乔纳森·海德 / 苏茜·爱米斯 / 刘易斯·阿伯内西 /
 尼古拉斯·卡斯柯恩 / 阿那托利·萨加洛维奇 / 丹尼·努齐 / 杰森·贝瑞 / 伊万·斯图尔特 / 艾恩·格拉法德 / 乔纳森·菲利普斯
 / 马克·林赛·查普曼 / 理查德·格拉翰 / 保罗·布赖特威尔 / 艾瑞克·布里登 / 夏洛特·查顿 / 博纳德·福克斯 /
 迈克尔·英塞恩 / 法妮·布雷特 / 马丁·贾维斯 / 罗莎琳·艾尔斯 / 罗切尔·罗斯 / 乔纳森·伊万斯-琼斯 / 西蒙·克雷恩 /
 爱德华德·弗莱彻 / 斯科特·安德森 / 马丁·伊斯特 / 克雷格·凯利 / 格雷戈里·库克 / 利亚姆·图伊 / 詹姆斯·兰开斯特 /
 艾尔莎·瑞雯 / 卢·帕尔特 / 泰瑞·佛瑞斯塔 / 凯文·德·拉·诺伊”, “type”: “剧情爱情灾难”, “time”:
 “194分钟”}]