Python爬虫基础知识学习(以爬取某二手房数据、某博数据与某红薯(书)评论数据为例)

news2024/10/6 12:19:37

一、爬虫基础流程

爬虫的过程模块化,基本上可以归纳为以下几个步骤:
1、分析网页URL:打开你想要爬取数据的网站,然后寻找真实的页面数据URL地址;
2、请求网页数据:模拟请求网页数据,这里我们介绍requests库的使用;
3、解析网页数据:根据请求获得的网页数据我们用不同的方式解析成我们需要用的数据(如果网页数据为html源码,我们用Beautiful Soup、xpath和re正则表达式三种解析;若网页数据为json格式,我们可以直接用字典列表等基础知识处理)
4、存储网页数据:一般来说,解析后的数据是比较结构化的,可以保存为txt、csv、json或excel等文本,亦或者可以存储在数据库如MySql、MongoDB或SqlLite中。

二、分析网页URL:

当我们有一个目标网站,有时候会发现对于静态网页,我们只需要把网页地址栏中的URL传到get请求中就可以直接取到网页的数据。但如果这是动态网页,我们便无法通过简单的传递网页地址栏的URL给get请求来获取网页数据,往往这个时候,我们进行翻页的时候还会发现网页地址栏中的URL是不会发生变化的。接下来,我们来分别介绍这两种情况下如何获取真实的页面数据URL地址。

1、静态网页

