Python网络爬虫5 - 爬取QQ空间相册

2023-05-16

自毕业后,就再也没有用过QQ,QQ空间里记录的是些并不精彩的青葱岁月,但好歹也是份回忆,近日想着学以致用,用Python把QQ空间相册的所有照片爬取下来,以作备份。

分析QQ空间

登录QQ空间

爬取第一步,分析站点,首先需要知道如何登录QQ空间。最初想法是用requests库配置登录请求,模拟登录,但是不久便放弃了这一思路,请看下图↓

根据登录按钮绑定的监听事件可以追踪到该按钮的点击事件如下:

账号加密是必然的,但这一堆堆的代码真心不好解析,有耐心的勇士尽情一试!

在排除这种登录方法后,选择selenium模拟用户登录不失为省时省力的方法,而且我们只是需要通过selenium完成登录,获取到Cookies和后面讲述的g_tk参数后,就可以停用了,所以效率并不太低。

分析空间相册

登录以后,页面会跳转至 [https://user.qzone.qq.com/{QQ_NUMBER}](javascript:;), 这时把鼠标移到导航栏你会发现,所有的导航栏链接都是javascript:; ?。没错就是这么坑,一切都是暗箱操作。

当然这并不难处理,使用调试工具捕获点击后产生的请求,然后过滤出正确的请求包即可。因为网络包非常多,那么怎么过滤呢,猜想相册数据的API必然会返回个列表list,尝试过滤list然后逐个排除,最后定位到请求包。下面是通过fcg_list过滤后的数据包,列表信息以jsonp格式返回,稍作处理即可当做json格式来读取(后面有讲)。

HeadersResponse可以分别获取到两组重要信息:

  1. request 获取相册列表所需的请求信息,包括请求链接和参数
  2. response 数据包包含的所有相册的信息,是每个相册所含照片对应的请求包参数的数据来源

先看请求包:

# url
https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3

# args
g_tk: 477819917
callback: shine0_Callback
t: 691481346
hostUin: 123456789
uin: 123456789
appid: 4
inCharset: utf-8
outCharset: utf-8
source: qzone
plat: qzone
format: jsonp
notice: 0
filter: 1
handset: 4
pageNumModeSort: 40
pageNumModeClass: 15
needUserInfo: 1
idcNum: 4
callbackFun: shine0
_: 1551788226819
复制代码

其中hostUin, uin都是QQ号,g_tk是必须的且每次重新登录都会更新(后面有讲如何获取),其它有些参数不是必须的,我尝试后整理出如下请求参数:

query = {
    'g_tk': self.g_tk,
    'hostUin': self.username,
    'uin': self.username,
    'appid': 4,
    'inCharset': 'utf-8',
    'outCharset': 'utf-8',
    'source': 'qzone',
    'plat': 'qzone',
    'format': 'jsonp'
}
复制代码

接下来看jsonp格式的跨域响应包:

shine0_Callback({
    "code":0,
    "subcode":0,
    "message":"",
    "default":0,
    "data":
{
   "albumListModeSort" : [
      {
         "allowAccess" : 1,
         "anonymity" : 0,
         "bitmap" : "10000000",
         "classid" : 106,
         "comment" : 11,
         "createtime" : 1402661881,
         "desc" : "",
         "handset" : 0,
         "id" : "V13LmPKk0JLNRY",
         "lastuploadtime" : 1402662103,
         "modifytime" : 1408271987,
         "name" : "毕业季",
         "order" : 0,
         "pre" : "http:\/\/b171.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfGuwSk58K2rQY!\/a\/dIY29GUbJgAA",
         "priv" : 1,
         "pypriv" : 1,
         "total" : 4,
         "viewtype" : 0
      },
复制代码

shine0_Callback是请求包的callbackFun参数决定的,如果没这个参数,响应包会以_Callback作为默认名,当然这都不重要。所有相册信息以json格式存入albumListModeSort中,上面仅截取了一个相册的信息。

相册信息中,name代表相册名称,id作为唯一标识可用于请求该相册内的照片信息,而pre仅仅是一个预览缩略图的链接,无关紧要。

分析单个相册

与获取相册信息类似,进入某一相册,使用cgi_list过滤数据包,找到该相册的照片信息

同样的道理,根据数据包可以获取照片列表信息的请求包和响应信息,先看请求:

# url
https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo

# args
g_tk: 477819917
callback: shine0_Callback
t: 952444063
mode: 0
idcNum: 4
hostUin: 123456789
topicId: V13LmPKk0JLNRY
noTopic: 0
uin: 123456789
pageStart: 0
pageNum: 30
skipCmtCount: 0
singleurl: 1
batchId: 
notice: 0
appid: 4
inCharset: utf-8
outCharset: utf-8
source: qzone
plat: qzone
outstyle: json
format: jsonp
json_esc: 1
question: 
answer: 
callbackFun: shine0
_: 1551790719497
复制代码

其中有几个关键参数:

  1. g_tk - 与相册列表参数一致
  2. topicId - 与相册列表参数中的id一致
  3. pageStart - 本次请求照片的起始编号
  4. pageNum - 本次请求的照片数量

为了一次性获取所有照片,可以将pageStart设为0,pageNum设为所有相册所含照片的最大值。

同样可以对上面的参数进行简化,在相册列表请求参数的基础上添加topicIdpageStartpageNum三个参数即可。

下面来看返回的照片列表信息:

shine0_Callback({
    "code":0,
    "subcode":0,
    "message":"",
    "default":0,
    "data":
{
   "limit" : 0,
   "photoList" : [
      {
         "batchId" : "1402662093402000",
         "browser" : 0,
         "cameratype" : " ",
         "cp_flag" : false,
         "cp_x" : 455,
         "cp_y" : 388,
         "desc" : "",
         "exif" : {
            "exposureCompensation" : "",
            "exposureMode" : "",
            "exposureProgram" : "",
            "exposureTime" : "",
            "flash" : "",
            "fnumber" : "",
            "focalLength" : "",
            "iso" : "",
            "lensModel" : "",
            "make" : "",
            "meteringMode" : "",
            "model" : "",
            "originalTime" : ""
         },
         "forum" : 0,
         "frameno" : 0,
         "height" : 621,
         "id" : 0,
         "is_video" : false,
         "is_weixin_mode" : 0,
         "ismultiup" : 0,
         "lloc" : "NDN0sggyKs3smlOg6eYghjb0ZRsmAAA!",
         "modifytime" : 1402661792,
         "name" : "QQ图片20140612104616",
         "origin" : 0,
         "origin_upload" : 0,
         "origin_url" : "",
         "owner" : "123456789",
         "ownername" : "123456789",
         "photocubage" : 91602,
         "phototype" : 1,
         "picmark_flag" : 0,
         "picrefer" : 1,
         "platformId" : 0,
         "platformSubId" : 0,
         "poiName" : "",
         "pre" : "http:\/\/b171.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfSk58K2rQY!\/a\/dIY29GUbJgAA&bo=pANtAgAAAAABCeY!",
         "raw" : "http:\/\/r.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfSk58K2rQY!\/r\/dIY29GUbJgAA",
         "raw_upload" : 1,
         "rawshoottime" : 0,
         "shoottime" : 0,
         "shorturl" : "",
         "sloc" : "NDN0sggyKs3smlOg6eYghjb0ZRsmAAA!",
         "tag" : "",
         "uploadtime" : "2014-06-13 20:21:33",
         "url" : "http:\/\/b171.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfSk58K2rQY!\/b\/dIY29GUbJgAA&bo=pANtAgAAAAABCeY!",
         "width" : 932,
         "yurl" : 0
      },
      // ...
   ]
   "t" : "952444063",
   "topic" : {
      "bitmap" : "10000000",
      "browser" : 0,
      "classid" : 106,
      "comment" : 1,
      "cover_id" : "NDN0sggyKs3smlOg6eYghjb0ZRsmAAA!",
      "createtime" : 1402661881,
      "desc" : "",
      "handset" : 0,
      "id" : "V13LmPKk0JLNRY",
      "is_share_album" : 0,
      "lastuploadtime" : 1402662103,
      "modifytime" : 1408271987,
      "name" : "毕业季",
      "ownerName" : "707922098",
      "ownerUin" : "707922098",
      "pre" : "http:\/\/b171.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfGuwSk58K2rQY!\/a\/dIY29GUbJgAA",
      "priv" : 1,
      "pypriv" : 1,
      "share_album_owner" : 0,
      "total" : 4,
      "url" : "http:\/\/b171.photo.store.qq.com\/psb?\/V13LmPKk0JLNRY\/eSAslg*mYWaytEtLysg*Q*5Km91gIWfGuwSk58K2rQY!\/b\/dIY29GUbJgAA",
      "viewtype" : 0
   },
   "totalInAlbum" : 4,
   "totalInPage" : 4
}
复制代码

返回的照片信息都存于photoList, 上面同样只截取了一张照片的信息,后面一部分返回的是当前相册的一些基本信息。totalInAlbumtotalInPage存储了当前相册总共包含的照片数及本次返回的照片数。而我们需要下载的图片链接则是url

OK, 到此,所有请求和响应数据都分析清楚了,接下来便是coding的时候了。

确定爬取方案

  1. 创建qqzone类,初始化用户信息
  2. 使用Selenium模拟登录
  3. 获取Cookiesg_tk
  4. 使用requests获取相册列表信息
  5. 遍历相册,获取照片列表信息并下载照片

创建qqzone类

class qqzone(object):
    """QQ空间相册爬虫"""
    def __init__(self, user):
        self.username = user['username']
        self.password = user['password']
复制代码

模拟登录

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import WebDriverExceptio

# ...

def _login_and_get_args(self):
    """登录QQ,获取Cookies和g_tk"""
    opt = webdriver.ChromeOptions()
    opt.set_headless()

    driver = webdriver.Chrome(chrome_options=opt)
    driver.get('https://i.qq.com/')
    # time.sleep(2)

    logging.info('User {} login...'.format(self.username))
    driver.switch_to.frame('login_frame')
    driver.find_element_by_id('switcher_plogin').click()
    driver.find_element_by_id('u').clear()
    driver.find_element_by_id('u').send_keys(self.username)
    driver.find_element_by_id('p').clear()
    driver.find_element_by_id('p').send_keys(self.password)
    driver.find_element_by_id('login_button').click()

    time.sleep(1)
    driver.get('https://user.qzone.qq.com/{}'.format(self.username))
复制代码

此处需要注意的是:

  1. 使用selenium需要安装对应的webdriver
  2. 可以通过webdriver.Chrome()指定浏览器位置,否则默认从环境变量定义的路径查找
  3. 如果电脑打开浏览器较慢,可能需要在driver.getsleep几秒

获取 Cookies

使用selenium获取Cookies非常方便

self.cookies = driver.get_cookies()
复制代码

获取 g_tk

获取g_tk最开始可以说是本爬虫最大的难点,因为从网页中根本找不到直接写明的数值,只有各种函数调用。为此我全局搜索,发现好多地方都有其获取方式。

最后选择了其中一处,通过selenium执行脚本的功能成功获取到了g_tk

self.g_tk = driver.execute_script('return QZONE.FP.getACSRFToken()')
复制代码

到此,selenium的使命就完成了,剩下的将通过requests来完成。

初始化 request.Session

接下来需要逐步生成请求然后获取数据。但是为方便起见,这里使用会话的方式请求数据,配置好cookieheaders,省的每次请求都设置一遍。

def _init_session(self):
    self.session = requests.Session()
    for cookie in self.cookies:
        self.session.cookies.set(cookie['name'], cookie['value'])
    self.session.headers = {
        'Referer': 'https://qzs.qq.com/qzone/photo/v7/page/photo.html?init=photo.v7/module/albumList/index&navBar=1',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
    }
复制代码

请求相册信息

获取相册信息,需要先封装好请求参数,然后通过session.get爬取数据,再通过正则匹配以json格式读取jsonp数据,最后解析所需的nameid

def _get_ablum_list(self):
    """获取相册的列表信息"""
    album_url = '{}{}'.format(
        'https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3?',
        self._get_query_for_request())

    logging.info('Getting ablum list id...')
    resp = self.session.get(album_url)
    data = self._load_callback_data(resp)

    album_list = {}
    for item in data['data']['albumListModeSort']:
        album_list[item['name']] = item['id']

    return album_list
复制代码

其中的参数组合来自下面的函数_get_query_for_request函数。

def _get_query_for_request(self, topicId=None, pageStart=0, pageNum=100):
    """获取请求相册信息或照片信息所需的参数

    Args:
        topicId: 每个相册对应的唯一标识符
        pageStart: 请求某个相册的照片列表信息所需的起始页码
        pageNum: 单次请求某个相册的照片数量

    Returns:
        一个组合好所有请求参数的字符串
    """
    query = {
        'g_tk': self.g_tk,
        'hostUin': self.username,
        'uin': self.username,
        'appid': 4,
        'inCharset': 'utf-8',
        'outCharset': 'utf-8',
        'source': 'qzone',
        'plat': 'qzone',
        'format': 'jsonp'
    }
    if topicId:
        query['topicId'] = topicId
        query['pageStart'] = pageStart
        query['pageNum'] = pageNum
    return '&'.join('{}={}'.format(key, val) for key, val in query.items())
复制代码

其中的jsonp解析函数如下,主体部分就是一个正则匹配,非常简单。

def _load_callback_data(self, resp):
    """以json格式解析返回的jsonp数据"""
    try:
        resp.encoding = 'utf-8'
        data = loads(re.search(r'.*?\(({.*}).*?\).*', resp.text, re.S)[1])
        return data
    except ValueError:
        logging.error('Invalid input')
复制代码

解析并下载照片

获取相册列表后,逐个请求照片列表信息,进而逐一下载

def _get_photo(self, album_name, album_id):
    """获取单个相册的照片列表信息,并下载该相册所有照片"""
    photo_list_url = '{}{}'.format(
        'https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo?',
        self._get_query_for_request(topicId=album_id))

    logging.info('Getting photo list for album {}...'.format(album_name))
    resp = self.session.get(photo_list_url)
    data = self._load_callback_data(resp)
    if data['data']['totalInPage'] == 0:
        return None

    file_dir = self.get_path(album_name)
    for item in data['data']['photoList']:
        path = '{}/{}.jpg'.format(file_dir, item['name'])
        logging.info('Downloading {}-{}'.format(album_name, item['name']))
        self._download_image(item['url'], path)
复制代码

下载图片也是通过request,记得设置超时时间。

def _download_image(self, url, path):
    """下载单张照片"""
    try:
        resp = self.session.get(url, timeout=15)
        if resp.status_code == 200:
            open(path, 'wb').write(resp.content)
    except requests.exceptions.Timeout:
        logging.warning('get {} timeout'.format(url))
    except requests.exceptions.ConnectionError as e:
        logging.error(e.__str__)
    finally:
        pass
复制代码

爬取测试

  • 爬取过程

  • 爬取结果

写在最后

  1. 如果将请求参数中的formatjsonp改成json,则可以直接获取json数据
  2. 本用例并未使用多进程或多线程,所以速率不算快,还有待优化的地方
  3. 该爬虫已存放至开源项目Github capturer,欢迎交流

本文首发于www.litreily.top

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python网络爬虫5 - 爬取QQ空间相册 的相关文章

  • 通信upf是什么意思_管理UPF的方法、装置及系统与流程

    本发明涉及通信领域 xff0c 具体而言 xff0c 涉及一种管理UPF 用户面功能 xff0c User plane function 的方法 装置及系统 背景技术 xff1a 图1是根据相关技术的3GPP演进分组系统的结构示意图 xff
  • signature=eb47f6441363b915ee5eb8456d7928a2,yarn.lock

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 abbrev 64 1 version 34 1 1 1 34 resolved 3
  • 绝地求生现在服务器稳定吗,吃鸡服务器不稳定?《绝地求生》国服宣布将首次使用超性能服务器...

    2月26日消息 要说目前最受国内游戏爱好者期待的游戏 xff0c 相信不少小伙伴都会投火遍全球的 绝地求生 一票 xff01 而据最新消息显示 xff0c 为了给玩家们带来更加优秀的游戏体验 xff0c 绝地求生 国服将首次使用超性能服务器
  • 微信服务器是否记录视频信息,微信视频号有访客记录吗 微信视频号可以查看浏览记录吗...

    视频号是微信的一个全新版块 xff0c 我们可以在视频号浏览视频号发布的短视频 xff0c 同时还可以进行点赞 留言 转发等操作 xff0c 那我们自行发布的视频 xff0c 微信视频号有访客记录吗 xff1f 下面就和IT百科一起来看看吧
  • 萨克斯维修服务器,萨克斯常见故障修理方法

    原标题 xff1a 萨克斯常见故障修理方法 1 如果某一按键突然停止工作了 xff0c 那就检测一下相应的弹簧 xff0c 如果是破裂或是遗失 xff0c 可以暂时用硬橡胶带来代替 记住在演奏完毕后要除去橡胶带 xff0c 因为从长远来看它
  • I2C通讯协议介绍

    2019独角兽企业重金招聘Python工程师标准 gt gt gt I2C总线是PHLIPS公司在20世纪80年代推出的一种串行总线 具有引脚少 xff0c 硬件实现简单 xff0c 可扩展性强的优点 I2C总线的另一优点是支持多主控 xf
  • postman linux 使用教程,Postman 的实用功能

    封面图 前言 基础使用 Collection Environment Test Collection Runner 参考资料 关于我 前言 我是一个 Android 开发工程师 xff0c 日常开发中最免不了的就是使用 Postman 进行
  • UART和RS232、RS485的基础知识

    博客目录 xff1a 1 UART和RS232 RS485的关系 xff1a 2 RS232和RS485的区别和引脚介绍 3 参考文献 正文如下 一 UART和RS232 RS485的关系 xff1a 通讯问题 xff0c 和交通是一样的
  • C语言截取字符串

    1 从左边截取指定长度的字符串 代码功能 xff1a 从字符串开头 xff0c 截取指定长度的字符 include lt stdio h gt include lt wiringPi h gt int main char arr 128 6
  • 【Android-3】Android中的任务栈(Task)

    一 Android任务栈 概述 xff1a Android中的任务栈其实就是Activity的集合 xff0c 在Android中退出程序的时候必须把任务栈中的所有Activity清除出栈 xff0c 此时才能安全的完全的退出程序 xff0
  • Boost 和 STL 相比有哪些优势和劣势?

    1 在设计原则上 xff0c STL和Boost大体统一 因为STL和Boost基本上都是标准委员会那批人在策划 审核和维护 xff0c 所以口味上是相对接近的 但是因为Boost并不在标准中 xff0c 或者说是下一代标准的试验场 xff
  • udp通信 c 语言,Windows程序设计 | 基于UDP的C/S通讯实现

    作者小序 今天翘课一天 xff0c 本打算一个早上写完网络编程实验报告就出去溜达 xff0c 结果从早上九点到这会没出过宿舍门 xff0c 宅到不能再宅了 xff0c 哎 xff0c 一首凉凉送给自己 分享一下干货吧 xff0c windo
  • Linux 下tcp编程例子

    服务器端server程序 编译命令 xff1a gcc Wall g o server server c lpthread include lt stdio h gt include lt string h gt include lt st
  • 微信开发者工具配置服务器信息,微信开发者中心如何配置

    微信开发者中心配置是怎么样的呢 xff0c 那么微信开发者中心又是如何配置的呢 下面是学习啦小编收集整理的微信开发者中心如何配置 xff0c 希望对大家有帮助 微信开发者中心配置的方法 工具 原料 一台电脑和一个微信公众号 需要再SEA上部
  • 【尖端干货】H.264编码下直播视频添加水印的优化

    2016年被称为 中国网络直播元年 xff0c 网络直播已成为网络文化领域重要的经营模式和文化市场的重要组成部分 而以 直播造人 事件为节点 xff0c 直播行业进入了严格规范化的时期 xff0c 鉴黄 版权保护越来越受到直播行业的关注 在
  • C++ 防止重定义

    防止重定义有2种方法 xff1a 第一种 xff1a ifndef MY HEAD H INCLUDED define MY HEAD H INCLUDED endif MY HEAD H INCLUDED 此种方案是一种很通用的方案 xf
  • 51单片机串口通讯c语言程序,如何使用51单片机实现串口通信

    描述 STC51单片机一般带有1个串口 xff0c 有的带有2个串口 xff0c 串口一般用于下载程序和串口通信 串口通信特别适合控制设备 xff0c 所以工控机的电脑上一般都带有串口 51单片机的串口引脚为P3 0引脚与P3 1引脚 xf
  • nautilus命令

    nautilus 是图形程式 效果是以当前用户打开图形界面 所以如果想以root打开图形界面 使用时记得先切为root xff0c sudo没有用的 转载于 https www cnblogs com wangshaowei p 90313
  • 如何在SV中使用结构体struct语法

    前言 测试下可综合的struct xff0c struct和interface的区别 xff1a 两者都可以是信号的组合 xff0c 但interface可以定义信号的不同方向 xff0c 而struct中的所有信号都是同向的 struct
  • http digest

    HTTP digest 摘要访问认证是一种协议规定的Web服务器用来同网页浏览器进行认证信息协商的方法 它在密码发出前 xff0c 先对其应用哈希函数 xff0c 这相对于HTTP基本认证发送明文而言 xff0c 更安全 从技术上讲 xff

随机推荐

  • 理解字节序

    1 计算机硬件有两种储存数据的方式 xff1a 大端字节序 xff08 big endian xff09 和小端字节序 xff08 little endian xff09 举例来说 xff0c 数值0x2211使用两个字节储存 xff1a
  • Solaris 10整合apache与php过程及出错处理

    Solaris 10 整合 apache 与 php 过程及出错处理 lt xml namespace prefix 61 o ns 61 34 urn schemas microsoft com office office 34 gt 作
  • 去百度API的百度地图准确叠加和坐标转换的解决方案研究

    文章版权由作者李晓晖和博客园共有 xff0c 若转载请于明显处标明出处 xff1a http www cnblogs com naaoveGIS 1 背景 目前项目上如果要使用百度地图 xff0c 得加载百度的开发包 xff0c 然后通过百
  • 7款纯CSS3实现的炫酷动画应用

    1 纯CSS3实现人物摇头动画 这次我们要来分享一款超级可爱的纯CSS3人物摇头动画 xff0c 初始化的时候人物的各个部位是利用CSS3动画效果拼接而成 xff0c 接下来就是人物听音乐的场景 xff0c 一边听音乐一边摇着脑袋 xff0
  • 快速将自己的应用程序做成安装包

    打包程序的方式多种多样 xff0c 比如大家常用的VS NSIS等等 xff0c 但对于一个简单的应用程序 xff0c 如果你不涉及复杂的安装设置 xff0c 那么压缩工具 xff0c 是个不错的选择 当然用压缩工具制作程序安装包已经不是什
  • 关于小程序websocket全套解决方案,Nginx代理wss

    需求对话 提问 我在本地web能够使用ws协议去链接websocket xff0c 但是小程序不能使用 回答 由于小程序使用的是SSL加密协议 xff0c 所以需要使用wss 这里wss与ws的关系就相当于https于http的关系 提问
  • 打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)

    概述 打印指令 xff0c 又称打印控制命令 计算机通过打印控制语言 xff0c 以软件命令的方法来控制打印机操作 xff0c 解释执行打印数据 xff0c 获得打印结果的 对于打印机所实现的复杂功能而言 xff0c 打印控制语言是基础 它
  • Hive - truncate partition、drop partition 区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Hive 有两种方法删除指定parition的数据 xff1a truncate partition drop parition 功能 xff1a 两者都用于删除数据 xf
  • ca-bundle.crt文件,用于php发起外部https请求

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Bundle of CA Root Certificates Certificate data from Mozilla downloaded on Wed Aug 13
  • 执行truffle unbox react报错,出现Error: connect ECONNREFUSED 0.0.0.0:443问题的解决办法

    前提 xff1a 我是用的是MAC系统 xff0c 不知道使用windows系统是否也可以 react box 项目构建 localhost ReactDapp liyuechun truffle unbox react box Start
  • 如何合并PDF文件?教你几种超简单的方法

    如何合并PDF文件呢 xff1f 我们在工作中会遇到很多难以处理的文件 xff0c 比如PDF文件就是一种 xff0c 尤其是将多个PDF文件合并成一个PDF文件 xff0c xff0c 其实大多数人都不知道将其合并 xff0c 盲目的在网
  • not a valid identifier解决

    not a valid identifier不是有效的标识符 因为在 usr的 多加了一个空格 xff0c 导致JAVA Home 无法识别 转载于 https www cnblogs com wxd136 p 10332040 html
  • asp链接数据库[转]

    1 ASP连接Access数据库语句 Set Conn 61 Server CreateObject 34 ADODB Connection 34 Connstr 61 34 DBQ 61 34 43 server mappath 34 w
  • OpenGL纹理映射

    GLfloat xrot X 旋转量 GLfloat yrot Y 旋转量 GLfloat zrot Z 旋转量 GLuint texture 1 存储一个纹理 AUX RGBImageRec LoadBMP char Filename 载
  • 【转】设置Qt应用程序图标及应用程序名

    一直以来很纠结给qt应用程序添加图标问题 xff0c 在网上收过一次 xff0c 但是感觉不够完整 xff0c 现将自己的实现过程记录下 xff0c 以便以后查看 xff1a 通过网上的例子知道qt助手中有相关说明 xff1a Settin
  • studioone机架效果模板_贾爽的分享-贾爽:带你认识StudioOne机架自带的两个混响效果器!...

    作者姓名 xff1a 贾爽 xff0c 现居河南省南阳市 xff0c 音视频软硬件产品的意见领袖 xff0c 网络主播培训指导讲师 xff0c 爽哥KX驱动工具 制作者 xff0c 南阳标题网络技术有限公司创始人 xff0c 河南省流行音乐
  • HTTP认证用户名密码 php

    header 39 HTTP 1 1 401 Authorization Required 39 header 39 WWW Authenticate Basic realm 61 34 PHP Secured 34 39 用户名和口令列表
  • C++ 存储类

    C 43 43 存储类 存储类定义 C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出 C 43 43 程序中可用的存储类 xff1a auto registe
  • 怎么在VS监视DataSet类型的数据

    旧版本 先监视DataSet xff0c 打开dataset dataset下面有一个tables Tables打开有一个非公共成员 xff0c 然后下面有一个List xff0c List中存储了每一张表的信息 下图所示的List下面的
  • Python网络爬虫5 - 爬取QQ空间相册

    自毕业后 xff0c 就再也没有用过QQ xff0c QQ空间里记录的是些并不精彩的青葱岁月 xff0c 但好歹也是份回忆 xff0c 近日想着学以致用 xff0c 用Python把QQ空间相册的所有照片爬取下来 xff0c 以作备份 分析