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可见就是编写爬虫的地方了
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分钟”}]