上分宝:值得大家信赖的下载网站!
时间:2023-04-10 08:13:20来源:互联网
网上有很多关于qq空间网页版,qq空间网页版的知识,也有很多人为大家解答关于qq空间网页的问题,今天上分宝游戏网为大家整理了关于这方面的知识,让我们一起来看下吧!
1、qq空间网页
分析QQ空间
登录QQ空间
爬取第一步,分析站点,首先需要知道如何登录QQ空间。最初想法是用requests库配置登录请求,模拟登录,但是不久便放弃了这一思路,请看下图↓
login
根据登录按钮绑定的监听事件可以追踪到该按钮的点击事件如下:
login function
账号加密是必然的,但这一堆堆的代码真心不好解析,有耐心的勇士尽情一试!
在排除这种登录方法后,选择selenium模拟用户登录不失为省时省力的方法,而且我们只是需要通过selenium完成登录,获取到cookies和后面讲述的g_tk参数后,就可以停用了,所以效率并不太低。
分析空间相册
登录以后,页面会跳转至 [https://img.shangfenbao.com/news/2023/04/10/vlpnrp04kua 这时把鼠标移到导航栏你会发现,所有的导航栏链接都是javascript:; 。没错就是这么坑,一切都是暗箱操作。
当然这并不难处理,使用调试工具捕获点击后产生的请求,然后过滤出正确的请求包即可。因为网络包非常多,那么怎么过滤呢,猜想相册数据的API必然会返回个列表list,尝试过滤list然后逐个排除,最后定位到请求包。下面是通过fcg_list过滤后的数据包,列表信息以jsonp格式返回,稍作处理即可当做json格式来读取(后面有讲)。
album list
从Headers和Response可以分别获取到两组重要信息:
request 获取相册列表所需的请求信息,包括请求链接和参数response 数据包包含的所有相册的信息,是每个相册所含照片对应的请求包参数的数据来源先看请求包:
# urlhttps://img.shangfenbao.com/news/2023/04/10/ontcmjwzttk argsg_tk: 477819917callback: shine0_Callbackt: 691481346hostUin: 123456789uin: 123456789appid: 4inCharset: utf-8outCharset: utf-8source: qzoneplat: qzoneformat: jsonpnotice: 0filter: 1handset: 4pageNumModeSort: 40pageNumModeClass: 15needUserInfo: 1idcNum: 4callbackFun: 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过滤数据包,找到该相册的照片信息
photo list
同样的道理,根据数据包可以获取照片列表信息的请求包和响应信息,先看请求:
# urlhttps://img.shangfenbao.com/news/2023/04/10/2ypqtyhp43m argsg_tk: 477819917callback: shine0_Callbackt: 952444063mode: 0idcNum: 4hostUin: 123456789topicId: V13LmPKk0JLNRYnoTopic: 0uin: 123456789pageStart: 0pageNum: 30skipCmtCount: 0singleurl: 1batchId: notice: 0appid: 4inCharset: utf-8outCharset: utf-8source: qzoneplat: qzoneoutstyle: jsonformat: jsonpjson_esc: 1question: answer: callbackFun: shine0_: 1551790719497
其中有几个关键参数:
g_tk - 与相册列表参数一致topicId - 与相册列表参数中的id一致pageStart - 本次请求照片的起始编号pageNum - 本次请求的照片数量为了一次性获取所有照片,可以将pageStart设为0,pageNum设为所有相册所含照片的最大值。
同样可以对上面的参数进行简化,在相册列表请求参数的基础上添加topicId,pageStart和pageNum三个参数即可。
下面来看返回的照片列表信息:
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="540px",height="auto" />
返回的照片信息都存于photoList, 上面同样只截取了一张照片的信息,后面一部分返回的是当前相册的一些基本信息。totalInAlbum, totalInPage存储了当前相册总共包含的照片数及本次返回的照片数。而我们需要下载的图片链接则是url!
OK, 到此,所有请求和响应数据都分析清楚了,接下来便是coding的时候了。
确定爬取方案
创建qqzone类,初始化用户信息使用Selenium模拟登录获取Cookies和g_tk使用requests获取相册列表信息遍历相册,获取照片列表信息并下载照片创建qqzone类
class qqzone(object): """QQ空间相册爬虫""" def __init__(self, user): self.username = user[\'username\'] self.password = user[\'password\']
模拟登录
from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom 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://img.shangfenbao.com/news/2023/04/10/1rggao1y1ky # 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://img.shangfenbao.com/news/2023/04/10/32calgleaue Cookies
使用selenium获取Cookies非常方便
self.cookies = driver.get_cookies()
获取 g_tk
获取g_tk最开始可以说是本爬虫最大的难点,因为从网页中根本找不到直接写明的数值,只有各种函数调用。为此我全局搜索,发现好多地方都有其获取方式。
g_tk
最后选择了其中一处,通过selenium执行脚本的功能成功获取到了g_tk!
self.g_tk = driver.execute_script(\'return QZONE.FP.getACSRFToken()\')
到此,selenium的使命就完成了,剩下的将通过requests来完成。
初始化 request.session
接下来需要逐步生成请求然后获取数据。但是为方便起见,这里使用会话的方式请求数据,配置好cookie和headers,省的每次请求都设置一遍。
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://img.shangfenbao.com/news/2023/04/10/y0jpndz1nlh.html \'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数据,最后解析所需的name和id。
def _get_ablum_list(self): """获取相册的列表信息""" album_url = \'{}{}\'.format( \'https://img.shangfenbao.com/news/2023/04/10/bqon30hbauc 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://img.shangfenbao.com/news/2023/04/10/ugegnvcodgr 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
爬取测试
爬取过程capturing
爬取结果downloaded photos
写在最后
如果将请求参数中的format由jsonp改成json,则可以直接获取json数据本用例并未使用多进程或多线程,所以速率不算快,还有待优化的地方申请关闭QQ空间网页的方法步骤:
1、点击官方链接,进入官方关闭QQ空间的界面;
2、按照界面要求输入QQ号和密码并点击登陆;
3、在QQ空间关闭申请中填写相关选项后输入验证码;
4、点击提交关闭申请。
注意:关闭以后,所有数据将清空,重新打开时,所有日志、模块、音乐、图片都会清除,请慎重考虑。
qq空间看网页版步骤。
1、打开浏览器在电脑桌面上找到浏览器图标并打开浏览器。
2、搜索在搜索框内输入qq空间并点击搜索的图标。
3、进入官网点击官网网站念族悔链仔正接即可进入网页。
4、输穗闹入QQ帐号和密码,再点击登录即可进入网页版qq空间。
用手机登录网页版的QQ空间的具体步骤如下:我们需要准备的材料有:手机、浏览器。
1、首先我们打开浏览器,点击搜索“QQ空间”进入。
2、之后我们在该页面中点击打开“快速安全登录”页面。
3、最后登陆进去后我们就可以从手机直接进入网页版qq空间里了。
以上就是关于qq空间网页版,qq空间网页版的知识,后面我们会继续为大家整理关于qq空间网页的知识,希望能够帮助到大家!
上海市初中学生综合素质评价登录入口
王者荣耀排位巅峰赛荣耀战力加分公式规则2024
宝可梦属性克制表2024最新,18种属性克制关系
魔塔50层攻略隐藏道具图解,魔塔50层详细图文攻略
重装机兵攻略隐藏物品图文详解,战车具体位置
美国zoom动物仙踪林详情介绍
推荐几款超污的手游游戏,6个很污的养成类游戏
原神主c排行2023,4.2目前各系最强主c角色排名
希尔薇攻略
pubg mobile国际服
动作游戏
火影忍者伪造的债券
角色扮演
和平精英
枪战射击
原神
角色扮演
lol英雄联盟
即时网游
世界征服者4少女前线
策略塔防
pubg
飞行射击
麻雀一番街
棋牌游戏
斗罗大陆魂师对决
角色扮演
一同看亿同看gtv
娱乐影音
51品茶
交友约会
丝目
社交聊天
shopee东南亚跨境电商
境外购物
湖北农村商业银行
金融理财
社工库
工具应用
极乐园paradise
聊天交友
杏吧
社交聊天
酷狗输入法(搜狗输入法)
常用工具