您的位置:首页 > 数据库 > Mongodb

使用scrapy+mongodb对豆瓣250抓取存储和分析

2020-03-05 09:15 976 查看

1、安装好scrapy+mongodb+pymongo

2、阅读scrapy官方文档以及mongodb的基本操作

3、建立scrapy工程

     scrapy startproject doubanmovie

4、主要编辑项目doubanmovie的四个文件items.py,pipelines.py,settings.py,spiders文件夹下的自己创建的movie_spider.py

其中items.py编辑内容如下

import scrapy

class DoubanmovieItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#pass
name=scrapy.Field()#电影名
year=scrapy.Field()#上映年份
score=scrapy.Field()#豆瓣分数
director=scrapy.Field()#导演
classification=scrapy.Field()#分类
actor=scrapy.Field()#演员
这个类下的数据成员就是要获得的内容,而这个类是继承scrapy.item的


其中movie_spider.py是核心内容,内容如下

from scrapy.selector import Selector #有另一种简单方法,具体看官方文档
from scrapy.contrib.spiders import CrawlSpider,Rule#必须
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from doubanmovie.items import DoubanmovieItem

class MovieSpider(CrawlSpider):
name="doubanmovie"  #在命令行抓取使用的是这个名字
allowed_domains=["movie.douban.com"]
start_urls=["http://movie.douban.com/top250"]
rules=[  #ruless是一系列Rule对象实例的集合
Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/top250\?start=\d+.*'))),#这个东西可以不加
Rule(SgmlLinkExtractor(allow=(r'http://movie.douban.com/subject/\d+')),callback="parse_item"),
]

def parse_item(self,response):
sel=Selector(response)
item=DoubanmovieItem() #doubanmovieitem类的实例
item['name']=sel.xpath('//*[@id="content"]/h1/span[1]/text()').extract()    #使用chrome的审察元素copy xpath功能
item['year']=sel.xpath('//*[@id="content"]/h1/span[2]/text()').re(r'\((\d+)\)')
item['score']=sel.xpath('//*[@id="interest_sectl"]/div/p[1]/strong/text()').extract()
item['director']=sel.xpath('//*[@id="info"]/span[1]/span[2]/a/text()').extract()
item['classification']= sel.xpath('//span[@property="v:genre"]/text()').extract()
item['actor']= sel.xpath('//*[@id="info"]/span[3]/span[2]/a[1]/text()').extract()
return item
基本原理是MovieSpider继承crawlspider类,而name,allowed,start_urls,rules为父类的属性,相当于C++的静态数据成员,所以可以在类内赋值,父类的一个方法通过start_urls和rules创建request对象分析页面,request对象会返回response作为传值参数传给callback函数parse_item,而callback函数要么要返回item要么要返回request对象

而在callback函数里是使用选择器的xpath来提取内容,实际就是每个页面都有一部电影的介绍,如name,year,score,director等,分析后爬下来就好了。


其中pipeline.py主要是负责把item的内容存进mongodb,内容如下


import pymongo

from scrapy.exceptions import DropItem #异常类
from scrapy.conf import settings #关于mongodb_server,mongodb_port,mongo使用的数据库,集合设定的使用,所以要导入,但是不知为什么是从scrapy.conf导入
from scrapy import log

class MongoDBPipeline(object):
#Connect to the MongoDB database
def __init__(self):#初始化对象,会链接数据库,并创建数据库和相应的集合
connection = pymongo.MongoClient(settings['MONGODB_SERVER'], settings['MONGODB_PORT']) #模块或者类取数据成员是这样的吗?
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_COLLECTION']]

def process_item(self, item, spider):  #对item进行处理
#Remove invalid data
valid = True
for data in item:
if not data:
valid = False
raise DropItem("Missing %s of blogpost from %s" %(data, item['url'])) #异常处理
if valid:
#Insert data into database
new_moive=[{    #这是python的列表典型使用吗
"name":item['name'][0],#不加0似乎可以?
"year":item['year'][0],
"score":item['score'][0],
"director":item['director'],
"classification":item['classification'],
"actor":item['actor']
}]
self.collection.insert(new_moive) #mongodb的插入操作
log.msg("Item wrote to MongoDB database %s/%s" %        #log记录
(settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
level=log.DEBUG, spider=spider)
return item


接下来是settings.py,主要设置cookie mongodb的设定 ,download_delay啊等等

BOT_NAME = 'doubanmovie'

SPIDER_MODULES = ['doubanmovie.spiders']
NEWSPIDER_MODULE = 'doubanmovie.spiders'

ITEM_PIPELINES={
'doubanmovie.pipelines.MongoDBPipeline':300
}
LOG_LEVEL='DEBUG'

DOWNLOAD_DELAY = 2
RANDOMIZE_DOWNLOAD_DELAY = True
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'  #有疑问
COOKIES_ENABLED = True
MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'python'
MONGODB_COLLECTION = 'test'


5、在命令行运行scrapy crawl doubanmovie

6、启动mongo,在命令行运行mongo,使用use python 连接名为python的数据库

     键入db.test.find()可以获得所有抓去的内容

     




  • 点赞
  • 收藏
  • 分享
  • 文章举报
mymzt 发布了2 篇原创文章 · 获赞 0 · 访问量 1163 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: