标题略显浮夸...大家不要介意@_@

最近要去上海打工,网上查了一下,很多人说豆瓣租房小组租房子挺靠谱的,于是就百度了一下,点进去的界面是这样的...

豆瓣租房小组首页

帖子详情页

看到首页的时候就感觉有点头大,有种零几年逛贴吧论坛的感觉,就直接罗列标题,没有缩略图,你要点进去才能查看具体的房源信息,房子图片,有点麻烦。

为了方便浏览,我决定利用所学知识对该界面进行优化,把纯文字的界面转化成这种“标题+图片的形式”,浏览信息更直观方便一些,下面先上效果图,图中没有图片的地方是因为原贴就没有图片。

豆瓣租房优化.png

1. 思路

先解释一下,我说的优化的意思不是写个浏览器脚本或插件,然后打开这个网页会自动转化,这种技术对于我来说太难了......

我的想法是,先爬取这个网页的关键数据,保存成json文件,然后再写一个静态网页展示这些数据,当然一些链接也会爬取下来,所以最后即使我做的是静态网页,但点击相应的帖子,我也能跳转到原贴的详情页,营造出一种真实网站的感觉

2. 涉及的技术

Python:要爬取网页信息,这里我选择用Python,同时使用到了requests库和lxml库。

前端技术:HTML、CSS,JavaScript素质三连,为了便于展示数据我用到了Vue2.0,懒得写分页,所以也用到了Bootstrap的分页组件。

3. 代码实现

3.1 爬取网页信息

import json

import requests

from lxml import html

class spider:

def __init__(self):

self.page = 0

self.url = 'https://www.douban.com/group/search?start={}&cat=1013&group=146409&sort=time&q=%E9%97%B5%E8%A1%8C'.format(self.page)

self.headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36",

}

def get_html(self, url):

response = requests.get(url, headers=self.headers).text

html_tree = html.fromstring(response)

return html_tree

def get_img(self, href):

html_data = self.get_html(href)

img = html_data.xpath('//*[@id="link-report"]//*[@class="image-wrapper"]/img/@src')[:4]

return img

def save_files(self, filename, array):

try:

with open(filename, 'w', encoding='utf-8') as json_data:

json.dump(array, json_data, ensure_ascii=False)

print('**********写入成功**********')

except EnvironmentError:

print('写入失败')

def get_data(self):

json_data = []

data = {}

html_data = self.get_html(self.url)

title_list = html_data.xpath('//*[@class="olt"]/tbody/tr/td[1]/a/@title')

href_list = html_data.xpath('//*[@class="olt"]/tbody/tr/td[1]/a/@href')

time_list = html_data.xpath('//*[@class="olt"]/tbody/tr/td[2]/@title')

for title, href, time in zip(title_list, href_list, time_list):

img = self.get_img(href)

data['title'] = title

data['href'] = href

data['img'] = img

data['time'] = time

json_data.append(data)

print('已获取: ' + title)

data = {}

return json_data

def next_page(self):

self.page += 50

self.url = 'https://www.douban.com/group/search?start={}&cat=1013&group=146409&sort=time&q=%E9%97%B5%E8%A1%8C'.format(self.page)

def run(self, page_num):

json_data = []

flag = page_num

while page_num > 0:

json_data += self.get_data()

print('已获取第', flag - page_num + 1, '页')

self.next_page()

page_num -= 1

self.save_files('./data.json', json_data)

s = spider()

s.run(5) # 爬取5页

纯粹的笨方法爬取,没有多线程也没有异步,下面解释一下代码:

get_html(url):获取原始网页,整理成树结构,方便xpath语法解析。

get_img(href):获取帖子中的图片地址。

get_data():获取title文本,链接,发布时间等信息,return返回json数据。

next_page(url):爬取下一页,观察url信息,发现每下一页,url中的某个参数递增50,所以直接+50。

save_files(filename, array):把json数据保存成data.json文件。

run(page_num):设定爬取的页数,然后执行。

运行后爬取到data.json文件:

data.json文件.png

3.2 用静态网页展示

html代码

豆瓣租房小组

