成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

一步一步搭建react應(yīng)用-爬取豆瓣電影的電影信息

lixiang / 2173人閱讀

摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址自己寫表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面主演年份產(chǎn)地簡介等信息。

[一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11...

git地址

自己寫表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面、主演、年份、產(chǎn)地、簡介等信息。前端有個(gè)輸入框,輸入電影名然后去爬取電影信息錄入到MongoDB中

分析

打開豆瓣電影,搜索千與千尋

通過分析,發(fā)現(xiàn)

搜索后的列表是通過
https://movie.douban.com/subj...這個(gè)請求獲取的

要搜的電影一般都是列表的第一條,有時(shí)搜出來的第一條是明星的信息

需要的電影有一個(gè)url,指向這條電影的詳情,而我們想要的信息就在詳情接口里

PS(比較有意思的是最開始我爬取的時(shí)候,想要的信息就在這個(gè)接口的響應(yīng)中,從響應(yīng)里面提取出來就行,但后來我發(fā)現(xiàn)響應(yīng)里沒有了,豆瓣電影里的搜索后的列表信息變成了js動(dòng)態(tài)渲染出來的,所有的信息在響應(yīng)的window_data中存放,所以又把代碼修改了下,使用phantom來渲染爬取到的頁面)

所有大體邏輯就是通過接口A獲取一個(gè)電影列表,從列表中提取出我們需要的電影詳情的url B,爬取B接口,獲取詳情,從詳情中提取信息

工具

phantom 通過plantom渲染爬取的頁面,頁面中的js代碼也會(huì)相應(yīng)的執(zhí)行

cheerio 服務(wù)端的一個(gè)實(shí)現(xiàn)jquery功能的庫,可以方便的獲取響應(yīng)中的html中我們要的信息

爬取

項(xiàng)目接口 /api/reptile/:name

代碼

var express = require("express");
var router = express.Router();
const CONFIG = require("../config/config")
const cheerio = require("cheerio")
const rq = require("request-promise")
var phantom = require("phantom");


function getMovieSubjectUrl(name) {
  var _ph, _page, _outObj;
  return phantom.create().then(ph => {
    _ph = ph;
    return _ph.createPage();
  }).then(page => {
    _page = page;
    return _page.open("https://movie.douban.com/subject_search?search_text=" + encodeURIComponent(name));
  }).then(status => {
    return _page.property("content")
  }).then(content => {
    _page.close();
    _ph.exit();
    return content
  }).catch(e => console.log(e));
}

function getMovieDetail(href, res, next) {
  rq(href).then(str => {
    const $ = cheerio.load(str)
    const data = fillData($)
    res.json({
      code: CONFIG.ERR_OK,
      data
    })
  })
}


function fillData($) {
  const movie = {
    thumb: "",
    actors: "",
    type: "",
    time: "",
    instruct: ""
  }
  /**
   * 為方便提取數(shù)據(jù),換行標(biāo)簽替換
   */
  let info_html = $("#info").html().replace(/
/g, "**") let txt = cheerio.load(info_html).text() txt = txt.replace(/s+/g, "").split("**") movie.thumb = $("#mainpic img").attr("src") movie.instruct = $("#link-report").find("span[property]").text() movie.actors = txt[2].split(":")[1].split("/") movie.type = txt[3].split(":")[1].split("/") movie.time = txt[6].split(":")[1] return movie } router.get("/:name", function (req, res, next) { getMovieSubjectUrl(req.params.name).then(str => { const $ = cheerio.load(str) let detail = $(".detail") if (detail.length) { let a if (detail.eq(0).has(".rating_nums").length) { a = detail.eq(0).find(".title a") } else { a = detail.eq(1).find(".title a") } getMovieDetail(a.attr("href"), res, next) } else { next(10001) } }); }) module.exports = router;

前端

reptile.jsx

import React from "react";
import {
    Button,
    Switch
} from "antd-mobile"
import cloneDeep from "lodash/cloneDeep"
import Util from "../util/Util.js"
import MovieInfo from "./movieInfo"
import DownForm from "./download-form"

export default class Reptile extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            m_name: "",
            m_info: null,
        }
        this.reptile = this.reptile.bind(this)
    }

    /**
     * 爬取數(shù)據(jù)
     */
    reptile() {
        if (!this.state.m_name) {
            return
        }
        Util.fetch("/api/reptile/" + this.state.m_name).then(data => {
            if (data.code) {
                Util.Toast.info(data.message)
                return
            }
            this.setState({
                m_info: data.data,
            })
        })
    }

    render() {
        return (
            
{ this.setState({ m_name: e.target.value }) }} />
) } }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/88471.html

相關(guān)文章

  • 步一搭建react應(yīng)用-爬取豆瓣電影電影信息

    摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址自己寫表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面主演年份產(chǎn)地簡介等信息。 [一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11... git地址 自己寫表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面、主演、年份、產(chǎn)地、簡介等信息。前端有個(gè)輸入框,輸入電影名然后...

    Bamboy 評論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開啟身份認(rèn)證使用來做基于的用戶身份認(rèn)證中使用來寫單元測試部署技術(shù)棧沒用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來總結(jié)一下前后端用到技術(shù)及遇到的問題和解決方法...

    BigTomato 評論0 收藏0
  • 步一步構(gòu)建一個(gè)react應(yīng)用-開篇

    摘要:線上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開啟身份認(rèn)證使用來做基于的用戶身份認(rèn)證中使用來寫單元測試部署技術(shù)棧沒用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫一系列文章來總結(jié)一下前后端用到技術(shù)及遇到的問題和解決方法...

    lylwyy2016 評論0 收藏0
  • 步一搭建react應(yīng)用-node中使用 mocha + supertest + should 來

    摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址是一個(gè)單元測試框架,類似于前端的語法也相近用來測試接口的庫斷言庫,可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽文件下的所有文件接口描述這里我們來測試一個(gè)添加一條電影的接口河正宇金允石鄭滿植動(dòng)作犯罪 [一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11... git地址 mocha 是一個(gè)node單元測試框架,類...

    dadong 評論0 收藏0
  • 步一搭建react應(yīng)用-node中使用 mocha + supertest + should 來

    摘要:一步一步構(gòu)建一個(gè)應(yīng)用開篇地址是一個(gè)單元測試框架,類似于前端的語法也相近用來測試接口的庫斷言庫,可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽文件下的所有文件接口描述這里我們來測試一個(gè)添加一條電影的接口河正宇金允石鄭滿植動(dòng)作犯罪 [一步一步構(gòu)建一個(gè)react應(yīng)用-開篇](https://segmentfault.com/a/11... git地址 mocha 是一個(gè)node單元測試框架,類...

    chengtao1633 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<