对于静态网页来说,其实网页地址栏中的URL就是我们需要的。
以贝壳二手房网(https://cd.ke.com/ershoufang/) 为例,我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL变为了(https://cd.ke.com/ershoufang/pg2/)。类型这种情况,多半就是静态网页了,而且翻页的URL规律十分明显。
如下图所示:

在这里插入图片描述
在这里插入图片描述

2、 动态网页

对于动态网页来说,我们一般可以通过以下几个步骤找到真实URL地址:
需要按“F12”进入到浏览器的开发者模式;
点击“Network”—>XHR或JS或者你全部查找看;
进行翻页(可能是点击下一页或者下滑加载更多);
观察第2步中name模块的内容变化,寻找。
以虎牙星秀区(https://www.huya.com/g/xingxiu) 为例,我们可以看到进行翻页(如到第2页)的时候网页地址栏的URL没有发生任何改变。
为了便于找到真实的URL地址,我们可以在开发者模式中找以下截图中的几点,preview是预览结果,可以便于我们进行匹配定位具体的Name。

在这里插入图片描述
在这里插入图片描述

当我们定位到具体的Name后,右侧选择Headers可以查看到请求网页需要的相关参数信息,而且比较好拟清其变化规律。以虎牙星秀为例,其真实URL地址及变化规律如下:
以某博为例(https://weibo.com/newlogin?tabtype=weibo&gid=102803&openLoginLayer=0&url=https%3A%2F%2Fwww.weibo.com%2F) 为例,我们可以看到一直往下拖拉时候网页地址栏的URL没有发生任何改变。这是我们需要按“F12”进入到浏览器的开发者模式,一边往下拖拉一边查看network里面内容的变化:

在这里插入图片描述

三、请求网页数据

当我们确定了真实数据的URL后,这里便可以用requests的get或post方法进行请求网页数据。关于requests库的更多使用方式,大家可以前往(https://requests.readthedocs.io/zh_CN/latest/ 或 https://www.cnblogs.com/aaronthon/p/9332757.html)查看。

1、发送get请求

(1)对于静态网页

在这里插入图片描述

我们得到的是一个Response对象,如果我们想要获取网页数据,可以使用text或content属性来获取,另外如果获取的网页数据是json格式的则可以使用Requests 中内置的 **json()**解码器方法,助你处理json 数据。

r.text:字符串类型的数据,一般网页数据为文本类用此属性
r.content:二进制类型的数据,一般网页数据为视频或者图片时用此属性
r.json():json数据解码,一般网页数据为json格式时用此方法
(2)对于动态网页
对于一些动态网页,请求的网址是基础url和关键字参数组合而成,这个时候我们可以使用 params 关键字参数,以一个字符串字典来提供这些参数。如下:
import requests
url = 'https://www.huya.com/cache.php'
parames = {'m': 'LiveList',
           'do': 'getLiveListByPage',
           'gameId': 1663,
           'tagAll': 0,
           'page': 2, # 翻页变化的就是这个参数
           }
r = requests.get(url, params=parames)
print(r.url)  # https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=2

2、发送post请求

通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))

此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)

3、定制请求头

在模拟请求时,如果不设置请求头的话是比较容易被网站发现是来自爬虫脚本,一些网站会对这种模拟请求进行拒绝。因此我们可以简单设置一下请求头做伪装,一般是设置浏览器。

headers = {
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
     }
r = requests.get(url, headers=headers)
其实,对于请求头还可以设置很多参数,具体大家可以在实际爬虫过程中在开发者模式看看里面的请求头模块进行分析处理。

在这里插入图片描述

4、响应码

我们在 2.1 中看到获取响应码的是通过 r.status_code属性,一般来说如果 返回 数字 200,则表示成功获取了网页数据。
响应码分为五种类型,由它们的第一位数字表示:1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接受、理解和采纳 3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误,请求包含语法错误或者请求无法实现 5xx:服务器错误,服务器不能实现一种明显无效的请求

四、解析数据

上面有提到我们请求的网页数据有Html源码文本或者是json字符串文本,两者的解析方式不同。以下我们分别进行简单说明,大家在实际操作中视情况而定即可。

1、网页html文本解析

对于网页html文本来说,这里介绍Beautiful Soup、xpath和re正则表达式三种解析方法。
以贝壳二手房最新房源(https://cd.ke.com/ershoufang/co32/)为例,其html源码如下,我们通过get请求后的数据进行解析。
(1)Beautiful Soup
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# 创建一个 soup 对象
soup = BeautifulSoup(html_doc, 'lxml')
print(soup, type(soup))  # <class 'bs4.BeautifulSoup'>
# 格式化文档输出
print(soup.prettify())
# 获取 title 标签的名称 title
print(soup.title.name)  # title
# 获取 title 标签内容
print(soup.title)  # <title>The Dormouse's story</title>
# title 标签里面的文本内容
print(soup.title.string)
# 获取 p 段落
print(soup.p)

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。
关于Beautiful Soup库的更多使用方式,大家可以前往查看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)
首先安装pip install beautifulsoup4。
我们将网页html文本内容r.text当作第一个参数传给BeautifulSoup对象,该对象的第二个参数为解析器的类型(这里使用lxml),此时就完成了BeaufulSoup对象的初始化。然后,将这个对象赋值给soup变量。如下所示:

from bs4 import BeautifulSoup
import requests
url = 'https://cd.ke.com/ershoufang/pg1/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

解析来分析网页,寻找节点:
在这里插入图片描述

发现所有数据都在class="sellListContent"节点下,因此对它下面的数据进行提取:
# 获取全部房源 所在的节点
sellList = soup.find(class_="sellListContent")
# 获取全部房源节点列表
lis = sellList.find_all('li',class_="clear")
# 选取第一个房源节点
div = lis[0].find('div',class_="info clear")
# 采集房源名称
title = div.find('div',class_="title")
print(title.text)

在这里插入图片描述
房源其他信息大家可以自己处理!!

(2)xpath

XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
在这里插入图片描述

首先导入 lxml 库的 etree 模块,然后声明一段 HTML 文本,调用 HTML 类进行初始化,成功构造一个 XPath 解析对象。
from lxml import etree
import requests
url = 'https://cd.ke.com/ershoufang/pg1/'
r = requests.get(url)
html = etree.HTML(r.text)

# 通过copy获取的xpath://*[@id="beike"]/div[1]/div[4]/div[1]/div[4]/ul/li[1]/div/div[1]/a
# 获取 全部房源所在节点 ul,根据属性匹配精准查找
ul = html.xpath('.//ul[@class="sellListContent"]')[0]
# 获取房源列表
lis = ul.xpath('.//li[@class="clear"]')
# 选取第一个房源节点
li = lis[0]
# 获取其房源名称
li.xpath('./div/div[1]/a/text()')

在这里插入图片描述
在这里插入图片描述
其他房源信息,大家可以自行处理!!

(3)re正则

关于re正则解析网页html大家也可以前往查看https://blog.csdn.net/wtt234/article/details/128360395进行学习。
在这里插入图片描述

2、json文本解析

在requests提供了r.json(),可以用于json数据解码,一般网页数据为json格式时用此方法。除此之外,还可以通过json.loads()和eval()方法进行处理。

url = 'https://www.huya.com/cache.php'
parames = {
     'm': 'LiveList',
     'do': 'getLiveListByPage',
     'gameId': 1663,
     'tagAll': 0,
     'page': 2, # 翻页变化的就是这个参数
     }
r = requests.get(url, params=parames)
data = r.json()
print(data)

在这里插入图片描述

五、存储数据

当我们获取了到想要的数据后,便可以写入本地了。
对于文本类数据,可以通过csv模块或pandas模块进行写入到本地csv文件或excel文件;同时也可以用pymysql模块写入到数据库或者sqlite写入到本地数据库。
对于视频或者图片,可以open一个文件然后写入二进制内容后保存本地亦可。
关于存储数据大家可以结合实际案例进行学习。

六、爬取、清洗并保存上面几个网站的数据完整代码带有解释

1、谋壳二手房数据:

正则提取数据保存在csv、xlsx与mysql里面
# coding:utf-8
import re,requests,time
import pandas as pd
import mysql.connector

class RenrenLogin(object):
    def __init__(self):
        # 设置存储数据文件路径
        self.csvlj = r"C:\Users\xxx\xxx\bk1.csv"
        self.excellj = r"C:\Users\xxx\xxx\bk2.xlsx"

    def get_html(self,url):
        # 由于获取的html最后是text(文本)形式,因此直接去掉文本里面的空格、换行符和回车符
        html = requests.get(url=url).text.replace("\n", "").replace("\r", "").replace(" ","")
        return html

    def parse_html(self, html):

        # 房源名称
        title = re.findall(r'<aclass="VIEWDATACLICKDATAmaidian-detail"title="(.*?)"', html, re.S)
        # 房源链接
        href = re.findall(r'<aclass="VIEWDATACLICKDATAmaidian-detail"title=".*?"data-hreftype=".*?"data-agentid=".*?"data-maidian=".*?"href="(.*?)"',html, re.S)
        # 房源信息
        houseinfo = re.findall(r'<spanclass="houseIcon"></span>(.*?)</div><divclass="followInfo">',html,re.S)
        # 关注量与发布天数
        starIcon = re.findall(r'<spanclass="starIcon"></span>(.*?)</div><divclass="tag">',html,re.S)
        # 房源总价格
        houseprice = re.findall(r'<divclass="totalPricetotalPrice2"><i></i><spanclass="">(.*?)</span><i></i></div>',html,re.S)
        # 房源单价
        unitPrice = re.findall(r'<divclass="unitPrice"data-hid=".*?"data-price=""><span>(.*?)</span></div>', html, re.S)
        # 房源其它优势
        housetag = re.findall(r'<divclass="tag">(.*?)</span></div><divclass="priceInfo">', html, re.S)

        self.parse_mysql(title, href, houseinfo, starIcon, houseprice, unitPrice, housetag)

        return title, href, houseinfo, starIcon, houseprice, unitPrice, housetag

    def parse_csv_excel(self,title,href,houseinfo,starIcon,houseprice,unitPrice,housetag):
        # 创建一个字典来表示数据
        data = {'itle': title,'href': href,'houseinfo': houseinfo,'starIcon':starIcon,'houseprice':houseprice,'unitPrice': unitPrice,'housetag':housetag}
        # 使用字典创建DataFrame
        df = pd.DataFrame(data)
        # 保存到csv文件里面
        df.to_csv(self.csvlj, index=False)
        # 保存到excel文件里面
        df.to_excel(self.excellj, index=False)

    def parse_mysql(self,title,href,houseinfo,starIcon,houseprice,unitPrice,housetag):
        # 连接到 MySQL 数据库
        conn = mysql.connector.connect(host="localhost",user="root",password="123456",database="beike")
        # 创建游标对象
        cursor = conn.cursor()
        # 创建表
        cursor.execute("""
        CREATE TABLE IF NOT EXISTS bk (
            id INT AUTO_INCREMENT PRIMARY KEY,
            title VARCHAR(500) NOT NULL,
            href VARCHAR(500) NOT NULL,
            houseinfo VARCHAR(500) NOT NULL,
            starIcon VARCHAR(500) NOT NULL,
            houseprice VARCHAR(500) NOT NULL,
            unitPrice VARCHAR(500) NOT NULL,
            housetag VARCHAR(1000) NOT NULL
        )
        """)
        # 执行插入数据操作
        for i in range(len(title)):
            sql_select = " insert into bk (title,href,houseinfo,starIcon,houseprice,unitPrice,housetag) values" + \
                         "('{}','{}','{}','{}','{}','{}','{}')".format(title[i],href[i],houseinfo[i],starIcon[i],houseprice[i],unitPrice[i],housetag[i])
            try:
                cursor.execute(sql_select)
            except Exception as e:
                print(e)
                conn.rollback()
        conn.commit()
        cursor.close()
        conn.close()

    def main(self,):
        title, href, houseinfo, starIcon, houseprice, unitPrice, housetag = [],[],[],[],[],[],[]
        for i in range(1, 3):  # 爬取前20页的数据,构建不同的页数url
            url = 'https://cd.ke.com/ershoufang/pg{}/'.format(i)
            spider1 = self.get_html(url)
            spider2 = self.parse_html(spider1)
            title = title + spider2[0]
            href = href + spider2[1]
            houseinfo = houseinfo + spider2[2]
            starIcon = starIcon + spider2[3]
            houseprice = houseprice + spider2[4]
            unitPrice = unitPrice + spider2[5]
            housetag = housetag + spider2[6]
            print(f"第{i}页爬取结束!")
            time.sleep(10)
        self.parse_csv_excel(title, href, houseinfo, starIcon, houseprice, unitPrice, housetag)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

结果如下:
在这里插入图片描述
在这里插入图片描述

2、某博数据的热门话题:

# coding:utf-8
import requests,time,os,openpyxl
from openpyxl import Workbook,load_workbook

class RenrenLogin(object):
    def __init__(self):
        # 设置存储数据文件路径
        self.csvlj = r"C:\Users\xxx\xxx\wb.csv"
        self.excellj = r"C:\Users\xxx\xxx\wb.xlsx"
        # 设置请求头
        self.headers = {
            'Accept': 'XXXXX',
            'Accept-Encoding': 'XXXXX',
            'Accept-Language': 'XXXXX',
            'Client-Version': 'XXXXX',
            'Cookie': 'XXXXXXXXXXXXXXXXX',
            'User-Agent': 'XXXXXXXXXXXXXXXXX'
        }

    def get_html(self, url):
        # 因此f12查看时,数据为json格式
        data1 = requests.get(url=url, headers=self.headers).json()
        return data1

    def parse_html(self, data1):
        for i in range(len(data1["statuses"])):
            alldata = []
            alldata.append(data1["statuses"][i]["user"]["screen_name"])  # User_title(发布用户的title)
            alldata.append(data1["statuses"][i]["source"])               # Info_Source(发布来源)
            alldata.append(data1["statuses"][i]["text_raw"])             # 发布内容
            alldata.append(data1["statuses"][i]["attitudes_count"])      # 点赞数量
            alldata.append(data1["statuses"][i]["comments_count"])       # 评论数量
            alldata.append(data1["statuses"][i]["reposts_count"])        # 转发数量
            self.parse_excel(alldata)
        return True

    def parse_excel(self, alldata):
        if not os.path.exists(self.excellj):
            workbook = Workbook()
            workbook.save(self.excellj)
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(['User_title', 'Info_Source', 'text_raw', 'attitudes_count', 'comments_count', 'reposts_count'])
            wa.append(alldata)
            wb.save(self.excellj)
        else:
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(alldata)
            wb.save(self.excellj)
        return True
    
    def main(self, ):
        for i in range(3):  # 爬取前3页的数据,构建不同的页数url
            url = 'https://weibo.com/ajax/feed/hottimeline?refresh=2&group_id=102803&containerid=102803&extparam=discover%7Cnew_feed&max_id={}&count=10'.format(i)
            spider1 = self.get_html(url)
            spider2 = self.parse_html(spider1)
            print(f"第{i+1}页爬取结束!")
            time.sleep(10)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

在这里插入图片描述

3、某红薯(书)数据爬取:

# coding:utf-8
import requests,time,os,openpyxl
from openpyxl import Workbook,load_workbook

class RenrenLogin(object):
    def __init__(self):
        # 设置存储数据文件路径
        self.excellj = r"C:\XXXXXXXXXXXXX\xhs.xlsx"
        self.headers = {
            'Cookie': 'XXXXXXXXXXXXX',
            'User-Agent': 'XXXXXXXXXXXXX',
            'X-S': 'XXXXXXXXXXXXX'
        }

    def get_html(self, url):
        data1 = requests.get(url=url, headers=self.headers).json()
        self.parse_html(data1)

    def parse_html(self, data1):
        for i in range(len(data1["data"]["comments"])):
            alldata = []
            alldata.append(data1["data"]["comments"][i]['user_info']['nickname'])
            alldata.append(data1["data"]["comments"][i]['content'])
            alldata.append(data1["data"]["comments"][i]['sub_comment_cursor'])
            alldata.append(data1["data"]["comments"][i]['sub_comment_count'])
            alldata.append(str(data1["data"]["comments"][i]['sub_comments']))
            alldata.append(data1["data"]["comments"][i]['like_count'])
            alldata.append(data1["data"]["comments"][i]['user_info']['image'])
            print(alldata)
            self.parse_excel(alldata)
        return True

    def parse_excel(self, alldata):
        if not os.path.exists(self.excellj):
            workbook = Workbook()
            workbook.save(self.excellj)
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(['nickname', 'content', 'sub_comment_cursor', 'sub_comment_count', 'sub_comments', 'like_count' ,'image'])
            wa.append(alldata)
            wb.save(self.excellj)
        else:
            wb = openpyxl.load_workbook(self.excellj)
            wa = wb.active
            wa.append(alldata)
            wb.save(self.excellj)
        return True

    def main(self, ):
        note_id = 'XXXXXXXXXXXXX'
        # 一级评论cursor
        cursor = ['','XXXXXXXXXXXXX','XXXXXXXXXXXXX','XXXXXXXXXXXXX','XXXXXXXXXXXXX','XXXXXXXXXXXXX']
        for i in range(len(cursor)):
            if i == 0:
                url = f"https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={note_id}&cursor=&top_comment_id=&image_formats=jpg,webp,avif"
            else:
                url = f'https://edith.xiaohongshu.com/api/sns/web/v2/comment/page?note_id={note_id}&cursor={cursor[i]}&top_comment_id=&image_formats=jpg,webp,avif'
            self.get_html(url)
            print(f"第{i+1}页爬取结束!")
            time.sleep(10)

if __name__ == '__main__':
    spider = RenrenLogin()
    spider.main()

在这里插入图片描述

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

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

相关文章

C++:菱形继承与菱形虚拟继承

一、菱形继承 单继承&#xff1a;一个子类只有一个直接父类时称这个继承关系为单继承 多继承&#xff1a;一个子类有两个或以上直接父类时称这个继承关系为多继承 菱形继承&#xff1a;菱形继承是多继承的一种特殊情况&#xff0c;派生类继承自两个间接基类&#xff0c;而这…

Java中的Mysql数据库备份与定时任务快速实现(详细代码示例)

引言 在现代软件系统中&#xff0c;数据库备份是确保数据安全的关键措施之一。通过定期备份&#xff0c;可以在数据丢失或损坏时迅速恢复&#xff0c;从而减少潜在的业务风险。Java作为一种广泛使用的编程语言&#xff0c;提供了多种实现数据库备份的方法。本文将介绍如何使用…

「网络流 24 题」太空飞行计划 【最大权值闭合图】

「网络流 24 题」太空飞行计划 题意 有 n n n 个实验 和 m m m 个器械&#xff0c;每个实验都需要若干个指定的器械才能进行 实验 i i i 的盈利为 p i p_i pi​&#xff0c; 器械 j j j 的花销为 c j c_j cj​ 找出纯利润最大的实验计划 思路 这是非常典型的最大权值…

独家专访辉羲智能章健勇:数据闭环定义芯片,帮车厂造中国版FSD

‍采访、编辑 |德新 撰文 |苗岭 辉羲智能&#xff0c;智能驾驶芯片行业最新的进入者。 这家公司成立于2022年&#xff0c;今年辉羲即将发布它的首款高阶智驾芯片。而另外两家智驾计算平台的头部公司地平线和黑芝麻已经在前不久分别向港交所提交了IPO申请。 国内的自动驾驶行…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第8章 TF启动

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

论文笔记模版

1. 摘要 1.1 背景 1.2 挑战 1.3 提出新方法 1.4 贡献 2. 引言 2.1 背景&#xff08;引出问题&#xff09; ①介绍大背景&#xff1a; ② 应用场景&#xff1a; ③ 介绍主题&#xff1a; 2.2 引出挑战 一般用图表来展现出我们的挑战&#xff08;直观&#xff0c;解决什…

速卖通揭秘:aliexpress.item_get API商品详情返回值全解析

速卖通&#xff08;AliExpress&#xff09;是阿里巴巴旗下的一个面向全球市场的B2C电商平台&#xff0c;为卖家提供了一个向全球消费者销售商品的平台。对于开发者来说&#xff0c;速卖通提供了API接口来方便地进行数据交互和集成。其中&#xff0c;item_get API是用于获取商品…

java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条

今天遇到一个问题 系统线上问题&#xff0c;经常出现这样的问题&#xff0c;刚重启系统时不报错了&#xff0c;可是运行一段时间又会出现。sql已经写了limit 1&#xff0c;mybatis的debug日志也返回total为1&#xff0c;可是却报错返回了1805条数据 乍一看&#xff0c;感觉太不…

【FTP】配置FTP服务器并访问测试(已更新)

1.之前访问搭建的FTP服务器&#xff0c;有些现场环境未搭建&#xff0c;在数据处理过程中遇到一些阻力&#xff0c;多有不便之处。 2.熟悉、梳理、总结下FTP服务器相关知识体系 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 基于Linux配置FTP服务器并访问测试文章目录索…

基于V4L2框架的摄像头从上层到底层开发

文章目录 一、V4L2应用开发1、识别摄像头2、查看摄像头设备的能力3、查看支持视频格式4、设置视频格式5、申请帧缓冲6、启动采集7、出队取一帧图像8、入队归还帧缓冲9、停止视频采集10、退出释放资源 二、V4L2框架源码分析1、struct video_device2、struct v4l2_device *v4l2_d…

unity ui 同屏

一共有三个摄像机&#xff0c;上屏&#xff0c;下屏 和 类似照相机的ccamera 类似照相机的ccamera的设置&#xff1a; 下屏摄像机设置&#xff1a; 下屏交互的Canvas设置&#xff1a; 新建一个canvas&#xff0c;下面放上rawimage&#xff1a; 如果下屏不想显示的内容&#xf…

【前端】实现快速改变内容大小选择框

简言 简单实现选择框改变内容大小和位置。 内容 这里实现选择框改变内容大小是让内容宽高等于选择框的百分之百&#xff0c;当选择框大小改变时&#xff0c;内容也会响应的改变。 位置则是根据定位实现的。 选择框 选择框就是一个div&#xff0c;然后定位上下左右四条边和…

Stable Diffusion【古风模型】:喜欢古风的看过来,超写实汉服兼顾现代风格大模型汉服国风桃夭

这次来介绍【Stable Diffusion【古风模型】&#xff1a;喜欢古风的看过来&#xff0c;超写实汉服兼顾现代风格大模型汉服国风桃夭】&#xff0c;对于汉服国风桃妖大模型&#xff0c;不仅在古装国风写实上表现出色&#xff0c;同时该模型也兼容现代风格&#xff0c;并且出图效果…

测试人员在面试时的注意事项

一、技术方面面试 在某种程度上来说&#xff0c;技术面试重要到能够决定你是否被聘用。在技术岗位方面&#xff0c;在个人品德没有问题的前提下&#xff0c;招聘公司对技术是最关心的。 我现在并不能给你分析具体的面试题&#xff0c;因为与笔试题相比&#xff0c;面试题千变万…

信创基础硬件之芯片

信创基础硬件之芯片 文章目录 信创基础硬件之芯片服务器服务器的定义服务器的功能服务器的构成服务器的性能 处理器&#xff08;CPU&#xff09;CPUGPUDPU CPU的分类按CPU指令集架构分类按CPU体系架构分类 CPU产业链六大国产CPU公司详解海光飞腾鲲鹏兆芯龙芯申威 国产CPU对比从…

自动群发国际短信脚本的详情介绍!

在当今全球化的商业环境中&#xff0c;信息的及时传递显得尤为重要&#xff0c;国际短信作为一种高效、低成本的沟通方式&#xff0c;被广泛应用于企业营销、客户服务、产品推广等领域。 为了满足企业对于群发国际短信的需求&#xff0c;市场上涌现出了许多自动群发国际短信脚…

Golang编译优化——稀疏条件常量传播

文章目录 一、概述二、稀疏条件常量传播2.1 初始化worklist2.2 构建def-use链2.3 更新值的lattice2.4 传播constant值2.5 替换no-constant值 一、概述 常量传播&#xff08;constant propagation&#xff09;是一种转换&#xff0c;对于给定的关于某个变量 x x x和一个常量 c …

初探MFC程序混合使用QT

一、背景 随着操作系统国产化替代的趋势越发明显&#xff0c;软件支持国际化、跨平台&#xff0c;已然是必须做的一件事情。原有的软件UI层用的是MFC&#xff0c;将其换成QT&#xff0c;想必是一种较好的方案。对于大型软件&#xff0c;特别是已发布&#xff0c;但还处于不断迭…

43.乐理基础-拍号-常见的拍号与强弱关系

首先拍号的定义&#xff1a;39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 通过 39.认识音符、40.什么是一拍、41.小节、小节线、终止线、42.看懂拍号的意义 应该可以知道 Y的取值只能是2、4、8、16、32、64。。。。因为Y指的是Y分音符&#xff0c;…

数据库数据恢复—Sql Server数据库文件丢失丢失怎么恢复数据?

数据库数据恢复环境&#xff1a; 5块硬盘组建一组RAID5阵列&#xff0c;划分LUN供windows系统服务器使用。windows系统服务器内运行了Sql Server数据库&#xff0c;存储空间在操作系统层面划分了三个逻辑分区。 数据库故障&#xff1a; 数据库文件丢失&#xff0c;主要涉及3个…