豆瓣租房小组图片预览

  • {{ index + 1 + (curPage - 1) * 15}}
    {{ info.title }}

    {{ info.time }}

  • 上一页
  • {{ n }}
  • 下一页

CSS代码

body {

border: 1px solid #ddd;

margin: auto;

width: 1080px;

box-shadow: 2px 2px 10px 2px #ccc;

}

#header {

margin-bottom: 5em;

text-align: center;

}

#fileImport {

font-size: 18px;

}

#content ul {

margin: 0;

padding: 0;

}

#content ul li {

list-style: none;

margin: 1em 0.5em;

padding: 1em 0;

border-top: 1px solid #999;

}

.info-list .title-list {

display: flex;

}

.info-list .title-list span {

display: inline-block;

width: 3em;

font-style: italic;

font-size: 1.5em;

color: #eb5f00;

text-align: center;

}

.info-list .title-list a {

text-decoration: none;

font-size: 1.5em;

color: black;

}

.info-list .title-list a:hover {

color: #e79600;

}

.info-list .img-box {

display: flex;

margin-left: 4em;

}

.info-list .img-box img {

margin: 0.5em;

width: 200px;

height: 200px;

}

.info-list .release-time {

margin-left: 4em;

padding-top: 1em;

font-size: 16px;

color: #999;

}

js代码

const index = new Vue({

el: '#content',

data: {

json_data: [], // 租房信息数据

num: 0, //多少条数据

pageNum: [], //总页数转化成列表

pageSize: 15, //每一页的数量

totalPage: 1, //总页数

curPage: 1, //当前页数

showPageList: 0, //当前显示的页面

},

// 监听器

watch: {

json_data(newData){

this.pageNum = []; // 若数据更新,页码先清零

this.num = newData.length;

this.totalPage = Math.ceil(this.num / this.pageSize);

this.totalPage = this.totalPage == 0 ? 1 : this.totalPage;

this.change_list();

this.getShowPageList(newData, this.curPage);

},

curPage(newPage){

this.getShowPageList(this.json_data, newPage);

}

},

// 事件处理方法

methods: {

// 点击触发选择文件按钮

files_click: function(){

$("#files").click();

},

// 读取json文件

get_json_data: function(e){

var self = this; // 保存外部作用域

var selectedFile = e.target.files[0];

var reader = new FileReader();

reader.readAsText(selectedFile);

reader.onload = function () {

self.json_data = JSON.parse(this.result); // 读取的是字符串,转换数组

}

},

// 页数转换成数组

change_list: function(){

for (let i = 1; i <= this.totalPage; i++) {

this.pageNum.push(i)

}

},

// 获取当前页应展示的数据

getShowPageList: function(data, index){

let begin = (index - 1) * this.pageSize;

let end = index * this.pageSize;

this.showPageList = data.slice(begin, end);

},

// 上一页

prevPage: function(e){

if(this.curPage != 1){

this.curPage --;

}

},

// 下一页

nextPage: function(e){

if(this.curPage != this.totalPage){

this.curPage ++;

}

},

// 点击页面跳转

link_curPage: function(e){

console.log(e.target.text);

let num = parseInt(e.target.text);

this.curPage = num;

}

}

})

最后我是用js的FileReader接口读取的json文件,查资料的时候有人说可以用Ajax读取,但我试了一下发现会产生跨域。手动导入文件显得太笨了......没办法,能力有限,后续有空再尝试优化一下这个问题。

代码就不解释了,思路就是读取json文件,本质上这些json数据都是数组,使用Vue可以轻松的展示这些数据

