利用微信搜索抓取公众号文章(转载)

来源:http://www.shareditor.com/blogshow/44


自动收集我关注的微信公众号文章


 

2016.7.14 更新

搜狐微信增加对referer验证

 

var page = require('webpage').create();page.customHeaders={"referer":"http://weixin.sogou.com/weixin?oq=&query=关键词"
}

 


 

 

我的微信里关注了数十个有关大数据的公众号,每天都会出现那个小红点让我点进去看,但是点多了就会觉得烦了,所以我要做的第一步就是自动把公众号里的新文章都收集到一块,怎么做呢?scrapy!

对!scrapy抓取!但是scrapy顺着超链接抓取web网页容易,抓取微信app里的内容就有难度了,暂时还是做不到模拟一个收集app软件。庆幸的是,腾讯和搜狗搜索结婚啦!生出了一个小宝宝:搜狗微信搜索。下面我们就借助搜狗微信搜索来实现我的目的

举个例子,我关注了一个公众号叫:大数据文摘。打开http://weixin.sogou.com/,输入“大数据文摘”,点“搜公众号”,搜索结果如下:

点击这个搜索结果,跳到了新页面

这里面显示的都是最新发布的文章

好!我们就沿着这条路线来追踪公众号的新文章

下面我们来分析一下url

第一个搜索结果页的url是:http://weixin.sogou.com/weixin?type=1&query=%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%96%87%E6%91%98&ie=utf8&_sug_=n&_sug_type_=,我们去掉query以外的参数得到:http://weixin.sogou.com/weixin?query=%E5%A4%A7%E6%95%B0%E6%8D%AE%E6%96%87%E6%91%98,打开之后结果是一样的,ok,这个就作为我们抓取的种子入口,如果搜索其他公众号就把query参数换掉

下面分析搜索结果里怎么提取第二章页面,也就是公众号profile页的链接,我们看下搜索结果页的部分html如下:

<div target="_blank" href="http://mp.weixin.qq.com/profile?src=3&amp;timestamp=1463443372&amp;ver=1&amp;signature=lNY-ZbjfPHr40G-zyUe*Sdc9HIn2IisEo0vwpKEAV*Z*ALBYuYf2HaMUtEP*15rQzs47zSEiORN3BOWPNA2R*A==" class="wx-rb bg-blue wx-rb_v1 _item" uigs_exp_id="" onclick="gotourl('http://mp.weixin.qq.com/profile?src=3&amp;timestamp=1463443372&amp;ver=1&amp;signature=lNY-ZbjfPHr40G-zyUe*Sdc9HIn2IisEo0vwpKEAV*Z*ALBYuYf2HaMUtEP*15rQzs47zSEiORN3BOWPNA2R*A==',event,this);return true;" id="sogou_vr_11002301_box_0" uigs="sogou_vr_11002301_box_0"> <div class="img-box"> <span class="ico-bg"></span><span class="ico-r"></span><img style="visibility: visible; height: 57px; margin-left: 0px;" src="http://img01.sogoucdn.com/app/a/100520090/oIWsFt58NVJTkYWvPtICKgg8ka60" onload="vrImgLoad(this, 'fit', 57, 57)" onerror="vrImgErr(this, '/wechat/images/account/def56-56.png')" extra="err:'http://img01.sogoucdn.com/net/a/04/link?appid=100520078&amp;url=http://wx.qlogo.cn/mmhead/Q3auHgzwzM46WJlQ8GYRWPhThl25rSKJEYBm408fnEkYS9DUkiaSxGg/0/0'"></div> <div class="txt-box"> <h3><em><!--red_beg-->大数据文摘<!--red_end--></em></h3> <h4> <span>微信号:<label name="em_weixinhao">BigDataDigest</label></span> </h4> <p class="s-p3"> <span class="sp-tit">功能介绍:</span><span class="sp-txt">普及<em><!--red_beg-->数据<!--red_end--></em>思维,传播<em><!--red_beg-->数据<!--red_end--></em>文化</span> </p> <p class="s-p3"> <span class="sp-tit"><script>authnamewrite('2')</script>微信认证:</span><span class="sp-txt">深圳大数据文摘科技有限公司</span> </p> <p class="s-p3"> <span class="sp-tit">最近文章:</span><span class="sp-txt"><a class="blue" target="_blank" id="sogou_vr_11002301_link_first_0" href="http://mp.weixin.qq.com/s?src=3&amp;timestamp=1463443372&amp;ver=1&amp;signature=fZ5HsUYiytbTgb8SekmcI3g9oizZncGBgdipWihPFh2pPnAwAwO62nX9iXNILZx0XtQB3R*3PWcgqPh1YWL*LX3qxIOf0ZpkKyhZSUkAgPmH*w71dqIB2*wfNTpVDZx5G3nh31tctf*lNqXlfXzgfPO6E60vqoqB694bPMymy*I=" title="二项式与小苹果——看牛顿如何将灵感火花拓展成知识体系">二项式与小苹果——看牛顿如何将灵感火花拓展成知识体系</a><span class="hui"><script>vrTimeHandle552write('1463440604')</script>46分钟前</span></span> </p> ……

