python爬虫笔记

news2024/12/29 9:42:54

Python爬虫笔记

一. Urllib

1. 基础请求

  • 指定url
  • 请求
  • 返回值解码
  • 返回结果的一些操作
import urllib.request as req
# 定义一个url
url = 'http://www.baidu.com'

# 发送请求获得相应
res = req.urlopen(url)

# read返回字节形式的二进制数据,需要用指定编码来解码
content = res.read().decode('utf-8')

# 读5个字节
content2 = res.read(5)

# 读一行
content3 = res.readline()

# 一行一行全部读完,返回一个数组
content4 = res.readlines()

# 获取状态码,如果是200就是正常的
code = res.getcode

# 获取头信息
res.getheaders()

# 获取请求的url
res.geturl()

下载

url = 'http://www.baidu.com'
req.urlretrieve(url, 'baidu.html')

UA校验和Request对象

  • 在headers中携带了浏览器和操作系统等信息,叫user-agent,是网站的一种反爬机制,需要在header中携带
  • ua只需要在浏览器中的network中随便找一个请求就可以找到ua信息
  • 之后请求的时候,不是在req.urlopen中直接传入url了,而是传入一个Request对象
import urllib.request as ureq
# 下载网页/视频/照片
url = 'https://www.baidu.com'

# UA全称UserAgent 是个请求头信息,让浏览器能识别用户的操作系统版本,cpu类型等等信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46'
}
# 构造请求对象
request = ureq.Request(url=url, headers=headers)
# 发送请求的时候放进去的是一个request对象
res = ureq.urlopen(request)
content = res.urlopen(res)

get请求

  • get请求的参数是在url中的,但是请求的时候有中文的时候,需要编码成gbk才行
  • 使用urllib.parse.quote来将中文编码
# 请求url中的中文要被转换为Unicode编码,才能正常进行访问
import urllib.parse
import urllib.request as ureq
name = urllib.parse.quote('周杰伦')
# 下载网页/视频/照片
url = 'https://www.baidu.com/s?wd='+name

# UA全称UserAgent 是个请求头信息,让浏览器能识别用户的操作系统版本,cpu类型等等信息
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46'
}
# 构造请求对象
request = ureq.Request(url=url, headers=headers)
# 发送请求的时候放进去的是一个request对象
res = ureq.urlopen(request)
print(res.read())

post请求

  • post请求和get的最大不同就是post请求的请求参数是放在请求体里的,不在url中直接写出来
  • 注意!!!:先用urlencode编码之后,还要编码一次成utf-8,请求参数应该写在一个字典中
import urllib.parse
import urllib.request as ureq
import json
parms = {
    'text': 'red',
}
# post请求的参数必须要编码,注意要调用encode方法
data = urllib.parse.urlencode(parms).encode('utf-8')
url = 'https://dict.youdao.com/keyword/key'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-1182920945@10.110.96.160; OUTFOX_SEARCH_USER_ID_NCOO=977276189.4843129'
    #     如果请求不成功可能是头信息不足,比如缺了cookie
}
request = urllib.request.Request(url=url, data=data, headers=headers)
res = ureq.urlopen(request)
# 返回JSON对象,转换为一个字典类型
content = res.read().decode('utf-8')
content = json.loads(content)
print(content)

cookies

  • 一般登录信息都存放在cookies中,需要登录才能访问的界面如果是用的cookie校验的化,在header中携带cookie才可以进行访问

headler

import urllib.request
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46'
}
url = 'https://movie.douban.com/j/chart/top_list?type=25&interval_id=100%3A90&action=&start=0&limit=20'
request = urllib.request.Request(url=url, headers=headers)
# 获取handler对象
handler = urllib.request.HTTPHandler()
# 获取opener对象
opener = urllib.request.build_opener(handler)
# 调用open方法
res = opener.open(request)

print(res.read().decode('utf-8'))

handler方式

  • 用自己的ip可能不安全或者访问过于频繁被封ip,可以使用代理ip
  • 用handler和opener方式请求可以使用代理ip