豆瓣小组html模板,用前端的方式打开豆瓣租房小组相关推荐

  1. php框架中什么是渲染,thinkPHP5框架渲染模板的3种方式简述

    本文实例讲述了thinkPHP5框架渲染模板的3种方式.分享给大家供大家参考,具体如下: 默认情况下,控制器的输出全部采用return的方式,无需进行任何的手动输出,系统会自动完成渲染内容的输出. 在 ...

  2. Vue.js 定义组件模板的七种方式

    转载自  Vue.js 定义组件模板的七种方式 在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render ...

  3. 用微前端的方式搭建类单页应用

    前言 微前端由ThoughtWorks 2016年提出,将后端微服务的理念应用于浏览器端,即将 Web 应用由单一的单体应用转变为多个小型前端应用聚合为一的应用. 美团已经是一家拥有几万人规模的大型互 ...

  4. 关于类的静态的模板函数的使用方式

    关于类的静态的模板函数的使用方式 工作中遇到如下形式的模板使用: #include <iostream>class my{public:template <typename A> ...

  5. 过滤豆瓣租房小组中介贴之 python 实现余弦相似度(转)

    为什么80%的码农都做不了架构师?>>>    前几天做了个微信找房机器人, 爬取豆瓣租房小组的时候发现很多伪装的中介帖,如下这种格式: 可月付 无中介 方庄地铁附近 芳城园一区单间 ...

  6. 豆瓣八卦小组html失败,养活无数营销号的豆瓣小组,到底在聊什么?

    编者按:本文来自微信公众号"FUNJI种瓜基地"(ID:FUNJIdata),作者 FUNJI种瓜基地,36氪经授权发布. 在10月初被"雪藏"的两大豆瓣娱乐小 ...

  7. Mogrt教程 简单粗暴的PR动态图形模板Mogrt替换logo方式

    很多用户反馈Mogrt文件需要用AE打开替换图片才能使用,"这根本就是AE模板",体验太差了! 这确实是个问题,我们也希望Adobe官方可以更新下.mogrt可以在PR软件中直接替 ...

  8. 前端文件下载的打开方式

    前端文件下载的打开方式 1.a标签 2.window.open 3.location.href 4.location.其他属性 5.XMLHttpRequest 1.a标签 <a href=&q ...

  9. PDF.js + Vue 浏览器以只读方式打开PDF,后台返回文件流,前端实现预览pdf

    如果你想光前端完成 office(xls,doc,ppt) 文件的预览,只能提供你这些库来使用 PDF http://mozilla.github.com/pdf.js/ XLS https://gi ...

  10. 如何在豆瓣租房小组快速找到满意的房子

    这几天忙着找房子,没怎么更新公众号,新浪本来是提供人才公寓的,可惜我错过了. 在大城市租房真的是一把辛酸泪,至今不知道搬家多少次了,今天就分享下我在北京租房找房的经历,或许对你找房子(不限于北京)有点 ...

最新文章

  1. 小米AIoT开发者大会28日召开,雷军的AIoT和小米的这一年
  2. ubuntu镜像添加jdk_Ubuntu16.0.4安装jdk8
  3. springboot中分页插件pageHelper的使用
  4. 深入浅出的webpack4构建工具--webpack4+react构建环境(二十)
  5. springboot设置运行内存_Docker 如何运行多个 Springboot?
  6. 杭电oj首字母变大写
  7. jmter测试jmeter参数化(必须掌握)
  8. undefined reference to '__android_log_print'解决方案
  9. AndroidDeveloper Weekly No.2
  10. Android项目实战之高仿网易云音乐创建项目和配置
  11. 基于qt平台的ip地址输入控件
  12. NS和DNS的区别有哪些
  13. 2021-10-28
  14. 检查软件下载是否完整 MD5 工具使用 ----- md5sum
  15. Oracle Overview
  16. 真容慧表NxCells 构建模板 管理数据表详解
  17. 前苏联IV-18荧光数码管时钟开发(ИВ-18)
  18. 夜莺日志采集mtail
  19. 石坑崆(猛坑石)攻略
  20. 银行体检有哪些注意事项?

热门文章

  1. js 表单打开新窗口
  2. rp文件chrome浏览器查看插件
  3. 2021文科跨考计算机经验贴(个人分享用,科目408)
  4. Python表白代码:“ 星光月夜烟花皆归你,我也归你”(满天烟花盛开、附番外玫瑰)
  5. 《30天自制操作系统》 day8 小结
  6. Hadoop完全分布式集群——Hadoop 配置
  7. 唧唧Down(B站视频下载) 彻底解决你的B站视频下载问题
  8. 伍德里奇计量经济学导论第5版笔记和课后答案
  9. 伍德里奇计量经济学导论之计算机操作题的R语言实现(多元回归:估计)
  10. python实战项目(Django技术点)