使用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()可以获得所有抓去的内容
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 使用scrapy+mongodb对豆瓣250抓取存储和分析
- 使用scrapy+mongodb爬取豆瓣电影TOP250
- 使用pyquery爬取豆瓣电影top250,存储在mongodb
- Scrapy+mongoDB爬取豆瓣TOP250
- Scrapy入门实例(使用Scrapy抓取豆瓣电影top250榜单)
- [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据
- Scrapy 爬虫实例 抓取豆瓣小组信息并保存到mongodb中 推荐
- 利用scrapy抓取网易新闻并将其存储在mongoDB
- 使用scrapy、selenium、phantojs抓取豆瓣热门电影的spider
- 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
- 利用scrapy抓取网易新闻并将其存储在mongoDB
- 利用beautifulsoup爬取豆瓣电影top250,存储在mongodb
- 使用selenium爬取拉勾网数据分析职位信息并存储到MongoDB
- 实践Python的爬虫框架Scrapy来抓取豆瓣电影TOP250
- scrapy使用mongodb作为存储(数据库)
- 使用php方法curl抓取AJAX异步内容思路分析及代码分享
- Android 数据存储和文件使用案例分析
- 如何实现日志的集中化存储以及使用loganalyzer做日志分析 推荐
- 使用scrapy,redis, mongodb实现的一个分布式网络爬虫
- 使用Node.js + MongoDB实现一个简单的日志分析系统