import urllib.request
import random
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46'
}
url = 'https://www.baidu.com/s?wd=ip'
request = urllib.request.Request(url=url, headers=headers)
# 用random随机在代理池中选择
proxy_pool = [
    {'http': '61.216.156.222:60805'},
    {'http': '61.216.156.222:60808'},
    {'http': '61.216.156.222:60802'},
]
proxy = random.choice(proxy_pool)
# 获取handler对象
handler = urllib.request.ProxyHandler()
# 获取opener对象
opener = urllib.request.build_opener(handler)
# 调用open方法
res = opener.open(request)
content = res.read().decode('utf-8')
with open('代理.html', 'w', encoding='utf-8') as f:
    f.write(content)

xpath

下载和安装

按这篇文章
解压之后在chrome中开发者模式中选择解压好之后的文件夹即可完成安装

  • 重启浏览器,ctrl+shift+x 出现小黑框

基础解析语法

from lxml import html
import urllib.request
import json
et = html.etree

# 创建树节点
html_tree = et.parse('demo01.html')

# xpath路径
# //表示所有子孙节点
# /表示子节点
res1 = html_tree.xpath('//body/ul/li')

# [@id]可以获取当前层级下所有写了id的标签
res2 = html_tree.xpath('//body/ul/li[@id]')
# 也可以指定id是谁来获取
res3 = html_tree.xpath('//body/ul/li[@id=2]')
# /text可以获取标签里的文本信息
res4 = html_tree.xpath('//body/ul/li[@id=2]/text()')
# @class可以获取该元素的class属性
res5 = html_tree.xpath('//body/ul/li[@id=2]/@class')
# 模糊查询
res6 = html_tree.xpath('//body/ul/li[contains(@id, "l")]')
# 模糊查询2
res7 = html_tree.xpath('//body/ul/li[starts-with(@id, "l")]')
# 逻辑运算
res8 = html_tree.xpath('//ul/li[@id=1 or @class="adfass"]')

beautifulSoup

可以像操作对象一样进行标签的选择

基础操作

from bs4 import BeautifulSoup
# 打开本地页面数据,注意默认编码格式是gbk
bs = BeautifulSoup(open('demo01.html', encoding='utf-8'), 'lxml')
# 根据标签查找第一个符合要求的
res1 = bs.ul.li
# 输出标签的属性
res2 = bs.ul.li.attrs

两种find函数

# find函数,可以根据一些条件找到符合条件的第一个
res3 = bs.find('li', id=1)
res4 = bs.find('li', class_="adfass")

# find_all 找到所有的,寻找多个的时候要放到一个列表中
res5 = bs.findAll(['li', 'body', 'ul'])
# 用limit可以控制返回前几个
res6 = bs.findAll(['li', 'body', 'ul'], limit=2)

select选择器


# 使用select,可以使用一些选择器语法
res7 = bs.select('li')
# 类选择器,加一个.
res8 = bs.select('.adfass')
# id选择器,加一个#
res9 = bs.select('#l1')
# 属性选择器,选择li中有id的
res10 = bs.select('li[id]')
res10 = bs.select('li[id="l1"]')

# 层级选择器
# 后代选择器,用空格分开,两者之间只要是后代关系,隔多少层级都可以
res11 = bs.select('div li')

# 子代选择器,用>隔开,只有第一代子代会被选中
res12 = bs.select('div > ul')

# 获取多个标签
res13 = bs.select("li, a, div")

# 获取节点信息
obj = res13[5]
s1 = obj.get_text()
attr = obj.attrs
print(attr)

selenium

驱动浏览器去上网,骗过反爬机制

使用方式

  1. 先去下载对应浏览器对应版本的驱动程序
  2. 将驱动程序放在当前目录下
  3. pip install selenium

基础操作

