无聊想看电影,今天上豆瓣看了一下,顺便爬了点豆瓣电影top250的榜单,并将数据存储到了mongodb中。
用到了scrapy + windows + mongodb
难点基本没有,也没遇到坑,就是存到mongodb数据库的时候有几步忘了,查了一下,看来要多用数据库才行。
废话不多说,直接贴代码。
平时遇到的坑昨天那篇博客已经说了,今天特别注意,有时候问题虽小,但是报错也很烦恼 = =…
爬虫代码
doubanmovies.py
# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem
class DoubanmoviesSpider(scrapy.Spider):
name = 'doubanmovies'
allowed_domains = ['movie.douban.com']
offset = 0
url = 'https://movie.douban.com/top250?start='
start_urls = [url + str(offset)]
def parse(self, response):
# 观察网页结构,可以以info为根节点,(其他根节点也可以,如上一个根节点class='item'),这样做是为了可以构造循环,实现迭代
for each in response.xpath('//div[@class ="info"]'):
item = DoubanItem()
#老方法,以上面的规则为根节点,xpath走起
item['title'] = each.xpath(
'.//span[1][@class="title"]/text()').extract_first()
item['bd'] = each.xpath('.//div[@class="bd"]/p/text()').extract_first()
item['star'] = each.xpath(
#如果有多个span标签并列,取序号大于1的所有span标签内容。序号是从1开始递增,索引是从0开始递增
'.//div[@class="star"]/span[position()>1]/text()').extract_first()
item['quote'] = each.xpath(
'.//p[@class ="quote"]/span/text()').extract_first()
yield item
if self.offset < 225:
# 每次自增量由网页结构决定
self.offset += 25
yield scrapy.Request(self.url + str(self.offset), callback=self.parse)
import scrapy
class DoubanItem(scrapy.Item):
# define the fields for your item here like:
#标题
title = scrapy.Field()
#电影主演等信息
bd = scrapy.Field()
#评分
star = scrapy.Field()
#短评
quote = scrapy.Field()
pipeline.py文件里用到了mongodb数据库的连接方式,同时也需要在settings.py中设置
pipelines.py
import pymongo
#导入scrapy中所有settings.py中的设置,固定方法
from scrapy.conf import settings
class DoubanPipeline(object):
def __init__(self):
#以下也算是固定用法,多用熟练即可,没有难度
# 数据库连接地址
host = settings['MONGODB_HOST']
# 数据库连接端口号
port = settings['MONGODB_PORT']
# 数据库连接名字
dbname = settings['MONGODB_DBNAME']
# 数据库表名字
sheetname = settings['MONGODB_SHEETNAME']
# 创建mongodb的数据库连接
client = pymongo.MongoClient(host=host, port=port)
# 指定数据库
mydb = client[dbname]
# 把数据插入到指定的表里面
self.post = mydb[sheetname]
def process_item(self, item, spider):
#返回的item数据是一种类似于字典类型的数据,强转为字典类型
data = dict(item)
# 插入到数据库
self.post.insert(data)
return item
在settings.py中插入这几行代码即可连接mongodb数据库
# MONGO主机名
MONGODB_HOST = '127.0.0.1'
# MONGO端口号
MONGODB_PORT = 27017
# 数据库名称
MONGODB_DBNAME = 'Douban'
# 存放数据的表名称,这里设置后,插入的时候会自动创建
MONGODB_SHEETNAME = 'doubanmovies'
如果数据要保存到本地,可用:
scrapy crawl doubanmovies -o douban.csv
或者
scrapy crawl doubanmovies -o douban.json
即可保存到本地
爬取完成,250条:
爬取的内容:
存在mongodb数据库中:
看了爬取的内容,发现有很多换行符’\n’和空行,存入数据库之前,可以用字符串的方法str.replace()处理掉,就不一一赘述了。