Hadoop离线_网站流量日志数据分析系统_数据的预处理

news/2024/5/9 4:52:07/文章来源:https://blog.csdn.net/weixin_44449054/article/details/113824053

标题

          • 1.主要目的
          • 2.实现方式
          • 3.开发一个MapReduce程序WeblogPreProcess
          • 4.点击流模型PageViews表
          • 5.点击流模型visit信息表


1.主要目的

数据清洗 —— 过滤“不合规”数据,清洗无意义的数据

2.实现方式

首先经过flume采集后的数据会有十个字段,每个字段都会由空格来分隔
在这里插入图片描述

3.开发一个MapReduce程序WeblogPreProcess
package cn.itcast.bigdata.weblog.pre;import java.io.IOException;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.HashSet;
import java.util.Set;import cn.itcast.bigdata.weblog.utils.DateUtil;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import cn.itcast.bigdata.weblog.mrbean.WebLogBean;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;/*** 处理原始日志,过滤出真实pv请求 转换时间格式 对缺失字段填充默认值 对记录标记valid和invalid* */public class WeblogPreProcess extends Configured implements Tool {@Overridepublic int run(String[] args) throws Exception {//Configuration conf = new Configuration();Configuration conf = super.getConf();Job job = Job.getInstance(conf);/*String inputPath= "hdfs://node01:9000/weblog/"+DateUtil.getYestDate()+"/input";String outputPath="hdfs://node01:9000/weblog/"+DateUtil.getYestDate()+"/weblogPreOut";FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:9000"), conf);if (fileSystem.exists(new Path(outputPath))){fileSystem.delete(new Path(outputPath),true);}fileSystem.close();FileInputFormat.setInputPaths(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outputPath));job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);
*/FileInputFormat.addInputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/input"));job.setInputFormatClass(TextInputFormat.class);FileOutputFormat.setOutputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/weblogPreOut"));job.setOutputFormatClass(TextOutputFormat.class);job.setJarByClass(WeblogPreProcess.class);job.setMapperClass(WeblogPreProcessMapper.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(NullWritable.class);job.setNumReduceTasks(0);boolean res = job.waitForCompletion(true);return res?0:1;}static class WeblogPreProcessMapper extends Mapper<LongWritable, Text, Text, NullWritable> {// 用来存储网站url分类数据Set<String> pages = new HashSet<String>();Text k = new Text();NullWritable v = NullWritable.get();/*** 从外部配置文件中加载网站的有用url分类数据 存储到maptask的内存中,用来对日志数据进行过滤*/@Overrideprotected void setup(Context context) throws IOException, InterruptedException {pages.add("/about");pages.add("/black-ip-list/");pages.add("/cassandra-clustor/");pages.add("/finance-rhive-repurchase/");pages.add("/hadoop-family-roadmap/");pages.add("/hadoop-hive-intro/");pages.add("/hadoop-zookeeper-intro/");pages.add("/hadoop-mahout-roadmap/");}@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();WebLogBean webLogBean = WebLogParser.parser(line);if (webLogBean != null) {// 过滤js/图片/css等静态资源WebLogParser.filtStaticResource(webLogBean, pages);/* if (!webLogBean.isValid()) return; */k.set(webLogBean.toString());context.write(k, v);}}}public static void main(String[] args) throws Exception {Configuration configuration = new Configuration();int run = ToolRunner.run(configuration, new WeblogPreProcess(), args);System.exit(run);}
}

得到的数据:
在这里插入图片描述

4.点击流模型PageViews表

由于大量的指标统计从点击流模型中更容易得出,所以在预处理阶段,可以使用mr程序来生成点击流模型的数据。
有结构化数据转换为pageView模型的思路:
1.相同ip的数据放到一起按照时间排序,排序后打上标识
2.同一个ip的两条数据之间的时间差,如果大于30分,就不是同一个session,如果小于30分,就认为是同一个session
3.以ip作为key2,相同的数据发送到同一个reduce形成一个集合