from selenium import webdriver
import time
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
# 控制浏览器访问这个url
browser.get('https://www.baidu.com/')
# 获取网页源码
content = browser.page_source
# 获取元素
# 通过xpath表达式获取
time.sleep(2)
input = browser.find_element(by='xpath', value='//input[@id="kw"]')
input.send_keys('周杰伦')

btn = browser.find_element(by='xpath', value='//input[@id="su"]')
btn.click()

# 通过js代码来操控
time.sleep(4)

js = "window.scrollTo(0, document.body.scrollHeight)"
browser.execute_script(js)

交互操作

from selenium import webdriver
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
# 控制浏览器访问这个url
browser.get('https://cn.bing.com/')
# 获取网页源码
content = browser.page_source
# 获取元素
# 通过xpath表达式获取
btn = browser.find_element(by='xpath', value='//label[@id]')

print(tag)

requests库

requests是python原生的可用于爬虫的库,比urllib方便,比如get和post的时候不用对参数进行编码,或者创建Request对象再进行请求‘

基础操作

url = 'https://www.baidu.com/s?'
headers = {
    'User-Agent': 'xxxxxx',
}
data ={
    'wd': '周杰伦'
}
# params:请求参数,无需像urllib一样编码了
res = requests.get(url, params=data, headers=headers)
res.encoding = 'utf-8'
text = res.text  # 字符串形式的页面源码
res_url = res.url
content = res.content  # 返回二进制数据
code = res.status_code  # 状态码
headers = res.headers  # 头信息

post请求

注意点:

  1. 留意那些隐藏了登录参数,可以进行错误登录查看请求内容,然后去源码中进行定位获取
  2. 验证码的url每次访问都是出现不一样的,因此需要用到session
  3. 可以使用超级鹰等验证码识别平台进行验证码的识别
url = 'https://fanyi.baidu.com/sug'
headers = {
    'User-Agent': 'xxxx',
}
data = {
    'kw': 'eye'
}
proxy = {
    'http': 'xxx.xxx.xxx:xxxx'
}
res = requests.post(url=url, data=data, headers=headers, proxies=proxy)
res.encoding='utf-8'
res = json.loads(res.text, encoding='utf-8')
print(res)

验证码登录案例

import requests
import bs4
import urllib.request
login_index_url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46',
}
# 有两个隐藏起来的用于验证的,需要先获取
res = requests.get(url=login_index_url, headers=headers)
soup = bs4.BeautifulSoup(res.text, features='lxml')
VIEWSTATE = soup.select('#__VIEWSTATE')[0].attrs['value']
VIEWSTATEGENERATOR = soup.select('#__VIEWSTATEGENERATOR')[0].attrs['value']
code_url = soup.select('#imgCode')[0].attrs['src']
code_url = 'https://so.gushiwen.cn/'+code_url

# 如果使用的下载的话,等下将账号密码验证码发过去的时候,那个验证码请求回来的东西就和之前不一样了
# urllib.request.urlretrieve(code_url, filename='code.jpg')
# 要使用session
session = requests.session()
response_code = session.get(login_index_url)
# 图片是二进制数据下载下来的
content_code = response_code.content
with open('code.jpg', 'wb')as fp:
    fp.write(content_code)

print(code_url)
code = input('请输入验证码')
login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data = {
    '__VIEWSTATE': VIEWSTATE,
    '__VIEWSTATEGENERATOR': VIEWSTATEGENERATOR,
    'from': 'http://so.gushiwen.cn/user/collect.aspx',
    'email': '18851605189',
    'pwd': 'Xboxoneps4psv',
    'code': code,
    'denglu': '登录'
}
# 这里的请求也要用session对象的请求
res = session.post(url=login_url, data=data, headers=headers)
print(res.text)

Scrapy

常用的爬虫框架

使用

  1. pip install scrapy
  2. 初始化scrapy项目
scrapy startproject项目名称
  1. spiders文件夹中创建爬虫文件
scrapy genspider 文件名 起始域名
  1. 将settings中的robot协议改为否
  2. 执行爬虫程序