看这里关键的href一行:

<div target="_blank" href="http://mp.weixin.qq.com/profile?src=3&amp;timestamp=1463443372&amp;ver=1&amp;signature=lNY-ZbjfPHr40G-zyUe*Sdc9HIn2IisEo0vwpKEAV*Z*ALBYuYf2HaMUtEP*15rQzs47zSEiORN3BOWPNA2R*A==" class="wx-rb bg-blue wx-rb_v1 _item" uigs_exp_id="" onclick="gotourl('http://mp.weixin.qq.com/profile?src=3&amp;timestamp=1463443372&amp;ver=1&amp;signature=lNY-ZbjfPHr40G-zyUe*Sdc9HIn2IisEo0vwpKEAV*Z*ALBYuYf2HaMUtEP*15rQzs47zSEiORN3BOWPNA2R*A==',event,this);return true;" id="sogou_vr_11002301_box_0" uigs="sogou_vr_11002301_box_0">

这就是我们要提取的profile页链接,提取方式可以直接通配成:“url里带http://mp.weixin.qq.com/profile?src=的href属性”

 

ps:找xpath的方便方法是利用浏览器的开发者工具,比如chrome界面如下:

在Elements的标签处点右键选择:Copy->Copy XPath,就自动把xpath路径拷贝到剪切板了

 

注意:在这里我突然想到一个问题,每个公众号对应的profile页面是不是永远不变的呢?经过我的实验,这条url里的timestamp参数和signature是有对应关系的,任意一个错了都无法打开,而且每次搜索生成的链接都是不同的,所以我断定在微信搜索内容是动态生成链接的,那么这个动态链接的生命周期就不可预测了,所以为了保险起见,我们每次都从搜索入口追溯,才是万全之策

下面我们分析profile页里的文章链接,我们看profile页的部分 html如下:

<h4 class="weui_media_title" hrefs="/s?timestamp=1463443165&amp;src=3&amp;ver=1&amp;signature=dZCo9et5C6nyZfVAQAl416OW-eXJbi0VaS0QPQdvEv1tawqgsjlVYUd0oav0tUHAf38HOGU3Lskd7qqXbFg9D2mP8cv36CZ1dW0bGxbP4YyJcRdy*M*Mow6xD5YWDK8-82r9MX*4WqgbGqo4FAhZeiGTEl27YhIbaIxPiQgMbxc=">代理银行业务:通过监管列表对代理银行客户进行风险评级</h4> <p class="weui_media_desc">为了确保银行积极的通过代理银行关系来连接美国金融市场,需要考虑如何根据现有电汇和监管列表信息,来提升可疑行为模型的成熟度。</p> <p class="weui_media_extra_info">2016年5月17日</p>

这里面可以找到文章的内容了链接、标题、摘要、发布时间,简直太完美了

链接的提取方式可以直接通配成:h4.weui_media_title hrefs

标题的提取方式可以直接通配成:h4.weui_media_title text

摘要的提取方式可以直接通配成:p.weui_media_desc

