简单爬虫项目练习

爬虫项目练习

  • 前言
  • 任务
  • 基本爬虫框架
  • URL管理器
  • Html 下载器
  • HTML 解析器
  • 数据存储器
  • 爬虫调度器
  • 效果分析

前言

自学,参考书籍为 Python爬虫开发与项目实战 ,具体参考了该书的第六章。过程中出现两个问题:

  • 在 Pycharm 上实现时发现有些库名更改及合并
  • 爬取的网站增加了反爬机制

代码的框架与原书是一模一样的,若该文章有幸被原作者所浏览且认为这算抄袭,请联系我。

以下代码会具体标出与原书不同的地方(以 #!!!!!!!!!!! 标注)以及记录自己的想法

任务

爬取数条(自己定)百度百科爬虫词条以及相关词条的标题、摘要和链接信息

基本爬虫框架

这里参考原书
请添加图片描述

URL管理器

  • 这一部分代码同原书
class URLManager(object):def __init__(self):self.new_urls = set()self.old_urls = set()def has_new_url(self):return self.new_url_size() != 0def get_new_url(self):new_url = self.new_urls.pop()self.old_urls.add(new_url)return new_urldef add_new_url(self, url):if url is None:returnif url not in self.new_urls and url not in self.old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def new_url_size(self):return len(self.new_urls)def old_url_size(self):return len(self.old_urls)
  • 使用set数据结构:利用数据结构 set 的去重功能,防止链接被重复爬取
  • 若将来需求变大,需要存储的 url 增多,应该链接数据库保存
  • 提出问题:获得新的 url 的顺序是否合理?如何获得与原词条相关性更强的 url 呢?

改进:

最终的运行文件所用到的代码如下:

import pickle
import hashlibclass _URLManager(object):def __init__(self):self.new_urls = self.load_process('new_urls.txt')self.old_urls = self.load_process('old_urls.txt')def has_new_url(self):return self.new_url_size() != 0def get_new_url(self):new_url = self.new_urls.pop()m = hashlib.md5()#!!!!!!!!!!!m.update(new_url.encode(encoding='utf-8'))self.old_urls.add(m.hexdigest()[8:-8])return new_urldef add_new_url(self, url):if url is None:returnm = hashlib.md5()#!!!!!!!!!!!m.update(url.encode(encoding='utf-8'))url_md5 = m.hexdigest()[8:-8]if url not in self.new_urls and url_md5 not in self.old_urls:self.new_urls.add(url)def add_new_urls(self, urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def new_url_size(self):return len(self.new_urls)def old_url_size(self):return len(self.old_urls)def save_process(self, path, data):with open(path, 'wb') as f:pickle.dump(data, f)def load_process(self, path):print('[+] 从文件加载进度: %s' % path)try:with open(path, 'rb') as f:tmp = pickle.load(f)return tmpexcept:print('[!] 无进度文件,创建: %s' % path)return set()
  • pickle: 实现序列化(dump)和反序列化(load
  • hashlib: 如果直接存储大量的URL链接,尤其是URL链接很长时,很容易造成内存溢出。因此将爬取过的URL进行 MD5 处理,减少内存消耗

Html 下载器

# coding: utf-8
import requests
import random
import timeclass HtmlDownloader(object):#!!!!!!!!!!!@staticmethoddef download(url):if url is None:return Noneproxies = {}#!!!!!!!!!!!user_agents = [# Opera"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60","Opera/8.0 (Windows NT 5.1; U; en)","Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50",# Firefox"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0","Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",# Safari"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",# chrome"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11","Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",# 360"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",# 淘宝浏览器"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",# 猎豹浏览器"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER","Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",# QQ浏览器"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E) ",# sogou浏览器"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0","Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)",# maxthon浏览器"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36",# UC浏览器"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36","Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/17D50 UCBrowser/12.8.2.1268 Mobile AliApp(TUnionSDK/0.1.20.3)","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36","Mozilla/5.0 (Linux; Android 8.1.0; OPPO R11t Build/OPM1.171019.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/76.0.3809.89 Mobile Safari/537.36 T7/11.19 SP-engine/2.15.0 baiduboxapp/11.19.5.10 (Baidu; P1 8.1.0)","Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.14.0 main%2F1.0 baiduboxapp/11.18.0.16 (Baidu; P2 13.3.1) NABar/0.0 ","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36","Mozilla/5.0 (iPhone; CPU iPhone OS 12_4_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.10(0x17000a21) NetType/4G Language/zh_CN","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"]#!!!!!!!!!!!user_agent = random.choice(user_agents)headers = {'User-Agent': user_agent}#!!!!!!!!!!!time.sleep(random.randint(0, 5) * 0.05 + random.randint(4, 20) * 0.01)# r = requests.get(url, headers=headers, proxies=proxies)r = requests.get(url, headers=headers)if r.status_code == 200:r.encoding = 'utf-8'return r.textelse:print("DownLoad Failed")return None
  • 由于百度百科的反爬比作者写书时稍有变化,对代码进行改进使得顺利爬虫
  • 改进1:随机选择 user_agent 进行访问,随机选择使用 random.choice 函数。该 user_agents 引用自 https://blog.csdn.net/a_123_4/article/details/119718509
  • 改进2:采用随机延迟时间,实践证明,这一点十分有效
  • 后续: 可以使用不同 Ip 代理

HTML 解析器

import re
#!!!!!!!!!!!
from urllib import parse
from bs4 import BeautifulSoupclass HtmlParser(object):def parser(self, page_url, html_cont):if page_url is None or html_cont is None:returnsoup = BeautifulSoup(html_cont, 'html.parser')new_urls = self._get_new_urls(page_url, soup)new_data = self._get_new_data(page_url, soup)return new_urls, new_datadef _get_new_urls(self, page_url, soup):new_urls = set()#!!!!!!!!!!!pattern_one = re.compile(r'/item/.+?/\d+')pattern_two = re.compile(r'/item/.+?(?=")')# class="para MARK_MODULE"# links = soup.find_all('div', class_='para MARK_MODULE').find_all('a', href=re.compile(r'/item/.+/\d+'))#!!!!!!!!!!!links = soup.find_all('div', class_="para MARK_MODULE")#!!!!!!!!!!!if len(links):print("Crawl Successful")if len(links) > 10:links = links[:10]else:print("Crawl Failed")#!!!!!!!!!!!for link in links:tmp = re.search(pattern_one, str(link))if tmp:new_full_url = parse.urljoin(page_url, tmp.group())new_urls.add(new_full_url)else:tmp = re.search(pattern_two, str(link))if tmp:new_full_url = parse.urljoin(page_url, tmp.group())new_urls.add(new_full_url)return new_urlsdef _get_new_data(self, page_url, soup):data = dict()data['url'] = page_url#!!!!!!!!!!!# <dd class="lemmaWgt-lemmaTitle-title J-lemma-title" data-pid="0">title = soup.find('dd', class_='lemmaWgt-lemmaTitle-title J-lemma-title').find('h1')data['title'] = title.get_text()print(data['title'])#!!!!!!!!!!!summary = soup.find('div', class_='lemma-summary J-summary')data['summary'] = summary.get_text()return data
  • 这一部分是修改最多的一部分,基本重写了 _get_new_urls 函数
  • 一方面来自于百度百科的 html 与之前有所不同,另一方面来自于有选择性地找链接(正文的链接)

打开开发者工具,查看几个蓝色链接的源代码,但是实际上爬取下来的网页里面的代码和这里有出入
在这里插入图片描述
这是因为我们用 requests 获取到的是HTML源代码,但是这个网页是用 JavaScript 渲染的,上面两个库不会像浏览器那样继续运行后面请求来的 JavaScript 模块,所以不一样。
在这里插入图片描述
利用 cirl + U 查看页面源代码,找到 FOAF 的相应的源代码

<div class="para MARK_MODULE" label-module="para" data-uuid="go0aryj7fe" >网络爬虫(又称为网页蜘蛛,网络机器
人,在<a target=_blank href="/item/FOAF/4916497" data-lemmaid="4916497">FOAF</a>社区中间,更经常的称为网页追逐者)

可以看到我们所需要的 URL 为

原来页面的 url  +  /item/FOAF/4916497new_full_url = parse.urljoin(page_url, tmp.group())

对应的正则表达式为:

/item/.+?/\d+
这里需要用到 懒惰模式

还有另外一种格式,对应的正则表达式为:

/item/.+?(?=")
这里需要用到 零带断言

数据存储器

import codecs
import timeclass DataOutput(object):def __init__(self):self.datas = []def store_data(self, data):if data is None:print("Data Exception")returnself.datas.append(data)# print(self.datas)def output_html(self):fileout = codecs.open('baike.html', 'w', encoding='utf-8')fileout.write("<html>")fileout.write("<body>")fileout.write("<table>")for data in self.datas:fileout.write("<tr>")fileout.write("<td>%s</td>" % data['url'])fileout.write("<td>%s</td>" % data['title'])fileout.write("<td>%s</td>" % data['summary'])fileout.write("</tr>")#!!!!!!!!!!!fileout.write("</html>")fileout.write("</body>")fileout.write("</table>")fileout.close()
  • 注意! 删除原书中 self.datas.remove(data) 语句,这是个很致命的错误,会导致最终爬取到的信息是预期的一半。在遍历过程中删除遍历对象的元素是极其不明智的!

爬虫调度器

from DataOutput import DataOutput
from HtmlDownloader import HtmlDownloader
from HtmlParser import HtmlParser
from URLManager import _URLManagerclass SpiderMan(object):def __init__(self):#!!!!!!!!!!!self.manager = _URLManager()self.downloader = HtmlDownloader()self.parser = HtmlParser()self.output = DataOutput()#!!!!!!!!!!!self.correct = []def crawl(self, root_url):self.manager.add_new_url(root_url)while self.manager.has_new_url() and self.manager.old_url_size() < 300:try:new_url = self.manager.get_new_url()print("当前解析的是%s" % new_url)html = self.downloader.download(new_url)new_urls, data = self.parser.parser(new_url, html)self.manager.add_new_urls(new_urls)self.output.store_data(data)               #!!!!!!!!!!!print("已经抓取%s个链接" % self.manager.old_url_size())print("成功抓取%s个链接" % len(self.output.datas))except Exception as e:print("crawl failed")print(e.args)finally:#!!!!!!!!!!!if self.manager.old_url_size() != 0:self.correct.append(len(self.output.datas) / self.manager.old_url_size())self.output.output_html()#!!!!!!!!!!!with open('ana.txt', 'w') as f:f.write(str(self.correct))f.close()# Press the green button in the gutter to run the script.
if __name__ == '__main__':spider_man = SpiderMan()spider_man.crawl("https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB?fromModule=lemma_search-box")
  • 存储 ana.txt 便于我们事后分析爬虫效果

效果分析

利用 ana.txt 中的数据,选择作者较为熟悉的R分析

ana <- read.csv("D:/PycharmProjects/Basic_crawl/ana.txt", header=FALSE)
ana[1] = 1.0
ana[300] = 0.76
Data = cbind(times = c(1:300), rate = as.numeric(ana))
ggplot(data = as.data.frame(Data), mapping = aes(times, rate)) + geom_point(size = 1) + geom_hline(yintercept  = mean(Data[,2]))

在这里插入图片描述
可以看到,随着爬取节点次数的不断增加,爬取网页的成功率大概稳定在0.75. 去除前50个点,前50个点分母太小,数据波动太大,因此重新画图分析,

Data2 = as.data.frame(Data[50:300,])
ggplot(data = as.data.frame(Data2), mapping = aes(times, rate)) + geom_point(size = 1) + geom_hline(yintercept  = mean(Data2[,2]))

在这里插入图片描述

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

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

相关文章

计算机网络——数据链路层

文章目录 **1 数据链路层的功能****1.1 为网络层提供服务****1.2 链路管理****1.3 帧定界&#xff0c;帧同步与透明传输****1.4 流量控制****1.5 差错控制** **2 组帧****2.1 字符计数法****2.2 字符填充的首尾定界符法****2.3 零比特填充的首尾标志法****2.4 违规编码法** **3…

10.6.5 【Linux】分区命令: split

如果你有文件太大&#xff0c;导致一些携带式设备无法复制的问题&#xff0c;split可以将一个大文件&#xff0c;依据文件大小或行数来分区&#xff0c;可以将大文件分区成为小文件&#xff0c;快速有效。 将文件分区的话&#xff0c;使用-b size来将一个分区的文件限制其大小&…

YOLOv8的目标对象的分类,分割,跟踪和姿态估计的多任务检测实践(Netron模型可视化)

YOLOv8是目前最新版本&#xff0c;在以前YOLO版本基础上建立并加入了一些新的功能&#xff0c;以进一步提高性能和灵活性&#xff0c;是目前最先进的模型。YOLOv8旨在快速&#xff0c;准确&#xff0c;易于使用&#xff0c;使其成为广泛的目标检测和跟踪&#xff0c;实例分割&a…

模拟行走机器人-python

leetcode第874题 链接https://leetcode.cn/problems/walking-robot-simulation 机器人在一个无限大小的 XY 网格平面上行走&#xff0c;从点 (0, 0) 处开始出发&#xff0c;面向北方。该机器人可以接收以下三种类型的命令 commands &#xff1a; -2 &#xff1a;向左转 90 度…

Hadoop——大数据生态体系详解

一.大数据概论 1.1 大数据概念 大数据&#xff08;big data&#xff09;&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理 和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程 优化能力的海量、高增长率和多样化的信息资产…

【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

问题&#xff1a;使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样&#xff0c;在mac下&#xff0c;一切正常&#xff0c;看起来很舒服&#xff0c;但是当我把页面放在扩展屏幕下&#xff08;27寸&#xff09;&#xff0c;再生成一个pdf&#xff0c;虽然排版一…

ARM Coresight 系列文章 8 - ARM Coresight 通过 APBIC 级联使用

文章目录 APBIC 回顾APBIC 级联 上篇文章&#xff1a;ARM Coresight 系列文章 7 - ARM Coresight 通过 AHB-AP 访问 异构 cpu 内部 coresight 组件 APBIC 回顾 APBIC 可以连接一个或者多个APB BUS masters&#xff0c; 例如连接一个 APB-AP 组件和带有 APB 接口的 Processor&…

【C++】STL——vector的使用、 vector增删查改函数的介绍和使用、push_back和pop_back、operator[]

文章目录 1.vector的使用2.vector的增删查改&#xff08;1&#xff09;push_back 尾插&#xff08;2&#xff09;pop_back 尾删&#xff08;3&#xff09;find 查找&#xff08;4&#xff09;insert 在position之前插入val &#xff08;5&#xff09;erase 删除指定位置的数据&…

手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(中篇)

近期因俗事缠身&#xff0c;《通过理解LSTM的反向传播过程&#xff0c;理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式&#xff0c;配超多图帮助理解》的中下篇鸽了实在太久有些不好意思了。为了避免烂尾&#xff0c;还是抽时间补上&#xff08;上篇在此&…

带你用Python制作7个程序,让你感受到端午节的快乐

名字:阿玥的小东东 学习:Python、C/C++ 主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主 目录 前言 程序1:制作粽子

Spring Boot进阶(57):Spring中什么时候不要用@Autowired注入 | 超级详细,建议收藏

1. 前言&#x1f525; 注解Autowired&#xff0c;相信对于我们Java开发者而言并不陌生吧&#xff0c;在SpringBoot或SpringCloud框架中使用那是非常的广泛。但是当我们使用IDEA编辑器开发代码的时候&#xff0c;经常会发现Autowired 注解下面提示小黄线警告&#xff0c;我们把小…

Redis【实战篇】---- 分布式锁

Redis【实战篇】---- 分布式锁 1. 基本原理和实现方式对比2. Redis分布式锁的实现核心思路3. 实现分布式锁版本一4. Redis分布式锁误删情况说明5. 解决Redis分布式锁误删问题6. 分布式锁的原子性问题7. Lua脚本解决多条命令原子性问题8. 利用Java代码调试Lua脚本改造分布式锁 1…

css背景毛玻璃效果

一、结论&#xff1a;通过 css 的 backdrop-filter 属性设置滤镜函数 blur 一般会是有 背景色、透明度 的容器&#xff0c;如&#xff1a; /* 宽高等其他设置这里省略没写 */ background:rgba(3, 87, 255, 0.3); backdrop-filter: blur(10px);二、backdrop-filter 的其他用法…

Mysql教程(四):DML学习

Mysql教程&#xff08;四&#xff09;&#xff1a;DML学习 前言 DML-介绍 DML英文全称是Data Manipulation Language数据库操作语言&#xff0c;用来对数据库中表的数据记录进行增删改查。 添加数据&#xff08;INSERT&#xff09;修改数据&#xff08;UPDATE&#xff09;删除…

走访慰问空巢老人,连接传递浓浓温情

为了弘扬中华民族尊老、敬老、爱老的优良传统&#xff0c;让老人们感受到政府和社会的温暖&#xff0c;在“端午”来临之际&#xff0c;思南县青年志愿者协会联合思南县民慈社会工作服务中心、思南县小荧星幼儿园、思南县小英豪幼儿园到大河坝镇天坝村开展“走访慰问空巢老人&a…

springboot整合eureka、config搭建注册中心和配置中心

目录 一 、springboot整合eureka实现注册中心 二、springboot整合config实现配置中心 三、从配置中心拉取配置 这篇文章详细介绍怎么通过eureka和config分别搭建一个注册中心和配置中心的服务。 一 、springboot整合eureka实现注册中心 1、创建一个springboot项目&#xff…

LRU 算法,但 get 和 put 必须 O(1),用哈希表

https://leetcode.cn/problems/lru-cache/ 题目有key、value的&#xff0c;直接就上map了 结果&#xff1a;&#x1f605; 仔细一看&#xff0c;原来要 get 和 put 必须 O(1) 只能抛弃树型数据结构了 线性的数据结构也可以吧&#xff0c;如果可以构造出一个队列&#xff0c…

Appium+python自动化(十一)- 元素定位- 下卷超详解)

1、 List定位 List故名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…

【InsCode Stable Diffusion 美图活动一期】生成着玩

此为内容创作模板&#xff0c;请按照格式补充内容&#xff0c;在发布之前请将不必要的内容删除 一、 Stable Diffusion 模型在线使用地址&#xff1a; https://inscode.csdn.net/inscode/Stable-Diffusion 二、模型相关版本和参数配置&#xff1a; 三、图片生成提示词与反向…

春秋云境—Initial

文章目录 春秋云境—Initial一、前期准备1、靶标介绍2、相关设备 二、WEB渗透1、ThinkPHP RCE&#xff08;1&#xff09;、打开网站&#xff08;2&#xff09;、检测漏洞 2、蚁剑连接3、sudo提权4、frpc代理5、fsacn扫描 三、后渗透1、信呼OA RCE&#xff08;1&#xff09;、1.…