scrapy crawl 爬虫名称

项目结构

创建了scrapy工程之后默认会创建几个文件

  • spiders:用来存放爬虫文件的
  • items:自定义数据机构读的地方
  • middleware:中间件
  • pipelines:管道,用来处理下载数据的
  • settings:配值文件

scrapy工作原理

工作原理

使用管道下载数据

  1. 在setting中开启管道
    在这里插入图片描述
  2. 在items中将要储存的数据都有什么用**scrapy.Field()**创建Field对象
# 比如这里我要存的有三个字段
class DangdangItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    #  在这里定义数据都有什么
    src = scrapy.Field()
    name = scrapy.Field()
    price = scrapy.Field()
  1. 在爬虫主程序中,导入items中的类,并且将爬到的数据作为构造函数的参数,实例化有数据的对象,yield返回每次读到的数据,pipeline会读取到
    在这里插入图片描述
  2. pipeline中接收:process_item中的item参数就是yield返回的一个个值,这里可以定义生命周期函数,在开始爬虫前打开一个文件,爬虫结束后关闭,减少io操作
class DangdangPipeline:
    def open_spider(self, spider):
        self.fp = open('dangdang.json', 'w', encoding='utf-8')

    # item就是yield出来的book对象
    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self, spider):
        self.fp.close()

多管道下载

  1. 再创建一个类,也有一个process_item方法
  2. settings中的管道那里,将新增类对应的名字加入字典中,添加一条管道
import urllib.request


class DangdangPipeline:
    def open_spider(self, spider):
        self.fp = open('dangdang.json', 'w', encoding='utf-8')

    # item就是yield出来的book对象
    def process_item(self, item, spider):
        self.fp.write(str(item))
        return item

    def close_spider(self, spider):
        self.fp.close()


# 开启另一个管道下载图片
class DownloadPics:
    def process_item(self, item, spider):
        url = item.get('src')
        url = 'http:'+url
        filename = './book/'+item.get('name')+'.jpg'
        urllib.request.urlretrieve(url=url, filename=filename)
        return item

在这里插入图片描述

多页面下载

  • scrapy.Request可以发起get请求,在parse方法内部,用yield调用可以每次循环都调用
import scrapy
from dangdang.items import DangdangItem

class Dangdang01Spider(scrapy.Spider):
    name = 'dangdang01'
    allowed_domains = ['category.dangdang.com']
    start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html']
    current_page = 1
    def parse(self, response):
        li_list = response.xpath('//ul[@id="component_59"]/li')
        # xpath的结果可以继续进行xpath
        # 要加.表示相对于当前的xpath的路径
        for li in li_list:
            src = li.xpath('.//img/@data-original').extract_first()
            if src:
                src = src
            else:
                src = li.xpath('.//img/@src').extract_first()
            name = li.xpath('.//img/@alt').extract_first()
            price = li.xpath('.//p[@class="price"]/span/text()').extract_first()

            # 导入items中的class,并且用yield交给管道
            book = DangdangItem(src=src, name=name, price=price)

            yield book
        if self.current_page <= 10:
            self.current_page += 1
            url = f'http://search.dangdang.com/?key=%C8%FD%CC%E5&act=input&page_index={self.current_page}'
            yield scrapy.Request(url=url, callback=self.parse)

进入页面下载

  • 需求:在一个页面获取到一个href链接后,访问这个链接
  • 也是用scrapy.Request(url, callback=要调用的函数名, meta=可以通过这个向要调用的函数中传参)
import scrapy
from DYTT.items import DyttItem

class MovieSpider(scrapy.Spider):
    name = 'movie'
    allowed_domains = ['dygod.net']
    start_urls = ['https://www.dygod.net/html/gndy/china/index.html']

    def parse(self, response):
        a_list = response.xpath('//table//a[2]')
        for a in a_list:
            title = a.xpath('./@title').extract_first()
            href = a.xpath('./@href').extract_first()
            href = 'https://www.dygod.net' + href
            # 对链接进行访问,可以将值用meta传递給调用的函数
            yield scrapy.Request(url=href, callback=self.parse_second, meta={'title': title})

    def parse_second(self, res):
        src = res.xpath('//div[@id="Zoom"]//img/@src')
        title = res.meta['title']
        movie = DyttItem(title=title, src=src)
        yield movie