发布时间的提取方式可以直接通配成:p.weui_media_extra_info

 

开发我的scrapy爬虫

 

如果还没有安装scrapy,请见《教你成为全栈工程师(Full Stack Developer) 三十-十分钟掌握最强大的python爬虫》

创建一个scrapy工程

scrapy startproject weixin

在weixin/spiders/中创建dashujuwenzhai.py内容如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import scrapyclass ShareditorSpider(scrapy.Spider):name = "dashujuwenzhai"allowed_domains = ["qq.com"]start_urls = ["http://weixin.sogou.com/weixin?query=大数据文摘"]def parse(self, response):print response.bodyhref = response.selector.xpath('//div[@id="sogou_vr_11002301_box_0"]/@href').extract()[0]yield scrapy.Request(href, callback=self.parse_profile)def parse_profile(self, response):print response.body

执行

scrapy crawl dashujuwenzhai

即可以抓到大数据文摘的profile页面内容

请尊重原创,转载请注明来源网站www.shareditor.com以及原始链接地址

接下来来研究profile页,抓回的页面不是普通的html页面,而是通过js渲染出来的,也就是我们看到的每一条文章的标题、摘要等都是通过js计算出来的,代码里有这么一句:

var msgList = '{&quot;list&quot;:[{&quot;comm_msg_info&quot;:{&quot;id&quot;:410106318,&quot;type&quot;:49,&quot;datetime&quot;:1463528503,&quot;fakeid&quot;:&quot;2391437564&quot;,&quot;status&quot;:2,&quot;content&quot;:&quot;&quot;},&quot;app_msg_ext_info&quot;:{&quot;title&quot;:&quot;机器人前传:达芬奇的机器狮和日耳曼装甲骑士&quot;,&quot;digest&quot;:&quot;这是一篇描述阿尔法狗和Atlas机器人祖先的文章。远在500多年前的达芬奇时代,已经有了不少关于机器人的探索。这个大天才写了大量关于自动机描述,在他的个人笔记中也充斥着各种机械发明的构思,比如弹簧驱动的汽车和机器狮子。&quot;,&quot;content&quot;:&quot;&quot;,&quot;fileid&quot;:504157567,&quot;content_url&quot;:&quot;\\/s?timestamp=1463529354&amp;amp;src=3&amp;amp;ver=1&amp;amp;signature=cG*R8qc-PGKV-aZ4q9IlJQfIHtGp5I3H63xlK-h5mBO0W2FRAzCddav9cPf*GuwUBI4x0zJzmtcoOU7sQQeMf3CfNzaTEIq4C8YwnsZQGnqnauqr2wQYvEFvAooyecPF3H6bg8OiqpSZsd5LnY*fVrZOMINmQwV8Qup*D9qvUkw=&quot;,&quot;source_url&quot;:&quot;https:\\/\\/mp.weixin.qq.com\\/s?__biz=MzA4OTYwNzk0NA==&amp;amp;mid=401744027&amp;amp;idx=1&amp;amp;sn=43699667dca4438a49db51fb3700af4f&amp;amp;scene=1&amp;amp;srcid=0517MRoAk1EzgC5iSMtvoYC5&amp;amp;pass_ticket=06ybKvJknob%2F5%2B%2FAmkUtnjcyCqWcuNxZTJapLW5QZyk7PWh1jD7ubwb5H1zXzMWB#rd&quot;,&quot;cover&quot;:&quot;http:\\/\\/mmbiz.qpic.cn\\/mmbiz\\/wc7YNPm3YxXiajPXq2Y2PWQsic1SmjCxnTicHKtwItmARwkha1RI1gH1WwTfRvEUzauWJibjuJC9oJ8eibeVlDjRkwg\\/0?wx_fmt=jpeg&quot;,&quot;subtype&quot;:0,&quot;is_multi&quot;:1,&quot;multi_app_msg_item_list&quot;:[{&quot;title&quot;:&quot;清华论坛实录|刘瑞宝:洞见数据内涵,提升公共安全研判能力&quot;,&quot;digest&quot;:&quot;本文为刘瑞宝先生于2016年3月24日在RONG—大数据与公共安全专场上所做的题为《洞见数据内涵,提升公共安全研判能力》的演讲实录。&quot;,&quot;content&quot;:&quot;&quot;,&quot;fileid&quot;:504157565,&quot;content_url&quot;:&quot;\\/s?timestamp=1463529354&amp;amp;src=3&amp;amp;ver=1&amp;amp;signature=cG*R8qc-PGKV-aZ4q9IlJQfIHtGp5I3H63xlK-h5mBO0W2FRAzCddav9cPf*GuwUBI4x0zJzmtcoOU7sQQeMf3CfNzaTEIq4C8YwnsZQGnrmdiX-aBZzJtqDGa76CoHH8gL7PEfN3ZQN5lNa4YgJUeUyE*SIna3B7W*zKWYskkU=&quot;,&quot;source_url&quot;:&quot;https:\\/\\/mp.weixin.qq.com\\/s?__biz=MzAxMzA2MDYxMw==&amp;amp;mid=2651555964&amp;amp;idx=2&amp;amp;sn=479aaf7f3b687b973ffa303d3d3be6b9&amp;amp;scene=1&amp;amp;srcid=0517C5DgLArlrdVAlQ9GIHOl&amp;amp;pass_ticket=06ybKvJknob%2F5%2B
……

