使用scrapy爬取豆瓣电影Top250

第一步:安装scrapy详情
第二步:安装mongo
第三步:使用scrapy,爬去目标数据

a. 新建项目

  1. 在自己想要存放的位置(文件夹),使用下面命令创建项目,项目名称自己随意。
scrapy startproject douban

// 为了更好的区分多个版本python
python2 -m scrapy startproject xxx
python3 -m scrapy startproject xxx
创建项目
  1. 使用pycharm打开刚才创建的douban项目,修改setting.py文件中的
ROBOTSTXT_OBEY = False
  1. 创建爬虫项目,使用下面的命令,或者直接创建文件
scrapy genspider douban_spider  movie.douban.com
创建爬虫文件
  1. 安装xpath(chrom浏览器插件)
    xpath helper

b. 明确目标

  1. 目标内容为豆瓣Top250电影数据信息

c. 制作爬虫

  1. 完善保存爬去数据模型对象(修改items.py文件)
    照着注释写
  2. 完善爬虫文件(修改douban_spider.py文件)
    douban_spider
  3. 运行爬虫文件,使用命令
scrapy crawl douban_spider

spiders文件夹下面新建python文件,命名为main.py

from scrapy import cmdline
cmdline.execute('scrapy crawl douban_spider'.split())
# 运行main.py文件
  1. 此时会报错 HTTP403,修改items.py文件,打开USER
# 修改前
USER_AGENT = 'douban (+http://www.yourdomain.com)'

# 修改后
USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'

  1. 可以得到粗略的目标数据,然后进行数据解析

d. 存储内容

  1. 打开网页,右键点击检查
  2. 使用xpath插件(点击 Ctrl + Shift + X 激活 XPath Helper 的控制台)
  3. 左键选中想要获取的数据,点击一下Shift,xpath中就会出现相应的xpath路径
  4. 编写爬虫代码,回去网页数据
  5. 创建douban_item模型,保存数据,爬虫代码如下
# -*- coding: utf-8 -*-
import scrapy
from douban.items import DoubanItem

class DoubanSpiderSpider(scrapy.Spider):
    # 这是爬虫名
    name = 'douban_spider'
    # 允许的域名
    allowed_domains = ['movie.douban.com']
    # 入口url,扔到调度器里面去
    start_urls = ['https://movie.douban.com/top250']
    # 默认解析方法
    def parse(self, response):
        # 定义变量保存电影数据列表
        movie_list = response.xpath("//div[@class='article']//ol[@class='grid_view']/li")
        # 循环每一页电影条目
        for i_item in movie_list:
            # item文件导入
            douban_item = DoubanItem()
            # 写详细的xpath,进行数据的解析
            douban_item['serial_number'] = i_item.xpath(".//div[@class='item']//em/text()").extract_first()
            douban_item['movie_name'] = i_item.xpath(".//div[@class='info']/div[@class='hd']/a/span[1]/text()").extract_first()
            content = i_item.xpath(".//div[@class='info']//div[@class='bd']/p[1]/text()").extract()
            # 数据的处理
            for i_content in content:
                content_s = "".join(i_content.split())
                douban_item['introduce'] = content_s
            douban_item['star'] = i_item.xpath(".//span[@class='rating_num']/text()").extract_first()
            douban_item['evaluate'] = i_item.xpath(".//div[@class='star']//span[4]/text()").extract_first()
            douban_item['describe'] = i_item.xpath(".//p[@class='quote']/span/text()").extract_first()
            # 需要将数据yield到pipelines里面,然后进行数据的存储
            yield douban_item
        # 解析下一页规则,取后一页的xpath
        next_link = response.xpath("//span[@class='next']/link/@href").extract()
        if next_link:
            next_link = next_link[0]
            yield scrapy.Request('https://movie.douban.com/top250' + next_link,callback=self.parse)

  1. 将文件写入json或者cvs文件中,执行命令
# 将数据写入json文件
scrapy crawl douban_spider -o test.json
# 将数据写入cvs文件,注意写入后,文件的编码
scrapy crawl douban_spider -o test.cvs

e. 将数据存入mongoDB中

  1. settings文件中定义mongo的基本配置
