《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

news2024/11/26 9:34:16

0. 请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!

上节课我们说过了,有一些网站比较痛恨爬虫程序,它们不喜欢被程序所访问,所以它们会检查链接的来源,如果说来源不是正常的途径,那么它就会把你给屏蔽掉,所以呢,要让我们的程序可以持续的干活,要可以投入生产,我们就需要对代码进行隐藏,让它看起来更像是普通人浏览器的正常点击。

我们知道,服务器检查链接是通过检查 链接中的 Headers 中的 User Agent 来判断你是来自于代码还是来自于浏览器,像我们的Python,你用Python默认的Headers 中的 User Agent 是Python 加上版本号,服务器一检查是Python,就会把你屏蔽掉。我们可以修改 Headers 来模拟正常的浏览器访问。

先看一下文档:

urllib.request.Request 有一个 headers 的参数,通过修改 headers 参数,你可以设置自己的 headers,这个参数是一个字典,你可以通过两种途径来设置:一种是你直接设置一个字典,然后作为参数传给 Request,或者第二种,在Request 生成之后,调用 add_header() 将其加进去。我们使用上节课的例子来尝试一下:

第一种 代码清单:

 
  1. #translation.py

  2. import urllib.request

  3. import urllib.parse

  4. import json

  5. print("---------这是一个Python翻译器---------")

  6. content = input('请输入需要翻译的内容:')

  7. url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

  8. #直接从审查元素中copy过来的url会报错,必须把translate_o中的_o 删除才可以

  9. #url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

  10. head = {}

  11. head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

  12. data = {} #这里就是把 Form Data 中的内容贴过来

  13. data['i'] = content

  14. data['from'] = 'AUTO'

  15. data['to'] = 'AUTO'

  16. data['smartresult'] = 'dict'

  17. data['client'] = 'fanyideskweb'

  18. data['salt'] = '15445124815349'

  19. data['sign'] = 'a824eba4c23c6f541ffadfee26b1e500'

  20. data['ts'] = '1544512481534'

  21. data['bv'] = 'bbb3ed55971873051bc2ff740579bb49'

  22. data['doctype'] = 'json'

  23. data['version'] = '2.1'

  24. data['keyfrom'] = 'fanyi.web'

  25. data['action'] = 'FY_BY_REALTIME'

  26. data['typoResult'] = 'false'

  27. #需要使用urllib.parse.urlencode() 把data转换为需要的形式

  28. data = urllib.parse.urlencode(data).encode('utf-8')

  29. req = urllib.request.Request(url, data, head)

  30. response = urllib.request.urlopen(url, data)

  31. html = response.read().decode('utf-8')

  32. target = json.loads(html)

  33. print('翻译结果:%s' %(target['translateResult'][0][0]['tgt']))

第二种 代码清单:

 
  1. #translation.py

  2. import urllib.request

  3. import urllib.parse

  4. import json

  5. print("---------这是一个Python翻译器---------")

  6. content = input('请输入需要翻译的内容:')

  7. url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

  8. #直接从审查元素中copy过来的url会报错,必须把translate_o中的_o 删除才可以

  9. #url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

  10. #head = {}

  11. #head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

  12. data = {} #这里就是把 Form Data 中的内容贴过来

  13. data['i'] = content

  14. data['from'] = 'AUTO'

  15. data['to'] = 'AUTO'

  16. data['smartresult'] = 'dict'

  17. data['client'] = 'fanyideskweb'

  18. data['salt'] = '15445124815349'

  19. data['sign'] = 'a824eba4c23c6f541ffadfee26b1e500'

  20. data['ts'] = '1544512481534'

  21. data['bv'] = 'bbb3ed55971873051bc2ff740579bb49'

  22. data['doctype'] = 'json'

  23. data['version'] = '2.1'

  24. data['keyfrom'] = 'fanyi.web'

  25. data['action'] = 'FY_BY_REALTIME'

  26. data['typoResult'] = 'false'

  27. #需要使用urllib.parse.urlencode() 把data转换为需要的形式

  28. data = urllib.parse.urlencode(data).encode('utf-8')

  29. req = urllib.request.Request(url, data)

  30. req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')

  31. response = urllib.request.urlopen(url, data)

  32. html = response.read().decode('utf-8')

  33. target = json.loads(html)

  34. print('翻译结果:%s' %(target['translateResult'][0][0]['tgt']))