当然还没有截取全,这就是文章的全部内容,写到了一个js变量里,这样就无法通过scrapy原生的response.xpath拿到,这怎么办呢?

我们来利用phantomjs来渲染,这是一个强大的工具,它是无界面的浏览器,所以渲染js速度非常快,但是也有一些缺陷,有一些浏览器渲染功能不支持,所以如果再深入可以借助selenium工具,这又是一个强大的工具,它原本是用来做web应用程序自动化测试用的,也就是可以模拟各种点击浏览等动作,那么用他来做爬虫几乎就是一个真人,本节先来研究phantomjs,有关selenium的内容后面有需求了再研究

 

安装phantomjs

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cd phantomjs-2.1.1-linux-x86_64/
./bin/phantomjs examples/netlog.js http://www.shareditor.com/

以上输出了网路通信日志,说明没有问题

 

为了方便,可以把./bin/phantomjs拷贝到~/bin下

 

写一个phantomjs渲染脚本

var page = require('webpage').create();
var system = require('system');
page.open(system.args[1], function(status) {var sc = page.evaluate(function() {return document.body.innerHTML;});window.setTimeout(function() {console.log(sc);phantom.exit();}, 100);
});

创建phantomjs渲染脚本getBody.js内容如下:

 

执行

phantomjs getBody.js 'http://mp.weixin.qq.com/profile?src=3&timestamp=1463529344&ver=1&signature=lNY-ZbjfPHr40G-zyUe*Sdc9HIn2IisEo0vwpKEAV*Z*ALBYuYf2HaMUtEP*15rQ7TpyhXFL52e8W929D4nd2g==' > profile.html

这里的链接可能已经失效,请换成在搜狗微信搜索搜到某个公众号profile页面里的某一篇文章的url

打开profile.html会发现内容已经被渲染完成了,每篇文章的地方变成了:

<div id="WXAPPMSG410106318" class="weui_media_box appmsg" msgid="410106318"><span class="weui_media_hd" style="background-image:url(http://mmbiz.qpic.cn/mmbiz/wc7YNPm3YxXiajPXq2Y2PWQsic1SmjCxnTicHKtwItmARwkha1RI1gH1WwTfRvEUzauWJibjuJC9oJ8eibeVlDjRkwg/0?wx_fmt=jpeg)" data-s="640" data-t="1463528503000" hrefs="/s?timestamp<div class="weui_media_bd"><h4 class="weui_media_title" hrefs="/s?timestamp=1463531541&amp;src=3&amp;ver=1&amp;signature=n187YKNZjqgxyUtJ*yFEQGG7wJOH79RQeRrjQ0RGRdKEiZmR6iM0oNE5P0DPbQEwWTnShlZ4C3JIZr9PYThxbnhuCPl2UTc5NGE0ZkARKXEhTqCe7QvAGFf8vy2QWnPKqA9iSBBgBrocHKLBAuTM机器人前传:达芬奇的机器狮和日耳曼装甲骑士</h4><p class="weui_media_desc">这是一篇描述阿尔法狗和Atlas机器人祖先的文章。远在500多年前的达芬奇时代,已经有了不少关于机器人的探索。这个大天才写了大量关于自动机描述,在他的个人笔记中也充斥着各种机械发明的构思,比如弹簧驱动的汽车和机器狮子。</p><p class="weui_media_extra_info">2016年5月18日</p></div></div> ​