mongo_host = "127.0.0.1"
mongo_port = 27017
mongo_db_name = "douban"
mongo_db_collection = "douban_movie"
  1. pipelines.py文件中写入数据库相关的代码
    2.1 导入mongo相关的包pymongo
    2.2 从settings文件中导入mongo相关的配置
    2.3 添加初始化方法__init__
    2.4 初始化mongo,创建数据库client,创建数据库,集合
    2.5 插入数据
    2.6 代码如下
import pymongo
from douban.settings import mongo_host,mongo_port,mongo_db_name,mongo_db_collection

class DoubanPipeline(object):
    def __init__(self):
        host = mongo_host
        port = mongo_port
        dbname = mongo_db_name
        sheetname = mongo_db_collection
        client = pymongo.MongoClient(host=host,port=port)
        mydb = client[dbname]
        self.post = mydb[sheetname]
    def process_item(self, item, spider):
        data = dict(item)
        self.post.insert_one(data)
        return item

2.7 运行,发现数据库中并没有插入数据。原因:在设置中没有开启pipelines选项

# 打开这三行的注释
ITEM_PIPELINES = {
   'douban.pipelines.DoubanPipeline': 300,
}

2.8 运行,数据插入成功


数据插入成功

f. 设置代理

  1. ip代理中间件
  • middleware.py中编写代理中间件
  • 写好代理ip的中间件代码如下:
# 设置代理ip,设置好了之后要在settings里面更改配置
class my_proxy(object):
    def progress_request(self, request, spider):
        # 代理服务器地址
        request.meta['proxt'] = 'https:xxxx'
        # 代理用户名和密码
        proxy_name_pass = b'user(xxxxx):pass(xxxx)'
        # 对用户名密码进行加密,只能加密base类型数据,要在proxy_name_pass前面加b
        encode_name_pass = base64.b64encode(proxy_name_pass)
        # 注意Basic后面要加一个空格
        request.header['Proxy Authorization'] = 'Basic ' + encode_name_pass.decode()
  • settings里面打开代理中间件的配置
# 把DoubanDownloaderMiddleware改成我们自己刚才创建的类
DOWNLOADER_MIDDLEWARES = {
   # 'douban.middlewares.DoubanDownloaderMiddleware': 543,
  'douban.middlewares.my_proxy': 543,
}
  1. User Agent代理中间件
  • 创建类,编写方法
class my_useragent(object):
    def progress_request(self, request, spider):
        # user agent 列表
        USER_AGENT_LIST = [
            'MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23',
            'Opera/9.20 (Macintosh; Intel Mac OS X; U; en)',
            'Opera/9.0 (Macintosh; PPC Mac OS X; U; en)',
            'iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)',
            'Mozilla/4.76 [en_jp] (X11; U; SunOS 5.8 sun4u)',
            'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0',
            'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0',
            'Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)',
            'Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)'
        ]
        # 随机生成user agent
        agent = random.choice(USER_AGENT_LIST)
        request.header['User Agent'] = agent
  • 添加settings中的配置
# 把DoubanDownloaderMiddleware改成我们自己刚才创建的类
# 后面的数字表示的是优先级,优先级不能相同
DOWNLOADER_MIDDLEWARES = {
   # 'douban.middlewares.DoubanDownloaderMiddleware': 543,
  'douban.middlewares.my_proxy': 543,
  'douban.middlewares.my_useragent': 544,
}

慢慢来,一步一个巴掌印~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容

  • 这两天摸索了下scrapy,刚看文档的时候觉得有点生无可恋,scrapy框架个人还是觉得比较难懂的,需要学习的地方...
    Treehl阅读 5,639评论 7 10
  • scrapy爬取豆瓣电影,存储在MongoDB 本节分享用的Scrapy爬取豆瓣电影Top250的实战。 本节要实...
    小明与小明阅读 1,593评论 0 1
  • 背景知识 (一)什么是Scrapy呢?Python上优秀的爬虫框架。什么是爬虫?可以看我的心得感悟,也可以自行谷歌...
    xuzhougeng阅读 5,166评论 8 42
  • 晤谈进行40分钟后会暂停十分钟。暂停之后,咨询师会给予赞美,桥梁,建议等反馈信息, 以鼓励当事人在舞台室外,持续改...
    把酒临风_6e5a阅读 102评论 0 0
  • 这一年,你过得好吗? 这一年,你刚毕业,拿着微薄的薪资,租最便宜的房子,工作大半年仍然需要家里接济。你对未来充满斗...
    女侠没有假期阅读 550评论 0 1