运行结果:

 
  1. =========== RESTART: C:\Users\XiangyangDai\Desktop\translation.py ===========

  2. ---------这是一个Python翻译器---------

  3. 请输入需要翻译的内容:爱

  4. 翻译结果:love

  5. >>> req.headers

  6. {'User-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

我们来回顾一下,修改 headers 有两个途径:

  • 通过 Request 的 headers 参数修改
  • 通过 Request.add_header() 方法修改

修改 User-Agent 可以算是最简单的隐藏方法了,也是切实可行的,不过呢,如果是用 Python 抓取网页,例如批量下载 图片,你一个 IP 地址短时间内连续的进行访问,那么这是不符合正常人类的标准的,而且对服务器带来的压力不小,所以服务器合情合理会把你屏蔽掉,屏蔽的做法也很简单,只需要记录每个IP的访问频率,在单位时间内,如果访问频率超过一个阈值,那么服务器就会认为这个IP很有可能是一个爬虫,那么服务器就会把不管它的User-Agent是什么了,服务器就会返回一个验证码的界面,因为用户会填写验证码,但是爬虫不会,这就会合理的把你的访问给屏蔽掉。

就我们目前的学习水平来说,有两种做法可以解决这种问题,一种就是延迟提交的时间,让我们的爬虫看起来更像是一个正常的人类在浏览(这是没有办法的办法);还有一种就是使用代理。

首先说第一种方法,我们可以使用 time 模块来完成延迟操作:(这种方法的工作效率太慢了

 
  1. #translation.py

  2. import urllib.request

  3. import urllib.parse

  4. import json

  5. import time

  6. print("---------这是一个Python翻译器---------")

  7. while True:

  8. content = input("请输入需要翻译的内容(输入'Q'退出程序):")

  9. if content == 'Q':

  10. break

  11. url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"

  12. #直接从审查元素中copy过来的url会报错,必须把translate_o中的_o 删除才可以

  13. #url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

  14. #head = {}

  15. #head['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

  16. data = {} #这里就是把 Form Data 中的内容贴过来

  17. data['i'] = content

  18. data['from'] = 'AUTO'

  19. data['to'] = 'AUTO'

  20. data['smartresult'] = 'dict'

  21. data['client'] = 'fanyideskweb'

  22. data['salt'] = '15445124815349'

  23. data['sign'] = 'a824eba4c23c6f541ffadfee26b1e500'

  24. data['ts'] = '1544512481534'

  25. data['bv'] = 'bbb3ed55971873051bc2ff740579bb49'

  26. data['doctype'] = 'json'

  27. data['version'] = '2.1'

  28. data['keyfrom'] = 'fanyi.web'

  29. data['action'] = 'FY_BY_REALTIME'

  30. data['typoResult'] = 'false'

  31. #需要使用urllib.parse.urlencode() 把data转换为需要的形式

  32. data = urllib.parse.urlencode(data).encode('utf-8')

  33. req = urllib.request.Request(url, data)

  34. req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')

  35. response = urllib.request.urlopen(url, data)

  36. html = response.read().decode('utf-8')

  37. target = json.loads(html)

  38. print('翻译结果:%s' %(target['translateResult'][0][0]['tgt']))

  39. time.sleep(5) #暂停5秒钟

第二个方案:使用代理

首先需要知道,代理是什么?

嘿,兄弟,哥们儿访问这个网址有点困难,帮忙解决一下呗!

然后你就把需要访问的网址告诉代理先生,代理帮你访问,然后把他看到的所有内容原封不动的转发给你。

这就是代理。

代理的工作原理就是这么简单,因此呢,服务器看到的IP地址就是代理的IP地址,而不是你的IP地址,这样子你用很多个代理同时发起访问,服务器也没有办法。使用代理的步骤如下:

  • 1.参数是一个字典 {‘类型’ :‘代理ip: 端口号’}

         proxy_support = urllib.request.ProxyHandler({})

         它这个参数就是一个字典,字典的键就是代理的类型(如:http,https...),值就是对应的 ip 或者 域名 +端口号

  • 2.定制、创建 一个 opener

(opener可以看做是私人订制,当你使用 urlopen 打开一个普通网页的时候,你就是在使用默认的 opener 来工作,而这个opener 是可以有我们定制的,例如我们可以给它加上特殊的 headers,或者指定 代理,我们使用下面的语句定制、创建一个    opener)

opener = urllib.request.build_opener(proxy_support)

  • 3a.安装opener

     我们使用 urllib.request.install_opener(opener),把它安装到系统中,这是一劳永逸的做法,因为在此之后,你只要使用普通的 urlopen() 函数,就是使用定制好的 opener 进行工作,如果你不想替换掉默认的 opener,你可以使用下面的语句调用 opener。

  • 3b.调用opener

      opener.open(url)

我们来举个例子:

我们需要代理ip,直接在网上搜索即可。

 
  1. import urllib.request

  2. url = 'http:/www.whatismyip.com.tw' #查询ip的网站

  3. proxy_support = urllib.request.ProxyHandler({'http': '123.206.56.247:80'})

  4. opener = urllib.request.build_opener(proxy_support)

  5. urllib.request.install_opener(opener)

  6. response = urllib.request.urlopen(url)

  7. html = response.read().decode('utf-8')

  8. print(html)


测试题

0. 服务器是如何识访问来自浏览器还是非浏览器的?

答:通过发送的 HTTP 头中的 User-Agent 来进行识别浏览器与非浏览器,服务器还以 User-Agent 来区分各个浏览器。

1. 明明代码跟视频中的栗子一样,一运行却出错了,但在不修改代码的情况下再次尝试运行却又变好了,这是为什么呢?

答: 在网络信息的传输中会出现偶然的“丢包”现象,有可能是你发送的请求服务器没收到,也有可能是服务器响应的信息不能完整送回来……尤其在网络阻塞的时候。所以,在设计一个“称职”的爬虫时,需要考虑到这偶尔的“丢包”现象。

2. Request 是由客户端发出还是由服务端发出?

答:我们之前说 HTTP 是基于“请求-响应”模式,Request 即请求的意思,而 Response 则是响应的意思。由客户端首先发出 Request,服务器收到后返回 Response。

3. 请问如何为一个 Request 对象动态的添加 headers?

答:add_header() 方法往 Request 对象添加 headers。

4. 简单来说,代理服务器是如何工作的?他有时为何不工作了?

答: 将信息传给代理服务器,代理服务器替你向你要访问的服务器发送请求,然后在将服务器返回的内容返回给你。

因为有“丢包”现象发生,所以多了一个中间人就意味着会多一层发生“丢包”的几率,且大多数代理并不只为一个人服务,尤其是免费代理。

PS:大家想做“坏坏”的事情时可以考虑多几层代理,一般来说路由器日志并不会保存很长时间,几层代理后,基本很难查到是谁请求的。

5. HTTP 有好几种方法(GET,POST,PUT,HEAD,DELETE,OPTIONS,CONNECT),请问你如何晓得 Python 是使用哪种方法访问服务器呢?

答:使用 get_method() 方法获取 Request 对象具体使用哪种方法访问服务器。最常用的无非就是 GET 和 POST 了,当 Request 的 data 参数被赋值的时候,get_method() 返回 'POST',否则一般情况下返回 'GET'。

6. 上一节课后题中有涉及到登陆问题,辣么,你还记得服务器是通过什么来确定你是登陆还是没登陆的么?他会持续到什么时候呢?

答: 是 cookie,服务器通过判断你提交的 cookie 来确定访问是否来自”熟人“。

简单来说 cookie 可以分成两类:

  • 一类是即时过期的 cookies,称为“会话” cookies,当浏览器关闭时(这里是 python 的请求程序)自动清除
  • 另一类是有期限的 cookies,由浏览器进行存储,并在下一次请求该网站时自动附带(如果没过期或清理的话)

动动手

小甲鱼打算在这里先给大家介绍一个压箱底的模块 —— Beautiful Soup 4

翻译过来名字有点诡异:漂亮的汤?美味的鸡汤?呃……

好吧,只要你写出一个普罗大众都喜欢的模块,你管它叫“Beautiful Shit”大家也是能接受的……

 

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。Beautiful Soup 会帮你节省数小时甚至数天的工作时间。

这玩意儿到底怎么用?

看这 -> 传送门

上边链接是官方的快速入门教程(不用惧怕,这次有中文版了),请大家花差不多半个小时的时间自学一下,然后完成下边题目。

噢,对了,大家可以使用 pip 安装(Python3.4 以上自带的神一般的软件包管理系统,有了它 Python 的模块安装、卸载全部一键搞定!)

打开命令行窗口(CMD) -> 输入 pip install BeautifulSoup4 命令) -> 搞定。

0. 编写一个爬虫,爬百度百科“网络爬虫”的词条

(链接 -> 网络爬虫_百度百科),将所有包含“view”的链接按下边格式打印出来:

提示:题目中需要使用到简单的正则表达式(在官方的快速入门教程有演示),如果你希望马上就深入学习正则表达式,当然可以给你预支一下后边的知识 -> Python3 如何优雅地使用正则表达式

代码清单:

 
  1. import urllib.request

  2. import re

  3. from bs4 import BeautifulSoup

  4. def main():

  5. url = "http://baike.baidu.com/view/284853.htm"

  6. response = urllib.request.urlopen(url)

  7. html = response.read()

  8. soup = BeautifulSoup(html, "html.parser") # 使用 Python 默认的解析器

  9. for each in soup.find_all(href=re.compile("view")):

  10. print(each.text, "->", ''.join(["http://baike.baidu.com", each["href"]]))

  11. # 上边用 join() 不用 + 直接拼接,是因为 join() 被证明执行效率要高很多

  12. if __name__ == "__main__":

  13. main()

1. 直接打印词条名和链接不算什么真本事儿,这题要求你的爬虫允许用户输入搜索的关键词。

然后爬虫进入每一个词条,然后检测该词条是否具有副标题(比如搜索“猪八戒”,副标题就是“(中国神话小说《西游记》的角色)”),如果有,请将副标题一并打印出来:

程序实现效果如下:

代码清单:

 
  1. import urllib.request

  2. import urllib.parse

  3. import re

  4. from bs4 import BeautifulSoup

  5. def main():

  6. keyword = input("请输入关键词:")

  7. keyword = urllib.parse.urlencode({"word":keyword})

  8. response = urllib.request.urlopen("http://baike.baidu.com/search/word?%s" % keyword)

  9. html = response.read()

  10. soup = BeautifulSoup(html, "html.parser")

  11. for each in soup.find_all(href=re.compile("view")):

  12. content = ''.join([each.text])

  13. url2 = ''.join(["http://baike.baidu.com", each["href"]])

  14. response2 = urllib.request.urlopen(url2)

  15. html2 = response2.read()

  16. soup2 = BeautifulSoup(html2, "html.parser")

  17. if soup2.h2:

  18. content = ''.join([content, soup2.h2.text])

  19. content = ''.join([content, " -> ", url2])

  20. print(content)

  21. if __name__ == "__main__":

  22. main()

2. 哗啦啦地丢一堆链接给用户可不是什么好的体验,我们应该先打印 10 个链接,然后问下用户“您还往下看吗?

来,我给大家演示下:

然后为了增加用户体验,代码需要捕获未收录的词条,并提示:

提示:希望你还记得有生成器这么个东东

代码清单:

 
  1. import urllib.request

  2. import urllib.parse

  3. import re

  4. from bs4 import BeautifulSoup

  5. def test_url(soup):

  6. result = soup.find(text=re.compile("百度百科尚未收录词条"))

  7. if result:

  8. print(result[0:-1]) # 百度这个碧池在最后加了个“符号,给它去掉

  9. return False

  10. else:

  11. return True

  12. def summary(soup):

  13. word = soup.h1.text

  14. # 如果存在副标题,一起打印

  15. if soup.h2:

  16. word += soup.h2.text

  17. # 打印标题

  18. print(word)

  19. # 打印简介

  20. if soup.find(class_="lemma-summary"):

  21. print(soup.find(class_="lemma-summary").text)

  22. def get_urls(soup):

  23. for each in soup.find_all(href=re.compile("view")):

  24. content = ''.join([each.text])

  25. url2 = ''.join(["http://baike.baidu.com", each["href"]])

  26. response2 = urllib.request.urlopen(url2)

  27. html2 = response2.read()

  28. soup2 = BeautifulSoup(html2, "html.parser")

  29. if soup2.h2:

  30. content = ''.join([content, soup2.h2.text])

  31. content = ''.join([content, " -> ", url2])

  32. yield content

  33. def main():

  34. word = input("请输入关键词:")

  35. keyword = urllib.parse.urlencode({"word":word})

  36. response = urllib.request.urlopen("http://baike.baidu.com/search/word?%s" % keyword)

  37. html = response.read()

  38. soup = BeautifulSoup(html, "html.parser")

  39. if test_url(soup):

  40. summary(soup)

  41. print("下边打印相关链接:")

  42. each = get_urls(soup)

  43. while True:

  44. try:

  45. for i in range(10):

  46. print(next(each))

  47. except StopIteration:

  48. break

  49. command = input("输入任意字符将继续打印,q退出程序:")

  50. if command == 'q':

  51. break

  52. else:

  53. continue

  54. if __name__ == "__main__":

  55. main()

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

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

相关文章

ONGUI

public class ONGUI : MonoBehaviour {private void OnGUI() {GUI.Label(new Rect(0,0,100,250),"ONGUI");} }说明是以左上角为原点来算的

Spring Cloud【服务网关Gateway(三大核心概念、入门案例、路由规则 、Java API构建路由、动态路由、断言功能详解)】(六)

目录 服务网关Gateway_三大核心概念 服务网关Gateway_入门案例 服务网关Gateway_路由规则 服务网关Gateway_Java API构建路由 服务网关Gateway_动态路由 服务网关Gateway_断言功能详解 服务网关Gateway_三大核心概念 路由(Route) 这是网关的基本构建块。它由一个ID&am…

小程序自定义导航栏

效果图 代码 app.json文件下 "window":{"navigationStyle": "custom" //增加此属性},app.js文件 //计算高度 App({onLaunch() {wx.getSystemInfo({ // 获取设备信息success: (res) > {this.globalData.systeminfo res//导航栏let statusB…

springboot整合quartz通过数据库配置任务调度简单办法

简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。在java企业级应用中,Quartz是使用最广泛的定时调度框架。 在Quartz中的主要概念: Scheduler:调度任务…

C语言中文件的读写

不争输赢,只问对错 文章目录 一、文件的概述 二、什么是读写文件 三、文件处理的函数 1.文件的打开与关闭 2.文件的顺序读写 文件的顺序读写相关函数 scanf 和 printf 家族的对比及其区分 3.文件的随机读写 文件的随机读写函数 四、文件缓冲区 五…

【el-tree查询并高亮】vue使用el-tree组件,搜索展开并选中对应节点,高亮搜索的关键字,过滤后高亮关键字,两种方法

第一种(直接展开并高亮关键字) 效果图这样的,会把所有的有这些关键字的节点都展开 代码: 这里的逻辑就是通过递归循环把所有和关键字匹配的节点筛选出来 然后通过setCheckedKeys方法把他展开选中 然后通过filterReal把关键字高亮…

Hadoop——DataGrip连接MySQL|Hive

1、下载 DataGrip下载:DataGrip: The Cross-Platform IDE for Databases & SQL by JetBrains 2、破解 破解链接:https://www.cnblogs.com/xiaohuhu/p/17218430.html 3、启动环境 启动Hadoop:到Hadoop的sbin目录下右键管理员身份运行…

数学建模学习(2):数学建模各类常用的算法全解析

一、评价类算法 常见的评价算法 1.层次分析法 基本思想 是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成 目标层、准则层和方案层 ,并通过人们的 判断对决策方案的 优劣进行排序 ,在此基础上进行定性和定量分析。它把人的思维过程…

预处理详解

目录 一、预定义符号 二、#define 1.认识#define 2.使用#define 2.1#define定义常量 2.2#define定义宏 2.3#define的替换规则 三、宏定义的其他内容 1.#和## 1.1# 1.2## 2.宏的副作用 3.宏的命名规则 4.undef 5.条件编译 一、预定义符号 #include<stdio.h> int…

通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置

目录 1.算法理论概述 串口通信模块 指令解析模块 位置控制模块 显示器驱动模块 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 通过FPGA实现基于RS232串口的指令发送并控制显示器中目标位置是一种常见的应用场景&#x…

双向不循环链表的认识和基础操作(节点创建,头插头删,尾插尾删,输出和逆置)

头定义&#xff1a; typedef char datatype[20];//datatypechar[20] typedef struct Node {//数据域 数据元素datatype data;//指针域 下一个节点地址struct Node* next;//指针域 上一个节点地址struct Node* prev; }*DoubleLink; 创建节点&#xff1a; DoubleLink create_n…

校园电气安全风险分析及预防措施 安科瑞 许敏

摘要:校园属于人员密集场所&#xff0c;若安全风险排查、管控不到位&#xff0c;可能导致安全事故发生&#xff0c;造成严重事故后果。校园电气设备设施引起的电气火灾和触电等事故&#xff0c;是构成校园安全威胁之一&#xff0c;笔者通过对校园发生的电气安全事故案例原因分析…

一次线上OOM问题的个人复盘

我们一个java服务上线后&#xff0c;偶尔会发生内存OOM(Out Of Memory)问题&#xff0c;但由于OOM导致服务不响应请求&#xff0c;健康检查多次不通过&#xff0c;最后部署平台kill了java进程&#xff0c;这导致定位这次OOM问题也变得困难起来。 最终&#xff0c;在多次review代…

react目录结构

比较全面的react目录结构。 目录详解 assets&#xff1a;放置原始资源文件。 components&#xff1a;存放全局组件。 contants&#xff1a;常量文件夹&#xff0c;存放常量。 i18n&#xff1a;i18n国际化&#xff0c;各种语言的翻译。 pages&#xff1a;页面文件夹。 r…

es添加索引命令行和浏览器添加索引--图文详解

一、添加索引 创建索引 curl -X PUT "localhost:9200/my-index-00001?pretty" 获取索引 curl -X GET "localhost:9200/my-index-000001?pretty" 获取全部的索引 curl -X GET "http://localhost:9200/_cat/indices?v" 获取索引映射 cur…

2023 Pycharm 给项目配置解释器 基于已经创建的conda虚拟环境

我在2019年开始使用Pycharm作为python的IDE&#xff0c;最近配置解释器时&#xff0c;法线网上的方法大概过时了&#xff0c;自己尝试了好多次才发现新版本的Pycharm的解释配置方法&#xff0c;故记于此 背景描述&#xff1a; 我是用conda管理环境的&#xff0c;我已经创建好一…

C++ 单例模式(介绍+实现)

文章目录 一. 设计模式二. 单例模式三. 饿汉模式四. 懒汉模式结束语 一. 设计模式 单例模式是一种设计模式 设计模式(Design Pattern)是一套被反复使用&#xff0c;多数人知晓的&#xff0c;经过分类的&#xff0c;代码设计经验的总结。 为什么要有设计模式 就像人类历史发展会…

Docker容器网络和资源管理控制

Docker容器网络 一、Docker 网络实现原理二、Docker 的网络模式网络模式详解&#xff1a;①host模式②container模式③none模式④bridge模式⑤自定义网络 三、资源控制Ⅰ、CPU资源控制Ⅱ、对内存使用的限制Ⅲ、对磁盘IO配额控制&#xff08;blkio&#xff09;的限制 一、Docker…

前端vue uni-app仿美团下拉框下拉筛选组件

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

Hbuildx下载内置浏览器失败

问题描述 刚开始接触Hbulidx&#xff0c;在下载内置浏览器时&#xff0c;报错 " Hbulidx内置浏览器下载失败 " 原因分析 从网上搜索相关的解决方法&#xff0c;一般都是说检查网络&#xff0c;或者关闭杀毒软件。这并没有解决问题&#xff0c;所以&#xff0c;我就…