资讯专栏INFORMATION COLUMN

一步一步搭建react应用-爬取豆瓣电影的电影信息

lixiang / 2235人阅读

摘要:一步一步构建一个应用开篇地址自己写表单录入电影信息比较费劲,所以选择爬取豆瓣电影的信息主要爬取电影的封面主演年份产地简介等信息。

[一步一步构建一个react应用-开篇](https://segmentfault.com/a/11...

git地址

自己写表单录入电影信息比较费劲,所以选择爬取豆瓣电影的信息主要爬取电影的封面、主演、年份、产地、简介等信息。前端有个输入框,输入电影名然后去爬取电影信息录入到MongoDB中

分析

打开豆瓣电影,搜索千与千寻

通过分析,发现

搜索后的列表是通过
https://movie.douban.com/subj...这个请求获取的

要搜的电影一般都是列表的第一条,有时搜出来的第一条是明星的信息

需要的电影有一个url,指向这条电影的详情,而我们想要的信息就在详情接口里

PS(比较有意思的是最开始我爬取的时候,想要的信息就在这个接口的响应中,从响应里面提取出来就行,但后来我发现响应里没有了,豆瓣电影里的搜索后的列表信息变成了js动态渲染出来的,所有的信息在响应的window_data中存放,所以又把代码修改了下,使用phantom来渲染爬取到的页面)

所有大体逻辑就是通过接口A获取一个电影列表,从列表中提取出我们需要的电影详情的url B,爬取B接口,获取详情,从详情中提取信息

工具

phantom 通过plantom渲染爬取的页面,页面中的js代码也会相应的执行

cheerio 服务端的一个实现jquery功能的库,可以方便的获取响应中的html中我们要的信息

爬取

项目接口 /api/reptile/:name

代码

</>复制代码

  1. var express = require("express");
  2. var router = express.Router();
  3. const CONFIG = require("../config/config")
  4. const cheerio = require("cheerio")
  5. const rq = require("request-promise")
  6. var phantom = require("phantom");
  7. function getMovieSubjectUrl(name) {
  8. var _ph, _page, _outObj;
  9. return phantom.create().then(ph => {
  10. _ph = ph;
  11. return _ph.createPage();
  12. }).then(page => {
  13. _page = page;
  14. return _page.open("https://movie.douban.com/subject_search?search_text=" + encodeURIComponent(name));
  15. }).then(status => {
  16. return _page.property("content")
  17. }).then(content => {
  18. _page.close();
  19. _ph.exit();
  20. return content
  21. }).catch(e => console.log(e));
  22. }
  23. function getMovieDetail(href, res, next) {
  24. rq(href).then(str => {
  25. const $ = cheerio.load(str)
  26. const data = fillData($)
  27. res.json({
  28. code: CONFIG.ERR_OK,
  29. data
  30. })
  31. })
  32. }
  33. function fillData($) {
  34. const movie = {
  35. thumb: "",
  36. actors: "",
  37. type: "",
  38. time: "",
  39. instruct: ""
  40. }
  41. /**
  42. * 为方便提取数据,换行标签替换
  43. */
  44. let info_html = $("#info").html().replace(/
    /g, "**")
  45. let txt = cheerio.load(info_html).text()
  46. txt = txt.replace(/s+/g, "").split("**")
  47. movie.thumb = $("#mainpic img").attr("src")
  48. movie.instruct = $("#link-report").find("span[property]").text()
  49. movie.actors = txt[2].split(":")[1].split("/")
  50. movie.type = txt[3].split(":")[1].split("/")
  51. movie.time = txt[6].split(":")[1]
  52. return movie
  53. }
  54. router.get("/:name", function (req, res, next) {
  55. getMovieSubjectUrl(req.params.name).then(str => {
  56. const $ = cheerio.load(str)
  57. let detail = $(".detail")
  58. if (detail.length) {
  59. let a
  60. if (detail.eq(0).has(".rating_nums").length) {
  61. a = detail.eq(0).find(".title a")
  62. } else {
  63. a = detail.eq(1).find(".title a")
  64. }
  65. getMovieDetail(a.attr("href"), res, next)
  66. } else {
  67. next(10001)
  68. }
  69. });
  70. })
  71. module.exports = router;

前端

reptile.jsx

</>复制代码

  1. import React from "react";
  2. import {
  3. Button,
  4. Switch
  5. } from "antd-mobile"
  6. import cloneDeep from "lodash/cloneDeep"
  7. import Util from "../util/Util.js"
  8. import MovieInfo from "./movieInfo"
  9. import DownForm from "./download-form"
  10. export default class Reptile extends React.Component {
  11. constructor(props) {
  12. super(props)
  13. this.state = {
  14. m_name: "",
  15. m_info: null,
  16. }
  17. this.reptile = this.reptile.bind(this)
  18. }
  19. /**
  20. * 爬取数据
  21. */
  22. reptile() {
  23. if (!this.state.m_name) {
  24. return
  25. }
  26. Util.fetch("/api/reptile/" + this.state.m_name).then(data => {
  27. if (data.code) {
  28. Util.Toast.info(data.message)
  29. return
  30. }
  31. this.setState({
  32. m_info: data.data,
  33. })
  34. })
  35. }
  36. render() {
  37. return (
  38. {
  39. this.setState({
  40. m_name: e.target.value
  41. })
  42. }} />
  43. )
  44. }
  45. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88471.html

相关文章

  • 步一搭建react应用-爬取豆瓣电影电影信息

    摘要:一步一步构建一个应用开篇地址自己写表单录入电影信息比较费劲,所以选择爬取豆瓣电影的信息主要爬取电影的封面主演年份产地简介等信息。 [一步一步构建一个react应用-开篇](https://segmentfault.com/a/11... git地址 自己写表单录入电影信息比较费劲,所以选择爬取豆瓣电影的信息主要爬取电影的封面、主演、年份、产地、简介等信息。前端有个输入框,输入电影名然后...

    Bamboy 评论0 收藏0
  • 步一步构建一个react应用-开篇

    摘要:线上地址主要从下面几点入手一步一步搭建应用前后端初始化爬取豆瓣电影的电影信息开启身份认证使用来做基于的用户身份认证中使用来写单元测试部署技术栈没用之后改运行代码到本地项目地址喜欢就一下吧前端后端需要安装本项目端口并开启权限认证。 介绍 断断续续利用周末时间做了两个月,基于react和express的一个小项目差不多做完了。所以想写一系列文章来总结一下前后端用到技术及遇到的问题和解决方法...

    BigTomato 评论0 收藏0
  • 步一步构建一个react应用-开篇

    摘要:线上地址主要从下面几点入手一步一步搭建应用前后端初始化爬取豆瓣电影的电影信息开启身份认证使用来做基于的用户身份认证中使用来写单元测试部署技术栈没用之后改运行代码到本地项目地址喜欢就一下吧前端后端需要安装本项目端口并开启权限认证。 介绍 断断续续利用周末时间做了两个月,基于react和express的一个小项目差不多做完了。所以想写一系列文章来总结一下前后端用到技术及遇到的问题和解决方法...

    lylwyy2016 评论0 收藏0
  • 步一搭建react应用-node中使用 mocha + supertest + should 来

    摘要:一步一步构建一个应用开篇地址是一个单元测试框架,类似于前端的语法也相近用来测试接口的库断言库,可读性很高搭建项目根目录下新建文件夹,中监听文件下的所有文件接口描述这里我们来测试一个添加一条电影的接口河正宇金允石郑满植动作犯罪 [一步一步构建一个react应用-开篇](https://segmentfault.com/a/11... git地址 mocha 是一个node单元测试框架,类...

    dadong 评论0 收藏0
  • 步一搭建react应用-node中使用 mocha + supertest + should 来

    摘要:一步一步构建一个应用开篇地址是一个单元测试框架,类似于前端的语法也相近用来测试接口的库断言库,可读性很高搭建项目根目录下新建文件夹,中监听文件下的所有文件接口描述这里我们来测试一个添加一条电影的接口河正宇金允石郑满植动作犯罪 [一步一步构建一个react应用-开篇](https://segmentfault.com/a/11... git地址 mocha 是一个node单元测试框架,类...

    chengtao1633 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<