这便可以通过scrapy的request.xpath提取了

 

重新完善我们的scrapy爬虫脚本

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import scrapy
import subprocess
from scrapy.http import HtmlResponse
from scrapy.selector import Selectorclass ShareditorSpider(scrapy.Spider):name = "dashujuwenzhai"allowed_domains = ["qq.com"]start_urls = ["http://weixin.sogou.com/weixin?query=算法与数学之美"]def parse(self, response):href = response.selector.xpath('//div[@id="sogou_vr_11002301_box_0"]/@href').extract()[0]cmd="~/bin/phantomjs ./getBody.js '%s'" % hrefstdout, stderr = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()response = HtmlResponse(url=href, body=stdout)for selector in Selector(response=response).xpath('//*[@id="history"]/div/div/div/div'):hrefs= selector.xpath('h4/@hrefs').extract()[0].strip()title = selector.xpath('h4/text()').extract()[0].strip()abstract = selector.xpath('//*[contains(@class, "weui_media_desc")]/text()').extract()[0].strip()pubtime = selector.xpath('//*[contains(@class, "weui_media_extra_info")]/text()').extract()[0].strip()print hrefsprint titleprint abstractprint pubtimedef parse_profile(self, response):print response.body

这是一段我用了数天精力创造成功的一段代码,耗费了我很多体力值,所以重点讲解一下

href = response.selector.xpath('//div[@id="sogou_vr_11002301_box_0"]/@href').extract()[0]

从公众号搜索结果页里提取profile页面的链接,这个id我怀疑不久后将失效,所以如果想做完美,还得不断完善,有关xpath的使用技巧可以参考http://ejohn.org/blog/xpath-css-selectors/