package cn.itcast.bigdata.weblog.clickstream;import cn.itcast.bigdata.weblog.mrbean.WebLogBean;
import cn.itcast.bigdata.weblog.utils.DateUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;import java.io.IOException;
import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;/*** * 将清洗之后的日志梳理出点击流pageviews模型数据* * 输入数据是清洗过后的结果数据* * 区分出每一次会话,给每一次visit(session)增加了session-id(随机uuid)* 梳理出每一次会话中所访问的每个页面(请求时间,url,停留时长,以及该页面在这次session中的序号)* 保留referral_url,body_bytes_send,useragent* * * @author* */
public class ClickStreamPageView extends Configured implements Tool {@Overridepublic int run(String[] args) throws Exception {Configuration conf = super.getConf();Job job = Job.getInstance(conf);/*String inputPath="hdfs://node01:9000/weblog/"+DateUtil.getYestDate()+"/weblogPreOut";String outputPath="hdfs://node01:9000/weblog/"+DateUtil.getYestDate()+"/pageViewOut";FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:9000"), conf);if (fileSystem.exists(new Path(outputPath))){fileSystem.delete(new Path(outputPath),true);}fileSystem.close();job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);FileInputFormat.setInputPaths(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outputPath));*/job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);TextInputFormat.addInputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/weblogPreOut"));TextOutputFormat.setOutputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/pageViewOut"));job.setJarByClass(ClickStreamPageView.class);job.setMapperClass(ClickStreamMapper.class);job.setReducerClass(ClickStreamReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(WebLogBean.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);boolean b = job.waitForCompletion(true);return b?0:1;}static class ClickStreamMapper extends Mapper<LongWritable, Text, Text, WebLogBean> {Text k = new Text();WebLogBean v = new WebLogBean();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] fields = line.split("\001");if (fields.length < 9) return;//将切分出来的各字段set到weblogbean中v.set("true".equals(fields[0]) ? true : false, fields[1], fields[2], fields[3], fields[4], fields[5], fields[6], fields[7], fields[8]);//只有有效记录才进入后续处理if (v.isValid()) {//此处用ip地址来标识用户k.set(v.getRemote_addr());context.write(k, v);}}}static class ClickStreamReducer extends Reducer<Text, WebLogBean, NullWritable, Text> {Text v = new Text();@Overrideprotected void reduce(Text key, Iterable<WebLogBean> values, Context context) throws IOException, InterruptedException {ArrayList<WebLogBean> beans = new ArrayList<WebLogBean>();// 先将一个用户的所有访问记录中的时间拿出来排序try {for (WebLogBean bean : values) {//为什么list集合当中不能直接添加循环出来的这个bean?//这里通过属性拷贝,每次new  一个对象,避免了bean的属性值每次覆盖WebLogBean webLogBean = new WebLogBean();try {BeanUtils.copyProperties(webLogBean, bean);} catch(Exception e) {e.printStackTrace();}beans.add(webLogBean);}//将bean按时间先后顺序排序Collections.sort(beans, new Comparator<WebLogBean>() {@Overridepublic int compare(WebLogBean o1, WebLogBean o2) {try {Date d1 = toDate(o1.getTime_local());Date d2 = toDate(o2.getTime_local());if (d1 == null || d2 == null)return 0;return d1.compareTo(d2);} catch (Exception e) {e.printStackTrace();return 0;}}});/*** 以下逻辑为:从有序bean中分辨出各次visit,并对一次visit中所访问的page按顺序标号step* 核心思想:* 就是比较相邻两条记录中的时间差,如果时间差<30分钟,则该两条记录属于同一个session* 否则,就属于不同的session* */int step = 1;String session = UUID.randomUUID().toString();for (int i = 0; i < beans.size(); i++) {WebLogBean bean = beans.get(i);// 如果仅有1条数据,则直接输出if (1 == beans.size()) {// 设置默认停留时长为60sv.set(session+"\001"+key.toString()+"\001"+bean.getRemote_user() + "\001" + bean.getTime_local() + "\001" + bean.getRequest() + "\001" + step + "\001" + (60) + "\001" + bean.getHttp_referer() + "\001" + bean.getHttp_user_agent() + "\001" + bean.getBody_bytes_sent() + "\001"+ bean.getStatus());context.write(NullWritable.get(), v);session = UUID.randomUUID().toString();break;}// 如果不止1条数据,则将第一条跳过不输出,遍历第二条时再输出if (i == 0) {continue;}// 求近两次时间差long timeDiff = timeDiff(toDate(bean.getTime_local()), toDate(beans.get(i - 1).getTime_local()));// 如果本次-上次时间差<30分钟,则输出前一次的页面访问信息if (timeDiff < 30 * 60 * 1000) {v.set(session+"\001"+key.toString()+"\001"+beans.get(i - 1).getRemote_user() + "\001" + beans.get(i - 1).getTime_local() + "\001" + beans.get(i - 1).getRequest() + "\001" + step + "\001" + (timeDiff / 1000) + "\001" + beans.get(i - 1).getHttp_referer() + "\001"+ beans.get(i - 1).getHttp_user_agent() + "\001" + beans.get(i - 1).getBody_bytes_sent() + "\001" + beans.get(i - 1).getStatus());context.write(NullWritable.get(), v);step++;} else {// 如果本次-上次时间差>30分钟,则输出前一次的页面访问信息且将step重置,以分隔为新的visitv.set(session+"\001"+key.toString()+"\001"+beans.get(i - 1).getRemote_user() + "\001" + beans.get(i - 1).getTime_local() + "\001" + beans.get(i - 1).getRequest() + "\001" + (step) + "\001" + (60) + "\001" + beans.get(i - 1).getHttp_referer() + "\001"+ beans.get(i - 1).getHttp_user_agent() + "\001" + beans.get(i - 1).getBody_bytes_sent() + "\001" + beans.get(i - 1).getStatus());context.write(NullWritable.get(), v);// 输出完上一条之后,重置step编号step = 1;session = UUID.randomUUID().toString();}// 如果此次遍历的是最后一条,则将本条直接输出if (i == beans.size() - 1) {// 设置默认停留市场为60sv.set(session+"\001"+key.toString()+"\001"+bean.getRemote_user() + "\001" + bean.getTime_local() + "\001" + bean.getRequest() + "\001" + step + "\001" + (60) + "\001" + bean.getHttp_referer() + "\001" + bean.getHttp_user_agent() + "\001" + bean.getBody_bytes_sent() + "\001" + bean.getStatus());context.write(NullWritable.get(), v);}}} catch (ParseException e) {e.printStackTrace();}}private String toStr(Date date) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);return df.format(date);}private Date toDate(String timeStr) throws ParseException {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);return df.parse(timeStr);}private long timeDiff(String time1, String time2) throws ParseException {Date d1 = toDate(time1);Date d2 = toDate(time2);return d1.getTime() - d2.getTime();}private long timeDiff(Date time1, Date time2) throws ParseException {return time1.getTime() - time2.getTime();}}public static void main(String[] args) throws Exception {int run = ToolRunner.run(new Configuration(), new ClickStreamPageView(), args);System.exit(run);}
}