日志

  • 日志等级
LOG_LEVEL = 'CRITICAL/ERROR/WARNING/INFO/DEBUG'  # 对应不同的日志等级
  • 输出日志
LOG_FILE = 'log01.log'

post请求

  • post请求需要携带请求体才有意义
  • 直接通过parse方法,带着起始url访问是无效的
  • 要通过start_request方法,指定好请求参数之类的再请求
  • 通过scrapy.FormRequest发送post请求
import scrapy
import json

class TestpostSpider(scrapy.Spider):
    name = 'testPost'
    allowed_domains = ['fanyi.baidu.com']
    start_urls = ['https://fanyi.baidu.com/sug/']

    def start_requests(self):
        url = 'https://fanyi.baidu.com/sug/'
        data = {
            'kw': 'red'
        }
        # 发送post创建FormRequest
        yield scrapy.FormRequest(url=url, formdata=data, callback=self.second_parse)

    def second_parse(self, res):
        content = res.text
        obj = json.loads(content, encoding='utf-8')
        print(obj)

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

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

相关文章

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言&#xff1a; 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言&#xff1a; 随着现在Web应用的普…

【特征选择】基于二进制粒子群算法的特征选择方法(PNN概率神经网络分类)【Matlab代码#33】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 特征选择问题2. 二进制粒子群算法3. 概率神经网络&#xff08;PNN&#xff09;分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&…

day42_jsp

今日内容 零、 复习昨日 一、JSP 二、EL 三、JSTL 四、MVC 零、 复习昨日 一、JSP 1.0 引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注…

8.3:加强堆的应用

8.3&#xff1a;加强堆的应用 题目要求&#xff1a; 做一个加强堆的题目&#xff0c;给定一个整型数组&#xff0c;int[] arr&#xff1b;和一个布尔类型数组&#xff0c;boolean[] op 两个数组一定等长&#xff0c;假设长度为N&#xff0c;arr[i]表示客户编号&#xff0c;op…

【程序人生】上海城市开发者社区小聚有感

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

shell脚本入门-编写格式以及执行方式

Shell介绍 通过编写shell命令发送给linux内核去执行&#xff0c;操作就是计算机硬件&#xff0c;所以Shell命令是用户操作计算机硬件的桥梁 Shell是命令&#xff0c;类似与windows系统的Dos命令 Shell是一门程序设计语言&#xff0c;shell里面含有变量&#xff0c;函数&#xf…

低代码助力企业数字化转型:构建高效业务系统的新选择

在当今数字化时代&#xff0c;企业数字化转型已经成为业界的热门话题。随着全球各大企业逐渐意识到数字化转型的重要性&#xff0c;越来越多的公司开始采用低代码开发平台作为数字化转型的工具&#xff0c;以低成本高效率构建业务系统&#xff0c;实现数字化转型。 但现实情况是…

Less基础速学 —— 混入、运算、继承

Less 混合 在上一篇内容中就已经简单的了解了关于CSS预处理器 —— Less&#xff0c;本篇就往下讲Less中的混合&#xff0c;什么是混合&#xff1f;就是将一系列属性从一个规则集引入到另外一个规则集的方式。下面来看一下它的混合方式有哪些&#xff1f; 普通混合 <div …

使用OpenCvSharp来计算图像的清晰度(可实现相机自动对焦)

相机自动对焦&#xff0c;其实是对相机成像的清晰值得计算&#xff0c;若对焦不清晰&#xff0c;成像的清晰度低&#xff0c;视觉效果模糊。若是在工业检测行业&#xff0c;对焦不准确&#xff0c;可能导致信息不正确&#xff1b;对焦准确的图像&#xff0c;其清晰度高&#xf…

