摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址自己寫(xiě)表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面主演年份產(chǎn)地簡(jiǎn)介等信息。
[一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11...
git地址
自己寫(xiě)表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面、主演、年份、產(chǎn)地、簡(jiǎn)介等信息。前端有個(gè)輸入框,輸入電影名然后去爬取電影信息錄入到MongoDB中
分析
打開(kāi)豆瓣電影,搜索千與千尋
通過(guò)分析,發(fā)現(xiàn)
搜索后的列表是通過(guò)
https://movie.douban.com/subj...這個(gè)請(qǐng)求獲取的
要搜的電影一般都是列表的第一條,有時(shí)搜出來(lái)的第一條是明星的信息
需要的電影有一個(gè)url,指向這條電影的詳情,而我們想要的信息就在詳情接口里
PS(比較有意思的是最開(kāi)始我爬取的時(shí)候,想要的信息就在這個(gè)接口的響應(yīng)中,從響應(yīng)里面提取出來(lái)就行,但后來(lái)我發(fā)現(xiàn)響應(yīng)里沒(méi)有了,豆瓣電影里的搜索后的列表信息變成了js動(dòng)態(tài)渲染出來(lái)的,所有的信息在響應(yīng)的window_data中存放,所以又把代碼修改了下,使用phantom來(lái)渲染爬取到的頁(yè)面)
所有大體邏輯就是通過(guò)接口A(yíng)獲取一個(gè)電影列表,從列表中提取出我們需要的電影詳情的url B,爬取B接口,獲取詳情,從詳情中提取信息
工具
phantom 通過(guò)plantom渲染爬取的頁(yè)面,頁(yè)面中的js代碼也會(huì)相應(yīng)的執(zhí)行
cheerio 服務(wù)端的一個(gè)實(shí)現(xiàn)jquery功能的庫(kù),可以方便的獲取響應(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19092.html
摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址自己寫(xiě)表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面主演年份產(chǎn)地簡(jiǎn)介等信息。 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 自己寫(xiě)表單錄入電影信息比較費(fèi)勁,所以選擇爬取豆瓣電影的信息主要爬取電影的封面、主演、年份、產(chǎn)地、簡(jiǎn)介等信息。前端有個(gè)輸入框,輸入電影名然后...
摘要:線(xiàn)上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶(hù)身份認(rèn)證中使用來(lái)寫(xiě)單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫(xiě)一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...
摘要:線(xiàn)上地址主要從下面幾點(diǎn)入手一步一步搭建應(yīng)用前后端初始化爬取豆瓣電影的電影信息開(kāi)啟身份認(rèn)證使用來(lái)做基于的用戶(hù)身份認(rèn)證中使用來(lái)寫(xiě)單元測(cè)試部署技術(shù)棧沒(méi)用之后改運(yùn)行代碼到本地項(xiàng)目地址喜歡就一下吧前端后端需要安裝本項(xiàng)目端口并開(kāi)啟權(quán)限認(rèn)證。 介紹 斷斷續(xù)續(xù)利用周末時(shí)間做了兩個(gè)月,基于react和express的一個(gè)小項(xiàng)目差不多做完了。所以想寫(xiě)一系列文章來(lái)總結(jié)一下前后端用到技術(shù)及遇到的問(wèn)題和解決方法...
摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址是一個(gè)單元測(cè)試框架,類(lèi)似于前端的語(yǔ)法也相近用來(lái)測(cè)試接口的庫(kù)斷言庫(kù),可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽(tīng)文件下的所有文件接口描述這里我們來(lái)測(cè)試一個(gè)添加一條電影的接口河正宇金允石鄭滿(mǎn)植動(dòng)作犯罪 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 mocha 是一個(gè)node單元測(cè)試框架,類(lèi)...
摘要:一步一步構(gòu)建一個(gè)應(yīng)用開(kāi)篇地址是一個(gè)單元測(cè)試框架,類(lèi)似于前端的語(yǔ)法也相近用來(lái)測(cè)試接口的庫(kù)斷言庫(kù),可讀性很高搭建項(xiàng)目根目錄下新建文件夾,中監(jiān)聽(tīng)文件下的所有文件接口描述這里我們來(lái)測(cè)試一個(gè)添加一條電影的接口河正宇金允石鄭滿(mǎn)植動(dòng)作犯罪 [一步一步構(gòu)建一個(gè)react應(yīng)用-開(kāi)篇](https://segmentfault.com/a/11... git地址 mocha 是一個(gè)node單元測(cè)試框架,類(lèi)...
閱讀 3576·2021-10-15 09:43
閱讀 3496·2021-09-02 15:21
閱讀 2208·2021-08-11 11:23
閱讀 3247·2019-08-30 15:54
閱讀 1939·2019-08-30 13:54
閱讀 3208·2019-08-29 18:35
閱讀 679·2019-08-29 16:58
閱讀 1751·2019-08-29 12:49