得到的数据
在这里插入图片描述

5.点击流模型visit信息表

注:“一次访问”=“N次连续请求”
直接从原始数据中用hql语法得出每个人的“次”访问信息比较困难,可先用mapreduce程序分析原始数据得出“次”信息数据,然后再用hql进行更多维度统计

package cn.itcast.bigdata.weblog.clickstream;import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;import cn.itcast.bigdata.weblog.utils.DateUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import cn.itcast.bigdata.weblog.mrbean.PageViewsBean;
import cn.itcast.bigdata.weblog.mrbean.VisitBean;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;/*** 输入数据:pageviews模型结果数据* 从pageviews模型结果数据中进一步梳理出visit模型* sessionid  start-time   out-time   start-page   out-page   pagecounts  ......* * @author**/
public class ClickStreamVisit extends Configured implements Tool {@Overridepublic int run(String[] args) throws Exception {Configuration conf = super.getConf();Job job = Job.getInstance(conf);/*String inputPath = "hdfs://node01:9000/weblog/"+ DateUtil.getYestDate() + "/pageViewOut";String outPutPath="hdfs://node01:9000/weblog/"+ DateUtil.getYestDate() + "/clickStreamVisit";FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:9000"),conf);if (fileSystem.exists(new Path(outPutPath))){fileSystem.delete(new Path(outPutPath),true);}fileSystem.close();FileInputFormat.setInputPaths(job, new Path(inputPath));FileOutputFormat.setOutputPath(job, new Path(outPutPath));job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);*/job.setInputFormatClass(TextInputFormat.class);job.setOutputFormatClass(TextOutputFormat.class);TextInputFormat.addInputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/pageViewOut"));TextOutputFormat.setOutputPath(job,new Path("file:Users/zhaozhuang/Desktop/8.大数据离线第八天/日志文件数据/clickStreamVisit"));job.setJarByClass(ClickStreamVisit.class);job.setMapperClass(ClickStreamVisitMapper.class);job.setReducerClass(ClickStreamVisitReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(PageViewsBean.class);job.setOutputKeyClass(NullWritable.class);job.setOutputValueClass(VisitBean.class);boolean res = job.waitForCompletion(true);return res?0:1;}// 以session作为key,发送数据到reducerstatic class ClickStreamVisitMapper extends Mapper<LongWritable, Text, Text, PageViewsBean> {PageViewsBean pvBean = new PageViewsBean();Text k = new Text();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] fields = line.split("\001");int step = Integer.parseInt(fields[5]);//(String session, String remote_addr, String timestr, String request, int step, String staylong, String referal, String useragent, String bytes_send, String status)//299d6b78-9571-4fa9-bcc2-f2567c46df3472.46.128.140-2013-09-18 07:58:50/hadoop-zookeeper-intro/160"https://www.google.com/""Mozilla/5.0"14722200pvBean.set(fields[0], fields[1], fields[2], fields[3],fields[4], step, fields[6], fields[7], fields[8], fields[9]);k.set(pvBean.getSession());context.write(k, pvBean);}}static class ClickStreamVisitReducer extends Reducer<Text, PageViewsBean, NullWritable, VisitBean> {@Overrideprotected void reduce(Text session, Iterable<PageViewsBean> pvBeans, Context context) throws IOException, InterruptedException {// 将pvBeans按照step排序ArrayList<PageViewsBean> pvBeansList = new ArrayList<PageViewsBean>();for (PageViewsBean pvBean : pvBeans) {PageViewsBean bean = new PageViewsBean();try {BeanUtils.copyProperties(bean, pvBean);pvBeansList.add(bean);} catch (Exception e) {e.printStackTrace();}}Collections.sort(pvBeansList, new Comparator<PageViewsBean>() {@Overridepublic int compare(PageViewsBean o1, PageViewsBean o2) {return o1.getStep() > o2.getStep() ? 1 : -1;}});// 取这次visit的首尾pageview记录,将数据放入VisitBean中VisitBean visitBean = new VisitBean();// 取visit的首记录visitBean.setInPage(pvBeansList.get(0).getRequest());visitBean.setInTime(pvBeansList.get(0).getTimestr());// 取visit的尾记录visitBean.setOutPage(pvBeansList.get(pvBeansList.size() - 1).getRequest());visitBean.setOutTime(pvBeansList.get(pvBeansList.size() - 1).getTimestr());// visit访问的页面数visitBean.setPageVisits(pvBeansList.size());// 来访者的ipvisitBean.setRemote_addr(pvBeansList.get(0).getRemote_addr());// 本次visit的referalvisitBean.setReferal(pvBeansList.get(0).getReferal());visitBean.setSession(session.toString());context.write(NullWritable.get(), visitBean);}}public static void main(String[] args) throws Exception {ToolRunner.run(new Configuration(),new ClickStreamVisit(),args);}}

得到的数据
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_823753.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop离线_网站流量日志数据分析系统_数据入库

数据入库ETL1.数据仓库设计2.本项目中数据仓库的设计3.创建 ODS 层数据表4.导入 ODS 层数据5.生成 ODS 层明细宽表1.数据仓库设计 1.1维度建模概述 维度建模 (dimensional modeling) 是专门用于分析型数据库、数据仓库、数据集市建模&#xff08;数据集市可以理解为是一种&quo…

如何在网页上显示其他网站的数据_如何从亚马逊抓取产品数据?

“为什么我们需要抓取亚马逊的数据&#xff1f;”&#xff0c;也许这是您可能会问的第一个问题。亚马逊是美国最大的电子商务公司&#xff0c;拥有世界上种类最多的产品。将产品数据抓取下来有很多有价值的用途。以下是为您列举的一些企业利用产品数据的好处&#xff1a;与竞争…

flash按钮点击无反应_久等了!赫鲸建站更炫的按钮样式及功能来了

听说有小伙伴想要更炫酷的网站展示效果&#xff1f;赶快来试试新的带悬停动效的按钮样式吧&#xff01;下滑解锁更多功能更新咨询哦~按钮模块更新样式与功能使用场景电脑网站&#xff1b;按钮模块功能说明1. 新增多种带悬停动效按钮样式&#xff0c;让按钮更具吸引力。2. 支持更…

好用的图片压缩网站

1、https://tinypng.com/ 完全免费 - - || 压缩图片 PNG、JPG 推荐指数 ★★★★ 可批量操作&#xff0c;单次最多支持20张图片。 ​ 2、https://www.imagerecycle.com/ 完全免费 - - || 压缩PNG、JPG、GIF、PDF 推荐指数 ★★★★ 支持网站文件资源url直接压缩&…

医药工业相关网站

医药工业相关网站 中国医药工业信息中心网 中国医药工业信息中心 江苏恒瑞 恒瑞医药 正大天晴 正大天晴药业集团股份有限公司_正大天晴药业集团股份有限公司 豪森药业 抗肿瘤,精神类药物_江苏豪森药业集团有限公司 江苏康缘 康缘集团_江苏康缘集团有限责任公司_康缘集…

chrome header 获取_使用Chrome插件来补充一些写作网站没有Markdown的坑

场景技术者写文章&#xff0c;基本少不了Markdown了&#xff0c;但是很多自媒体平台(大而全那种)&#xff0c;往往都是坑爹的富文本编辑器(还很多是魔改UEditor&#xff0c;人家官方三年没更新了喂)。小白学逻辑&#xff0c;内行看门道。类似这种&#xff1a;这是很麻烦的一件事…

qq申诉网站无法接到服务器,为什么我qq申诉不成功 - 卡饭网

qq申诉成功后怎么办qq申诉成功后怎么办 qq申诉成功后怎么办 1.在QQ申诉中,我们采用的方法有两种,一种是邮箱,一种是手机.邮箱申诉方式就会有一个链接发到你的邮箱,你进去点击打开就行.这里主要是讲手机接收的方式进行申诉,申诉成功后会收到下面的短信; 2.打开短信中的网址,输…

护卫神异地备份系统怎么传服务器,护卫神异地备份系统(网站异地备份工具)V2.8.2 官方版...

护卫神异地备份系统(网站异地备份工具)是一款非常优秀好用的专业网站异地备份软件。护卫神异地备份系统功能全面&#xff0c;操作简单&#xff0c;支持上传和下载模式&#xff0c;可以全自动备份重要数据&#xff0c;让网站数据更安全。可以实时或者定时帮助用户把数据传到远程…

中小公司网站架构

基于阿里云平台&#xff0c;部署中小型网站架构&#xff0c;如下图 转载于:https://www.cnblogs.com/xuegqcto/p/7519859.html

rfq在计算机那种代表什么,阿里网站专业术语中rfq是什么意思

阿里国际站rfq是客户主动发布的采购需求。买家主动发布采购需求&#xff0c;供应商自主选择挑选合适的买家进行报价。随着平台规则更新&#xff0c;以及平台对于RFQ这一块资源的重视度越来高&#xff0c;RFQ的使用不仅影响平台的RFQ资源的奖励额度&#xff0c;同时直接影响到店…

销售易 服务器错误的是什么,急,打开“深圳市市场监督管理局网站”出现服务器错误,请问是我电脑问题还是该网站问题,如何解决?谢谢...

急&#xff0c;打开“深圳市市场监督管理局网站”出现服务器错误&#xff0c;请问是我电脑问题还是该网站问题&#xff0c;如何解决&#xff1f;谢谢0zhuwq8862014.06.04浏览147次分享举报“/OutSide.WebUI”应用程序中的服务器错误。 ---------------------------------------…

squid正反向代理-加快网站访问速度

配置squid代理服务器加快网站访问速度 一&#xff1a;squid服务概述 Squid cache&#xff08;简称为Squid&#xff09;是一个流行的自由软件&#xff08;GNU通用公共许可证&#xff09;的代理服务器和Web缓存服务器。Squid有广泛的用途&#xff0c;从作为网页服务器的前置cache…

JavaScript练习网站收集

在学习的过程中会发现很多知识点如果不在工作中运用或者手写带验证的话&#xff0c;很容易忘记。任何技能的掌握都是需要不断练习的。在此收集一些自己遇到的JavaScript练习的网站。 codewars 国外的一个练习网站&#xff0c;有JavaScript&#xff0c;也有Python&#xff0c;每…

更改浏览器网站图标与标头(普通网站和el-admin)

还记得第一次更改图标和标头&#xff0c;还是学习htmlcss写作品&#xff08;静态网页&#xff09;的时候。 1.简单静态网页 只需要一个title标签和link引入。 注意&#xff1a;这种引入图标的写法&#xff0c;仅对当前页面生效 2.el-admin修改 先找到public文件夹下的inde…

常见负面SEO方法,你应该知道的事?

由于百度算法的不断调整&#xff0c;并且开始严厉打击作弊行为&#xff0c;一些搜索引擎优化公司面临竞争对手的压力&#xff0c;经常采用一些不正当的手法。 入侵竞争对手的网站&#xff0c;并采用一些非常规的手段&#xff0c;使得让你的网站看起来&#xff0c;变的有一些不一…

第32篇 网站试题生成word下载时bug解决

问题描述&#xff1a;英语科下载word时&#xff0c;选的题型有&#xff1a;完形填空和词汇运用两种&#xff0c;但下载出来题的序号排序混乱。 1 完形填空序号混乱解决 网站上生成的如下&#xff1a; 而我生成的word如下&#xff1a; 原因在于&#xff1a;正则表达式出了问题…

(转)3个常用基于Linux系统命令行WEB网站浏览工具(w3m/Links/Lynx)

一般我们常用的浏览器肯定是基于可视化界面的图文结合的浏览界面效果&#xff0c;比如FireFox、Chrome、Opera等等&#xff0c;但是有些时候折腾和项目 的需要&#xff0c;在Linux环境中需要查看某个页面的文字字符&#xff0c;我们需要简单的浏览网页页面&#xff0c;但是也不…

Docker启动nginx容器--搭建网站

1.下载nginx镜像 docker pull nginx 2.启动nginx镜像 docker run -d --name nginx01 -p 80:80 -v /data/nginx/www:/usr/share/nginx/html -v /data/nginx/log:/var/log/nginx nginx -d 后台运行方式-name 给容器起别名-p 宿主机和容器端口映射 3.进入到容器中 docker e…

K8S集群使用Ingress实现网站入口动静分离实践

今年3月份在公司的内部k8s培训会上&#xff0c;和研发同事详细探讨了应用部署容器化部署的几个问题&#xff0c;问题简要如下&#xff1a; 1、java应用容器化部署首先通过自动化部署工具编译出全量的war包&#xff0c;将war包直接编译到docker镜像后推送到私用仓库并版本化控制…

网站多次切换服务器ip,站群多ip服务器怎么切换ip?

租多ip服务器的主要目的是&#xff0c;有时候用服务器采集别处的内容被封了IP&#xff0c;我们就经常碰到。这时候我们就要换服务器主IP才可以继续采集&#xff0c;下面跟大家讲下多ip服务器怎么切换ip的方法&#xff0c;这个方法只对多IP的服务器有效&#xff0c;只有一个IP的…