长连接心跳原理与机制工程上踩坑与优化

QA: 业务上对于心跳间隔一般怎么确定? 心跳间隔的确定一般需要根据具体业务场景和需求来进行。以下是一些常见的确定心跳间隔的方法&#xff1a; 根据应用场景和需求来确定心跳间隔。例如&#xff0c;在智能手环等健康监测设备中&#xff0c;心跳间隔通常设置为几秒钟到几分钟…

华为OD机试之过滤组合字符串(Java源码)

过滤组合字符串 题目描述 每个数字关联多个字母&#xff0c;关联关系如下&#xff1a; 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”,”r”6 关联 “s”,”t”7 关联 “u”…

六级备考24天|CET-6|翻译技巧4|翻译红楼梦|22:40~23:40

目录 作题步骤 红楼梦 12 PRACTICE ANSWER​ 时态问题 3 ANSWER 4 PRACTICE ANSWER ​ 5​ PRACTICE ANSWER 合并 ​ 全文翻译​ 作题步骤 不要拿到题目就动笔、一定要先读题、重建逻辑、找句子主干、有能力可以润色简化&#xff01; 红楼梦 12 PRACTICE Dream of th…

【java】leetcode 二叉树展开为链表

二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题&#xff1a; leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#x…

【Redis】共同关注列表与基于Feed流的关注消息滚动分页推送的实现

目录 一、共同关注 1、思路 2、实现步骤 二、Feed流 1、概念 2、需求 3、TimeLine的三种模式 1.拉 2.推 3.推拉结合 4、TimeLine三种模式的区别 三、关注推送 1、需求 2、实现思路 3、Redis数据结构的选择 4、滚动分页 5、代码实现 1.博主 2.粉丝 一、共同关…

Packet Tracer - 在 VTY 线路上配置 ACL

Packet Tracer - 在 VTY 线路上配置 ACL 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 路由器 F0/0 10.0.0.254 255.0.0.0 不适用 PC NIC 10.0.0.1 255.0.0.0 10.0.0.254 笔记本电脑 NIC 10.0.0.2 255.0.0.0 10.0.0.254 拓扑图 目标 第 1 部分&#…

企业性能测试全面解析,一步步教你进行性能测试!

目录 前言&#xff1a; 性能需求调研 性能测试计划制定 性能测试执行 性能测试结果分析与优化 结尾&#xff1a; 前言&#xff1a; 在软件开发过程中&#xff0c;性能测试是一个非常重要的环节。性能测试的主要目的是评估系统在负载情况下的响应时间、吞吐量、稳定性等指…

【C语言】二分查找(含图解)

文章目录 1. 二分查找思想2. 代码实现2.1 未封装函数2.2 封装函数&#xff08;使用while循环&#xff09;2.3 封装函数&#xff08;使用递归&#xff09; 1. 二分查找思想 二分法&#xff1a;二分查找算法是一种在有序数组中查找某一特定元素的搜索算法&#xff0c;其思想就是…

【Linux】多线程操作

文章目录 一. 线程库二. 多线程操作1. 线程创建2. 线程等待3. 线程退出4. 线程取消5. 线程分离6. 返回值 三. 多线程理解结束语 一. 线程库 在Linux下&#xff0c;并没有真正的线程&#xff0c;只有用进程模拟的轻量级进程&#xff0c;所以Linux并没有提供可以直接创建线程的接…

JavaScript教程(三)之 jQuery

JavaScript库 即library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在这个库中&#xff0c;封装了很多预先定义好的函数在里面&#xff0c;比如动画animate、hide、show&#xff0c;比如获取元素…

每日学术速递5.25

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Chupa: Carving 3D Clothed Humans from Skinned Shape Priors using 2D Diffusion Probabilistic Models 标题&#xff1a;Chupa&#xff1a;使用 2D 扩散概率模型从蒙皮形状先验雕…