cmd="~/bin/phantomjs ./getBody.js '%s'" % href
stdout, stderr = subprocess.Popen(cmd, shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()

加载phantomjs脚本getBody.js来渲染profile页面,把里面的js渲染成html

response = HtmlResponse(url=href, body=stdout)

用渲染后的html页面来创建一个HtmlResponse,用于 后面继续xpath提信息

Selector(response=response).xpath('//*[@id="history"]/div/div/div/div')

找到每一条文章模块所在的div

hrefs= selector.xpath('//h4/@hrefs').extract()[0].strip()
title = selector.xpath('h4/text()').extract()[0].strip()
abstract = selector.xpath('//*[contains(@class, "weui_media_desc")]/text()').extract()[0].strip()
pubtime = selector.xpath('//*[contains(@class, "weui_media_extra_info")]/text()').extract()[0].strip()

根据这个div结构提取各个字段

 

基于这个爬虫脚本,想造就怎样的神奇,就看你之后的想象力了,没有做不到,只有想不到!

 


 

 

Python处理HTML转义字符

html = '&lt;abc&gt;'

用Python可以这样处理:

import HTMLParser
html_parser = HTMLParser.HTMLParser()
txt = html_parser.unescape(html) #这样就得到了txt = '<abc>'

 

如果还想转回去,可以这样:

 

import cgi
html = cgi.escape(txt) # 这样又回到了 html = '&lt;abc&gt'

 

python对json的相关操作

使用简单的json.dumps方法对简单数据类型进行编码,例如:

import jsonobj = [[1,2,3],123,123.123,'abc',{'key1':(1,2,3),'key2':(4,5,6)}]
encodedjson = json.dumps(obj)
print repr(obj)
print encodedjson

输出:

[[1, 2, 3], 123, 123.123, 'abc', {'key2': (4, 5, 6), 'key1': (1, 2, 3)}] 

[[1, 2, 3], 123, 123.123, "abc", {"key2": [4, 5, 6], "key1": [1, 2, 3]}]

 

从json到python的类型转化对照如下:

decodejson = json.loads(encodedjson)
print type(decodejson)
print decodejson[4]['key1']
print decodejson

输出:

<type 'list'> 
[1, 2, 3]

[[1, 2, 3], 123, 123.123, u'abc', {u'key2': [4, 5, 6], u'key1': [1, 2, 3]}]

 

参考:

 

http://www.cnblogs.com/coser/archive/2011/12/14/2287739.html

 

转载于:https://www.cnblogs.com/tatamizzz/p/5588087.html

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

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

相关文章

二、PHP基础——连接msql数据库进行增删改查操作 实战:新闻管理项目

Mysql扩展 PHP针对MySQL数据库操作提供的扩展&#xff1a;允许PHP当做MySQL的一个客户端连接服务器进行操作。 连库基本操作 连接数据库服务器 1&#xff09;资源 mysql_connect(服务器地址&#xff0c;用户名&#xff0c;密码) 连接资源默认也是超全局的&#xff0c;任何地方都…

深度学习基础-2

文章目录0 前言1 全连接神经网络2 激活函数2.1 Sigmoid2.2 Tanh2.3 ReLU2.4 Leaky ReLU3 交叉熵损失4 计算图与反向传播4.1 计算图4.2 梯度消失与梯度爆炸4.3 动量法5 权重初始化5.1 全零初始化5.2 标准随机初始化5.3 Xavier初始化5.4 Kaming初始化6 批归一化7 参考资料0 前言 …

三、PHP基础——HTTP协议 文件编程

一、HTTP协议初步认识 HTTP协议概念 HTTP协议&#xff0c;即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW World Wide Web)服务器之间互相通信的规则&#xff0c;通过因特网传送万维网文档的数据传送协议。 HTTP协议是用于从WWW服务器传…

四、PHP基础——会话技术Cookie 和 Session

会话技术初步认识 会话技术介绍 web会话可简单理解为&#xff1a;用户开一个浏览器&#xff0c;访问某一个web站点&#xff0c;在这个站点点击多个超链接&#xff0c;访问服务器多个web资源&#xff0c;然后关闭浏览器&#xff0c;整个过程称之为一个会话。 HTTP协议的特点是…

python三级菜单设计题目_Python三级菜单

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 三级菜单:打印省、市、县三级菜单。 可返回上一级&#xff0c;可随时退出程序首先准备基础数据zone{山东:{青…

c#复习-2

输入三个学生的信息学号、姓名、分数从大到小排序 1 using System;2 using System.Collections;3 using System.Collections.Generic;4 using System.Linq;5 using System.Text;6 7 namespace 复习CS8 {9 class Program 10 { 11 struct Student 12 { 1…

long类型python_Python类型long vs C'long long'

I would like to represent a value as a 64bit signed long, such that values larger than (2**63)-1 are represented as negative, however Python long has infinite precision. Is there a quick way for me to achieve this? 解决方案>>> from ctypes import …

Vue中富文本编辑器的使用

基于 Vue 的富文本编辑器有很多&#xff0c;例如官方就收录推荐了一些&#xff1a; https://github.com/vuejs/awesome-vue#rich-text-editing 。 这里我们以 element-tiptap 为例。 GitHub 仓库&#xff1a;https://github.com/Leecason/element-tiptap 在线示例&#xff1a…

Vue项目中使用Echarts(一)

Echarts官方文档 1. 安装Echarts 在cmd命令行输入: npm install echarts --save 2. 代码中使用 注意&#xff1a;import 引入echarts 包时&#xff0c;不要使用 import echarts from ‘echarts’ 而要使用import * as echarts from echarts 否则会报错如下&#xff1a; 3. 页…

Google Guava缓存实现接口的限流

一.项目背景 最近项目中需要进行接口保护&#xff0c;防止高并发的情况把系统搞崩&#xff0c;因此需要对一个查询接口进行限流&#xff0c;主要的目的就是限制单位时间内请求此查询的次数&#xff0c;例如1000次&#xff0c;来保护接口。 参考了 开涛的博客聊聊高并发系统限流…

javaweb 常用jar包_使用javaweb写一个登录案例

下载地址&#xff1a;https://gitee.com/dl_shrimp/java_web_login_case.githttps://www.zhihu.com/video/1241780888599699456讲一下如何使用javaweb写一个登录案例Dao就是用来操作数据库的一些类的统称&#xff08;1&#xff09;DAO是Data Access Object数据访问接口。数据访…

Vue项目中使用图片裁切器 cropperjs (头像裁切)

cropperjs官方文档 cropperjs结合element-ui 组件后的显示效果: 1. npm 安装 cropperjs cmd命令行输入&#xff1a;npm install cropperjs --save 2. 导入相关js和css文件 import cropperjs/dist/cropper.css import Cropper from cropperjs3. 用块元素&#xff08;容器&…

跳一跳python源码下载_python 微信跳一跳和源码解读

刚好周末&#xff0c;想研究一下前阵子很火的微信跳一跳 下面进入正文。 本文适用对象为WIN10系统&#xff0c;安卓用户。目的在于让丝毫没有接触过Python的小伙伴都能成功运行&#xff0c;如果你恰好是这样的对象&#xff0c;那么跟着我开始操作。我会把我自己的每一步都写下来…

HTML文件上传对象file

window.URL.createObjectURL(fileObj)

Vue项目中使用Echarts(二)

1. 安装&#xff1a; 通过 npm 获取 echarts&#xff0c;npm install echarts --save 2. 最终页面展示效果如下&#xff1a; 三、代码实现 map-demo.vue: <template><!-- 1. 为 ECharts 准备一个具备大小&#xff08;宽高&#xff09;的 DOM --><div ref&quo…

Vue项目中使用百度地图API

百度地图官方文档 1. 申请百度账号和ak 申请 2. 引用百度地图API文件 <script type"text/javascript" src"https://api.map.baidu.com/api?v1.0&&typewebgl&ak您的密钥">3. 设置容器样式 设置容器样式大小 4. 创建地图容器元素 …

8.0/9.0 Email 设置

Email 设置一直都是Odoo的一个坑&#xff0c;巨坑。 先讲结论&#xff0c;发邮件可以用&#xff0c;收还是算了吧 1. 发邮件设置 发的设置相对简单&#xff0c;如果企业邮箱支持catcll all功能&#xff0c;基本不用改动可以直接用&#xff0c;否则需要安装第三方模块&#xff0…

Vue v-model 指令详解以及sync修饰符的使用场景(结合父子组件通信案例)

参考Vue官方文档 一、需求如下&#xff1a; 二、代码如下 三、分步解析&#xff1a; 父组件给子组件传值&#xff1a; 子组件给父组件传值&#xff1a; 四、sync修饰符的使用 vue.js官方文档 如果已经使用了v-model双向绑定了一个数据&#xff0c;但是还想要实现另一个数…

stm32F1使用SD卡实现IAP

最近在做一个项目&#xff0c;想使用uSD卡来实现在应用编程&#xff0c;首先需要一些知识 我所使用的单片机是STM32F103ZE&#xff0c;内部flash&#xff0c;超始地址为0x8000000&#xff0c;大小为0x80000&#xff08;0x80000/1024也就是512kByte&#xff09;要实现IAP&#x…

父组件访问子组件中的数据(父子组件通信案例:父组件访问子组件$refs[‘子组件‘],子组件传递数据给父组件(父组件中使用v-model))

一、需求 二、在父组件upload-cover中&#xff1a; 通过$refs[子组件的ref属性值]就能拿到子组件对象 三、在子组件imgae-list&#xff08;相对于父组件upload-cover来说&#xff0c;image-list组件是子组件&#xff09;中 通过在data中定义一个selected&#xff0c;来保存…