# 输出快手ID和cookieclass userdetailLiveSpider(): URL = "https://live.kuaishou.com/m_graphql" headers = { "accept": "*/*", "Content-Length": "", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "content-type": "application/json", # 我添加的抖音点赞时间属性Max-Age=8640000 "Cookie": r'clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; kpn=GAME_ZONE; userId=427400950; kuaishou.live.bfb1s=7206d814e5c089a58c910ed8bf52ace5; userId=427400950; kuaishou.live.web_st=ChRrdWFpc2hvdS5saXZlLndlYi5zdBKgAYm9VZdJaOIjsJDqPoO-yLNw4ZuZul234nekkYMdMsNjIq-i5skiOlVnLhFSPv5PTbrQ45yitiFEkQMGUCDxpsbRcsDpHI0CDZfflQeD9Z14cuQ8x2YJORv-1Pz8JM4-_qmBhAxjVHJ8OSs4kMHRKpCvZja6UUYbXLunFhKT5fyhx1HViPCmuVjBcsSxZEtEpvponSa3DjtkZU2KQ3M9pUoaEm-zwBmcbUA4lm5ejQnh9kVjySIgjJsh3xaj6ckXgLNLF3iPjKs6sC7d1lWqH0SZbWeHTREoBTAB; kuaishou.live.web_ph=ed6156f0bc66780438d593dfc3b3f8fa6f63', "Host": "live.kuaishou.com", "Origin": "https://live.kuaishou.com", "Referer": "https://live.kuaishou.com/profile/LY7452065", "User-Agent": "PostmanRuntime/7.26.8" } payload = { "operationName": "publicFeedsQuery", "variables": { "principalId": "JTYYA13-", "pcursor": "", "count": 24}, "query": "query publicFeedsQuery($principalId: String, $pcursor: String, $count: Int) { \n publicFeeds(principalId: $principalId, pcursor: $pcursor, count: $count) { \n pcursor\n live { \n user { \n id\n avatar\n name\n __typename\n }\n watchingCount\n poster\n coverUrl\n caption\n id\n playUrls { \n quality\n url\n __typename\n }\n quality\n gameInfo { \n category\n name\n pubgSurvival\n type\n kingHero\n __typename\n }\n hasRedPack\n liveGuess\n expTag\n __typename\n }\n list { \n id\n thumbnailUrl\n poster\n workType\n type\n useVideoPlayer\n imgUrls\n imgSizes\n magicFace\n musicName\n caption\n location\n liked\n onlyFollowerCanComment\n relativeHeight\n timestamp\n width\n height\n counts { \n displayView\n displayLike\n displayComment\n __typename\n }\n user { \n id\n eid\n name\n avatar\n __typename\n }\n expTag\n isSpherical\n __typename\n }\n __typename\n }\n}\n"} def __init__(self,userId,myCookie): self.headers["Referer"] = "https://live.kuaishou.com/profile/"+userId self.payload["variables"]["principalId"] = userId self.headers["Cookie"] = myCookie def get_data(self): try: res = requests.post(self.URL, headers=self.headers, json=self.payload) res.encoding = "utf-8" m_json = res.json() # 字典格式 feeds_list = m_json["data"]["publicFeeds"]["list"] pcursor = m_json["data"]["publicFeeds"]["pcursor"] self.payload["variables"]["pcursor"] = pcursor # print(m_json) #-------------筛选数据---------------# result = { } for feeds in feeds_list: result["caption"] = feeds["caption"] # 播放量,点赞数,可花评论数 result["displayView"] = feeds["counts"]["displayView"] result["displayLike"] = feeds["counts"]["displayLike"] result["displayComment"] = feeds["counts"]["displayComment"] # 相册,钱买刷qq赞自组下单可能为空,买热门可能为列表 result["imgUrls"] = feeds["imgUrls"] result["liveID"] = feeds["id"] print(result) except: print("页面请求错误,抖音点赞请检查cookie是可花否过期,id是钱买否正确")if __name__ == "__main__": theCookie = "kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; userId=427400950; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABQrFWsr52Mhp5GfcmignSLoddGbbCBCTAkyedrcLkHqxI9IIdilOuxFUWwhS41WnVKwFJ0Win96_M-frAXGNXXDx78d0FjGOylLgeVtcXUGsIkgyxVkopf2IR_Pvps61IaXw1XTHZOdTrwQkDIdwESPDssQTuW9XNIfjJK9e88ZgJYNJI5bK5n38Zm37kl8omE8R8E8ZhL87TgGpaRZq3XRoSTdCMiCqspRXB3AhuFugv61B-IiBO8gZCTy1dvCTjyGg0IEN6MrmkUACDgSB3T2BYkkBQ-SgFMAE; kuaishou.server.web_ph=dfcba445b9b7f619411fdced6b1e61d6f207" theUserID = "3xkm67762d5fwzc" test = userdetailLiveSpider(theUserID,theCookie) test.get_data() 之后写一下循环,再合并一下,买热门或重新建立一个展示相册的抖音点赞页面。 整合过程中,可花假如live中的钱买id存在video的视频id,怎说明整合,买热门假如没有就是抖音点赞相册,则添加。可花 获取用户详尽信息userTitle表储存用户id和name以及创建时间,钱买之前准备在创建userDetail,把userTitle当成字段,但其不是一对多的关系,还是降低数组。 似乎可以在model中添加执行动作的函数。 添加视频信息时,要通过用户id字段插口添加 观察须要提取的信息 ksID时一个很重要的信息,假如有须要再添加把。 好吧,还是恳求live开头的页面,把ksID也存上去 天秤和地址也存着把 建表的时侯添加一个数组,来表示一些状态。 我认为还是先学习一下model中写函数,等下便捷自己添加数据。 ,这篇博客里面用到了多对多关系,使用 authors=models.ManyToManyField("Author") 还是歇一歇,瞧瞧书里面如何搞的,上次再干。2021.3.12获取主播信息 明天把django相关的书看了一下,之前表之间一对多,多对多里面有写道,可能自己之前没注意。之后,觉得对django了解得差不多了。看了一下笔试的题目,结果几乎不会,起码是通常书上是没有的。 明天原本依照思路写很顺利的,但开始就出现了问题:我即使是扫码登陆后查看live开头的主播页面,看不到作品,之后跑userdetailLiveSpider对象不成功,像是网路问题。 好吧,网页上可以访问了ks怎么买热门,刷qq赞自组下单瞧瞧我的这个对象有哪些问题,里面一个对象运行是成功的。 目前恐怕是cookie问题,live开头的cookie有效时间比较短,我尝试更换cookie。 不是cookie问题,我再去官网刷新没有数据,先不管了,写获取主播信息的逻辑 恳求头的信息相同,不同的就是payload,还是单独写个类 这个cookie和之前的不一样,要重新复制一个,不然显示为登陆。这是成功的信息 { 'data': { 'sensitiveUserInfo': { 'kwaiId': 'synsyn520521', 'originUserId': '943759388', 'constellation': '双子座', 'cityName': '山东 济宁市', 'counts': { 'fan': '115.8w', 'follow': '151', 'photo': '66', 'liked': None, 'open': 66, 'playback': 0, 'private': None, '__typename': 'CountInfo'}, '__typename': 'User'}}} 如今写提取信息的逻辑 代码。 class ksLiveSpider(): URL = "https://live.kuaishou.com/m_graphql" headers = { "accept": "*/*", "Content-Length": "", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "content-type": "application/json", # 我添加的时间属性Max-Age=8640000 "Cookie": r'clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; kpn=GAME_ZONE; userId=427400950; kuaishou.live.bfb1s=7206d814e5c089a58c910ed8bf52ace5; userId=427400950; kuaishou.live.web_st=ChRrdWFpc2hvdS5saXZlLndlYi5zdBKgAYm9VZdJaOIjsJDqPoO-yLNw4ZuZul234nekkYMdMsNjIq-i5skiOlVnLhFSPv5PTbrQ45yitiFEkQMGUCDxpsbRcsDpHI0CDZfflQeD9Z14cuQ8x2YJORv-1Pz8JM4-_qmBhAxjVHJ8OSs4kMHRKpCvZja6UUYbXLunFhKT5fyhx1HViPCmuVjBcsSxZEtEpvponSa3DjtkZU2KQ3M9pUoaEm-zwBmcbUA4lm5ejQnh9kVjySIgjJsh3xaj6ckXgLNLF3iPjKs6sC7d1lWqH0SZbWeHTREoBTAB; kuaishou.live.web_ph=ed6156f0bc66780438d593dfc3b3f8fa6f63', "Host": "live.kuaishou.com", "Origin": "https://live.kuaishou.com", "Referer": "https://live.kuaishou.com/profile/LY7452065", "User-Agent": "PostmanRuntime/7.26.8" } payload = { "operationName":"sensitiveUserInfoQuery","variables":{ "principalId":"3xkm67762d5fwzc"},"query":"query sensitiveUserInfoQuery($principalId: String) { \n sensitiveUserInfo(principalId: $principalId) { \n kwaiId\n originUserId\n constellation\n cityName\n counts { \n fan\n follow\n photo\n liked\n open\n playback\n private\n __typename\n }\n __typename\n }\n}\n"} def __init__(self,userId,myCookie): self.headers["Referer"] = "https://live.kuaishou.com/profile/"+userId self.payload["variables"]["principalId"] = userId self.headers["Cookie"] = myCookie def get_data(self): try: res = requests.post(self.URL, headers=self.headers, json=self.payload) res.encoding = "utf-8" m_json = res.json() # 字典格式 print(m_json) result = { } #---------提取有用数据--------# result["ksId"] = m_json["data"]["sensitiveUserInfo"]["kwaiId"] result["xinzuo"] = m_json["data"]["sensitiveUserInfo"]["constellation"] result["cityName"] = m_json["data"]["sensitiveUserInfo"]["cityName"] result["fan"] = m_json["data"]["sensitiveUserInfo"]["counts"]["fan"] result["follow"] = m_json["data"]["sensitiveUserInfo"]["counts"]["follow"] # 作品数 result["photo"] = m_json["data"]["sensitiveUserInfo"]["counts"]["photo"] print(result) except: print("页面请求错误,请检查cookie是否过期,id是否正确")if __name__ == "__main__": theCookie = "kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; userId=427400950; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABQrFWsr52Mhp5GfcmignSLoddGbbCBCTAkyedrcLkHqxI9IIdilOuxFUWwhS41WnVKwFJ0Win96_M-frAXGNXXDx78d0FjGOylLgeVtcXUGsIkgyxVkopf2IR_Pvps61IaXw1XTHZOdTrwQkDIdwESPDssQTuW9XNIfjJK9e88ZgJYNJI5bK5n38Zm37kl8omE8R8E8ZhL87TgGpaRZq3XRoSTdCMiCqspRXB3AhuFugv61B-IiBO8gZCTy1dvCTjyGg0IEN6MrmkUACDgSB3T2BYkkBQ-SgFMAE; kuaishou.server.web_ph=dfcba445b9b7f619411fdced6b1e61d6f207" theUserID = "3xkm67762d5fwzc" ksCookie = "clientid=3; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; kpn=GAME_ZONE; userId=427400950; userId=427400950; kuaishou.live.bfb1s=ac5f27b3b62895859c4c1622f49856a4; kuaishou.live.web_st=ChRrdWFpc2hvdS5saXZlLndlYi5zdBKgAfwzFw_Kb2uHnKBQgQQ9-nhGuO2rbpCerVYO54A3KmQUQ6JOiQO-mLFbcwABZ9A-Fl2X5WxQ9yuXHLsMV-RsuZygWUnugryt27cp6rgKzgLI7y6ar8R1RdP6CUPp1JTjbgZ6uzAdhQdayNbiM-isllV5Yyj9bb4IK_LPqzxYDjf_uy0QRa_YxWiMtTUPQd8CFinqBXb7gj-o9HNOZG_v1y0aEk2hY_LIikBot7IUVtJ3ydB6KCIgmvgxlD_4Ac99qgHpdvBfsxGugwTfosyEsfq-BaaFMG0oBTAB; kuaishou.live.web_ph=ae0615d67633a6c0debe8d4668be19e1d446" test = ksLiveSpider(theUserID,ksCookie) test.get_data() 更改model接出来更改model中的数组。这是之前数组 class UserTitle(models.Model): userID = models.CharField(max_length=256,unique=True,verbose_name="用户id") userName = models.CharField(max_length=256,verbose_name="用户名") createTime = models.DateTimeField(default=datetime.now,verbose_name="创建时间") 着重要添加一个状态数组。 想起了头像地址数组,须要再viedo页面获取 好吧,live开头恳求的数据连caption都没有,还是打算再爬取video用户界面的信息 筛选吧。写吐了,明天上了软件工程,看来真的很重要。 { 'data': { 'visionProfile': { 'result': 1, 'hostName': 'webservice-bjxy-rs9150.idcyz.hb1.kwaidc.com', 'userProfile': { 'ownerCount': { 'fan': '128.9w', 'photo': None, 'follow': 438, 'photo_public': 68, '__typename': 'VisionUserProfileOwnerCount'}, 'profile': { 'gender': 'F', 'user_name': '南希阿-', 'user_id': '3xcidpetejrcagy', 'headurl': 'https://tx2.a.yximgs.com/uhead/AB/2020/08/17/09/BMjAyMDA4MTcwOTM2MDNfMjQ0NzAyMDZfMV9oZDM4Nl8xODU=_s.jpg', 'user_text': '谢谢你在世界的角落里找到我', 'user_profile_bg_url': '//s2-10623.kwimgs.com/kos/nlav10623/vision_images/profile_background.5bc08b1bf4fba1f4.svg', '__typename': 'VisionUserProfileUser'}, 'isFollowing': True, '__typename': 'VisionUserProfile'}, '__typename': 'VisionProfileResult'}}} 代码 # 获取video页面的主播信息class ksVideoSpider(): URL = "https://video.kuaishou.com/graphql" # header中需要更改cookie和Referer headers = { "accept": "*/*", "Content-Length": "", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "content-type": "application/json", # 我添加的时间属性Max-Age=8640000 "Cookie": r'kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; userId=427400950; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABQrFWsr52Mhp5GfcmignSLoddGbbCBCTAkyedrcLkHqxI9IIdilOuxFUWwhS41WnVKwFJ0Win96_M-frAXGNXXDx78d0FjGOylLgeVtcXUGsIkgyxVkopf2IR_Pvps61IaXw1XTHZOdTrwQkDIdwESPDssQTuW9XNIfjJK9e88ZgJYNJI5bK5n38Zm37kl8omE8R8E8ZhL87TgGpaRZq3XRoSTdCMiCqspRXB3AhuFugv61B-IiBO8gZCTy1dvCTjyGg0IEN6MrmkUACDgSB3T2BYkkBQ-SgFMAE; kuaishou.server.web_ph=dfcba445b9b7f619411fdced6b1e61d6f207', "Host": "video.kuaishou.com", "Origin": "https://video.kuaishou.com", "Referer": "https://video.kuaishou.com/profile/3xcidpetejrcagy", "User-Agent": "PostmanRuntime/7.26.8" } # 这里的userID也要更改 payload = { "operationName":"visionProfile","variables":{ "userId":"3xcidpetejrcagy"},"query":"query visionProfile($userId: String) { \n visionProfile(userId: $userId) { \n result\n hostName\n userProfile { \n ownerCount { \n fan\n photo\n follow\n photo_public\n __typename\n }\n profile { \n gender\n user_name\n user_id\n headurl\n user_text\n user_profile_bg_url\n __typename\n }\n isFollowing\n __typename\n }\n __typename\n }\n}\n"} def __init__(self, userID, myCookie): userdetailSpider.headers["Referer"] = "https://video.kuaishou.com/profile/"+userID userdetailSpider.payload["variables"]["userId"] = userID userdetailSpider.headers["Cookie"] = myCookie def get_data(self): try: res = requests.post(self.URL, headers=self.headers, json=self.payload) res.encoding = "utf-8" m_json = res.json() # 字典格式 print(m_json) result = { } #---------提取有用数据--------# result["user_text"] = m_json["data"]["visionProfile"]["userProfile"]["profile"]["user_text"] result["gender"] = m_json["data"]["visionProfile"]["userProfile"]["profile"]["gender"] result["userImg"] = m_json["data"]["visionProfile"]["userProfile"]["profile"]["headurl"] print(result) except: print("页面请求错误,请检查cookie是否过期,id是否正确")if __name__ == "__main__": theCookie = "kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; clientid=3;Max-Age=8640000; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; userId=427400950; kuaishou.server.web_st=ChZrdWFpc2hvdS5zZXJ2ZXIud2ViLnN0EqABQrFWsr52Mhp5GfcmignSLoddGbbCBCTAkyedrcLkHqxI9IIdilOuxFUWwhS41WnVKwFJ0Win96_M-frAXGNXXDx78d0FjGOylLgeVtcXUGsIkgyxVkopf2IR_Pvps61IaXw1XTHZOdTrwQkDIdwESPDssQTuW9XNIfjJK9e88ZgJYNJI5bK5n38Zm37kl8omE8R8E8ZhL87TgGpaRZq3XRoSTdCMiCqspRXB3AhuFugv61B-IiBO8gZCTy1dvCTjyGg0IEN6MrmkUACDgSB3T2BYkkBQ-SgFMAE; kuaishou.server.web_ph=dfcba445b9b7f619411fdced6b1e61d6f207" theUserID = "3xkm67762d5fwzc" ksCookie = "clientid=3; did=web_ec874916e390b9741609686125a0452e; didv=1613879531823; client_key=65890b29; kpn=GAME_ZONE; userId=427400950; userId=427400950; kuaishou.live.bfb1s=ac5f27b3b62895859c4c1622f49856a4; kuaishou.live.web_st=ChRrdWFpc2hvdS5saXZlLndlYi5zdBKgAfwzFw_Kb2uHnKBQgQQ9-nhGuO2rbpCerVYO54A3KmQUQ6JOiQO-mLFbcwABZ9A-Fl2X5WxQ9yuXHLsMV-RsuZygWUnugryt27cp6rgKzgLI7y6ar8R1RdP6CUPp1JTjbgZ6uzAdhQdayNbiM-isllV5Yyj9bb4IK_LPqzxYDjf_uy0QRa_YxWiMtTUPQd8CFinqBXb7gj-o9HNOZG_v1y0aEk2hY_LIikBot7IUVtJ3ydB6KCIgmvgxlD_4Ac99qgHpdvBfsxGugwTfosyEsfq-BaaFMG0oBTAB; kuaishou.live.web_ph=ae0615d67633a6c0debe8d4668be19e1d446" test = ksVideoSpider(theUserID,ksCookie) test.get_data() 目前写了四个类了,相互补充可以得出完整的主播信息,把数据库数组填写完成。 class UserTitle(models.Model):#女为F,男为M GENDER = [ (0,"未知"), (1,"男"), (2,"女") ] STATE = [ (0,"初次爬取"), (1,"测试") ] USERIMG = "https://tx2.a.yximgs.com/uhead/AB/2020/08/17/09/BMjAyMDA4MTcwOTM2MDNfMjQ0NzAyMDZfMV9oZDM4Nl8xODU=_s.jpg" userID = models.CharField(max_length=256,unique=True,verbose_name="用户id") userName = models.CharField(max_length=256,verbose_name="用户名") createTime = models.DateTimeField(default=datetime.now,verbose_name="创建时间") stateUser = models.IntegerField(choices=STATE,verbose_name="用户信息状态",default=0) ksID = models.CharField(max_length=128,verbose_name="快手id",default="xxxxxxxxxxxxxx") user_text = models.CharField(max_length=2560,verbose_name="用户简述",default="xxxxxxxxxxxxx") gender = models.IntegerField(choices=GENDER,verbose_name="性别",default=0) fan = models.CharField(max_length=32,verbose_name="粉丝数",default="-1") xinzuo = models.CharField(max_length=32,verbose_name="星座",default="未知") cityName = models.CharField(max_length=32,verbose_name="地址",default="未知") follow = models.CharField(max_length=32,verbose_name="关注的数量",default="-1") photo = models.CharField(max_length=32,verbose_name="作品数量",default="-1") userImg = models.CharField(max_length=256,verbose_name="图片地址",default=USERIMG) def __str__(self): return self.userName class Mate: verbose_name = verbose_name_plural = "用户ID和名字" 刚开始把ksID设置了uinque=True,结果migrate的时侯报错,改回去了makemigrations再migrate还是保存,我把app01中的3.12创建的几个文件删掉了,再执行命令一遍就成功了。要是曾经碰到这样的问题,可能是删掉数据库了。 这个博客讲解了给admin添加动作: 完成了简单的测试,如今可以把对象加入到其中了。 from django.contrib import admin# Register your models here.from .models import UserTitleclass UserTitleAdmin(admin.ModelAdmin): # 显示的字段 list_display = ["userName","stateUser"] # 过滤器 list_filter = ["stateUser"] # 搜索器 search_fields = ["userName"] # 分页 list_per_page = 50 # 执行的动作需要这两个参数,第二个为.query.QuerySet对象,就是选中的数据,通过for循环,通过.调用属性 def mytest(self,request,queryset): for qu in queryset: print(qu.userName) print(request,type(queryset)) mytest.short_description = "测试" actions = [mytest,] # Action选项都是在页面上方显示 actions_on_top = True # Action选项都是在页面下方显示 actions_on_bottom = False # 是否显示选择个数 actions_selection_counter = Trueadmin.site.register(UserTitle,UserTitleAdmin) 我再setting文件中创建了一个类,来储存cookie信息,以便更改和使用。弥补信息类的输出 { 'ksId': 'synsyn520521', 'xinzuo': '双子座', 'cityName': '山东 济宁市', 'fan': '115.9w', 'follow': '151', 'photo': '65'} { 'user_text': '谢谢你在世界的角落里找到我', 'gender': 'F', 'userImg': 'https://tx2.a.yximgs.com/uhead/AB/2020/08/17/09/BMjAyMDA4MTcwOTM2MDNfMjQ0NzAyMDZfMV9oZDM4Nl8xODU=_s.jpg'} 状态设置state描述 初次爬取,只有username和userid ksvideo kslive ksvideo+kslive 目前状态相关的逻辑不完美,例如为3执行ksvideo就弄成了状态1,代表还要进行kslive,然而kslive数组早已添加了,使用时注意没必要给状态3执行动作。 两个逻辑我是这样写的,而且这样似乎不能改变数据库中相关的数据 # 执行的动作需要这两个参数,第二个为.query.QuerySet对象,就是选中的数据,通过for循环,通过.调用属性 def myksVideo(self,request,queryset): cData = currentData() for qu in queryset: ksVideo = ksVideoSpider(qu.userID,cData.ksCookie) result = ksVideo.get_data() #-----填写数据-------------# qu.user_text = result["user_text"] if result["gender"] == "F": qu.gender = 2 elif result["gender"] == "M": qu.gender = 1 else: qu.gender = 0 qu.userImg = result["userImg"] #---------完成----------# if qu.stateUser == 2: qu.stateUser = 3 else: qu.stateUser = 1 # print(result) #print(request,type(queryset)) myksVideo.short_description = "添加ksVideo字段" def myksLive(self,request,queryset): cData = currentData() for qu in queryset: ksLive = ksLiveSpider(qu.userID,cData.ksCookie) result = ksLive.get_data() #-----填写数据-------------# qu.ksID = result["ksID"] qu.xinzuo = result["xinzuo"] qu.cityName = result["cityName"] qu.fan = result["fan"] qu.follow = result["follow"] qu.photo = result["photo"] #---------完成----------# if qu.stateUser == 1: qu.stateUser = 3 else: qu.stateUser = 2 # print(result) #print(request,type(queryset)) myksLive.short_description = "添加ksLive字段" 我分别再函数中调用model筛选和更新数据的函数,成功实现功能 UserTitle.objects.filter(userID=qu.userID).update(user_text=qu.user_text,gender=qu.gender,userImg=qu.userImg,stateUser=qu.stateUser) UserTitle.objects.filter(userID=qu.userID).update(ksID=qu.ksID, xinzuo=qu.xinzuo, cityName=qu.cityName, fan=qu.fan, follow=qu.follow, photo=qu.photo, stateUser=qu.stateUser) 测试成功,而且我有的个数据添加live不成功,报错没有ksID数组。但不影响其他数据的添加。 if qu.ksID == None: qu.ksID = "无法获取ksID" UserTitle.objects.filter(userID=qu.userID).update(ksID=qu.ksID, xinzuo=qu.xinzuo, cityName=qu.cityName, fan=qu.fan, follow=qu.follow, photo=qu.photo, stateUser=qu.stateUser) 6明天就到这了,今天和同事一起去景点旅游。 今天把功能录一个演示视频。 实现前端功能,是通过按键触发js的函数,之后想前端的插口post实现相应的功能。这是再《跟老齐学django》上见到的。 2021.3.13 明天下雪了,不出去玩了 IP问题我晚上跑了一下userdetailSpider(theUserID,theCookie),刚开始是好的,之后就返回None之后我就去浏览器总刷新,刷新不下来视频。我怀疑是因为访问得太快,暂时的封锁了IP还有None问题,假若不处理才会始终恳求而且返回None。这个问题就是我之前提到的result,为1代表成功果然是暂时性的,我没有修改cookie,再去怕代码成功了,但还是要加上延时函数。这叫恳求太快,亲求失败吧。我把延时函数删掉了,跑了几次都是成功的,只得先这样写着。 if m_json["data"]["visionProfilePhotoList"]["result"] == 1: print("请求成功,开始筛选数据") else: print("请求数据失败,无法筛选,程序终止") return -1 筛选数据这是视频信息 { 'caption': '锦上添花我不需要 雪中送炭你做不到', 'coversUrl': 'https://tx2.a.yximgs.com/upic/2018/03/24/19/BMjAxODAzMjQxOTIyNDVfMTA1MjM4MjNfNTYwMzAxNTQwNF8xXzM=_B73ece8a2ba15635894bd1d22c88ab2ab.jpg?tag=1-1615596637-xpcwebprofile-0-c2teex2jjk-fe86cc6122e6e5cc&clientCacheKey=3xp87jw5zmeue69.jpg&di=75960068&bp=14734', 'videoID': '3xp87jw5zmeue69', 'videoPath': 'https://txmov2.a.yximgs.com/upic/2018/03/24/19/BMjAxODAzMjQxOTIyNDVfMTA1MjM4MjNfNTYwMzAxNTQwNF8xXzM=_b_B4e460c2dedc40be078e7a315389327f8.mp4?tag=1-1615596637-xpcwebprofile-0-nc4gujqkgj-65ff48b3ed0c2822&clientCacheKey=3xp87jw5zmeue69_b.mp4&tt=b&di=75960068&bp=14734', 'likeCount': '30', 'realLikeCount': 30, 'animatedCoverUrl': None} 网页上我要是开启代理刷新都会出现数据。live开头的恳求视频似乎会封锁ip,我打算再juoyterlab上试一下,结果进去不了,可能是家里的旧笔记本又被如何了。整理。创建视频表。 class UserVideo(models.Model): STATE = [ (1,"默认ksVideo"), (2,"ksLive"), (3,"ksVideo+ksLive") ] # 当被参照删除时,自己也被删除 theUser = models.ForeignKey(UserTitle,on_delete=models.CASCADE) videoID = models.CharField(max_length=128,default="xxxxxxxxxxxxxx",verbose_name="视频id") caption = models.CharField(max_length=512,default="暂无",verbose_name="视频描述") coversUrl = models.CharField(max_length=512,default="xxxxxxxxxxx",verbose_name="视频封面") videoPath = models.CharField(max_length=512,default="xxxxxxxxxxxxx",verbose_name="视频地址") realLikeCount = models.CharField(max_length=64,default="xxxxxxxxxxx",verbose_name="具体点赞数量") animatedCoverUrl = models.CharField(max_length=512,default="xxxxxxxx",verbose_name="封面动画") stateVideo = models.IntegerField(choices=STATE,default=1,verbose_name="状态") displayView = models.CharField(max_length=64,default="-1",verbose_name="播放量") displayComment = models.CharField(max_length=64,default="-1",verbose_name="评论数") 之后改了一下类,把爬取到的数据以列表方式存取到endResult属性中。由于通常文件不能调用.model这个博客,演示了一对多如何添加数据: for result in results: UserTitle.objects.get(userId = qu.userID).theUser.objects.create(videoID = result["videoID"], caption = result["caption"], coversUrl = result["coversUrl"], videoPath = result["videoPath"], realLikeCount = result["realLikeCount"], animatedCoverUrl=result["animatedCoverUrl"], ) 如今体验到了,网站数据一多,执行操作上去就很卡,删掉所有数据不是马上的事情。添加video动作遇见了animatedCoverUrl数组报错,添加一个判定就可以了 if result["animatedCoverUrl"] == None: result["animatedCoverUrl"] = "一直没有" 遇见状态没有改变的问题,把转台形参句子写在for外边 def myvideoMP4(self,request,queryset): cData = currentData() for qu in queryset: thevideo = userdetailSpider(qu.userID,cData.theCookie) thevideo.start_spider() results = thevideo.endResult ttUser = UserTitle.objects.get(userID=qu.userID) for result in results: if result["animatedCoverUrl"] == None: result["animatedCoverUrl"] = "一直没有" print(result["videoID"]) time.sleep(1) temp = UserVideo.objects.create(videoID = result["videoID"], caption = result["caption"], coversUrl = result["coversUrl"], videoPath = result["videoPath"], realLikeCount = result["realLikeCount"], animatedCoverUrl=result["animatedCoverUrl"], theUser = ttUser) temp.save() del temp ttUser.stateUser = 4 ttUser.save() del ttUser 就是这样把,还有个问题没解决。填入的数据又好多时重复的。我降低了一秒的延后还是不行如今去看一下原生的endResult的数值 对象输出的数据是重复的,是爬虫的问题 应当是我吧endResult属性写在了,__init__中,但是初始化为空列表。应当是这个地方逻辑的问题 #-------------具体提取数据----------#写到这里想起了,我应该是通过live获取视频信息 result = { } #信息存储在字典中 for feeds in feeds_list: result["caption"] = feeds["photo"]["caption"] result["coversUrl"] = feeds["photo"]["coverUrl"] result["videoID"] = feeds["photo"]["id"] result["videoPath"] = feeds["photo"]["photoUrl"] result["likeCount"] = feeds["photo"]["likeCount"] result["realLikeCount"] = feeds["photo"]["realLikeCount"] result["animatedCoverUrl"] = feeds["photo"]["animatedCoverUrl"] self.endResult.append(result) print(result) #-----------待会再这里编写存储到数据库的函数-------------- 确实,改成这样就没问题了 #-------------具体提取数据----------#写到这里想起了,我应该是通过live获取视频信息 # result = { } #信息存储在字典中 for feeds in feeds_list: result = { } result["caption"] = feeds["photo"]["caption"] result["coversUrl"] = feeds["photo"]["coverUrl"] result["videoID"] = feeds["photo"]["id"] result["videoPath"] = feeds["photo"]["photoUrl"] result["likeCount"] = feeds["photo"]["likeCount"] result["realLikeCount"] = feeds["photo"]["realLikeCount"] result["animatedCoverUrl"] = feeds["photo"]["animatedCoverUrl"] self.endResult.append(result) print(result) del result #-----------待会再这里编写存储到数据库的函数-------------- 打算录演示视频的,过程中有一个主播,出现视频没有爬取完全的问题测试爬取是完整的,可能是我在执行动作的时侯点击别的给终端了把。那种爬取全部视频的运行时间有些长,先不录视频了。建立Live对象 原本应当去做后台统计和获取热门页面的userid和name的,并且有些不甘愿,想把获取相册的对象写完整,这样就可以产看是否否获取到了全部作品了。 刷新了好几次页面,还是显示不了作品。之后尝试live+ksID,可以访问,这么,就须要调用库上面早已储存的ksID来进行相关逻辑的编撰。成功,这是不包含相册的一条数据 { 'caption': '“留下来 或者我跟你走”', 'displayView': '903.6w', 'displayLike': '48.1w', 'displayComment': '1.3w', 'imgUrls': [], 'liveID': '3xb7betx499z9um'} 视频id和我从video界面获取的是一样的,假如每位都对比一下,会消耗性能,由于video界面可能不包含完整的live中的视频。(后期处理) { 'caption': '不知不觉又长大了一岁,生日快乐', 'displayView': '31w', 'displayLike': '1.1w', 'displayComment': '1949', 'imgUrls': ['http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_0.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_1.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_2.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_3.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_4.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_5.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_6.webp', 'http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzc1MTAzNjU0ODA=_7.webp'], 'liveID': '3xmm5g93pqgd8tc'} 忘掉了播放量是个很重要的数据,还是要重新遍历一遍,之后添加数组 这篇博客介绍了储存链表:删掉了migrations上面的刚刚创建数据库迁移的文件,出现问题 django.db.utils.OperationalError: table "app01_userphoto" already exists 我创建的那种列表数组是填写数字的,没注意。我进源文件看了一下,似乎还可以添加多个图片 def get_available_image_extensions(): try: from PIL import Image except ImportError: return [] else: Image.init() return [ext.lower()[1:] for ext in Image.EXTENSION]def validate_image_file_extension(value): return FileExtensionValidator(allowed_extensions=get_available_image_extensions())(value) 直接当做字符串存上去,也好分割成列表。这是创建的的model class UserPhoto(models.Model): photoID = models.CharField(max_length=128,verbose_name="相册id",default="xxxxxxxx") caption = models.CharField(max_length=512,verbose_name="相册描述",default="暂无") displayView = models.CharField(max_length=32,verbose_name="播放量",default="-1") displayLike = models.CharField(max_length=32,verbose_name="点赞数",default="-1") displayComment = models.CharField(max_length=32,verbose_name="评论数",default="-1") imgUrls = models.CharField(max_length=5000,default=" ") def __str__(self): # print(self.videoID) return self.photoID class Mate: verbose_name = verbose_name_plural = "相册信息" 里面忘掉添加了字段,我添加后报错 django.db.utils.OperationalError: no such column: app01_userphoto.theUser_id 差点真的删掉或则迁移数据库,解决办法是添加数组,但这个很奇怪,不晓得如何添加。之后我注释字段数组,访问成功。原先上面还有条数据,恐怕就是这条数据没有外键造成报错。 还是报这个错误。 解决了,我之前这个数组是theUser,和前面的是相同的,改一下名子就好了。 thephotoUser = models.ForeignKey(UserTitle,on_delete=models.CASCADE) 数据库上面添加数组,不须要使用延时 http://tx2.a.yximgs.com/ufile/atlas/9e53e8ba157f445c88009a4dce85fe16_0.webphttp://tx2.a.yximgs.com/ufile/atlas/9e53e8ba157f445c88009a4dce85fe16_1.webphttp://tx2.a.yximgs.com/ufile/atlas/9e53e8ba157f445c88009a4dce85fe16_2.webphttp://tx2.a.yximgs.com/ufile/atlas/9e53e8ba157f445c88009a4dce85fe16_3.webphttp://tx2.a.yximgs.com/ufile/atlas/9e53e8ba157f445c88009a4dce85fe16_4.webp 要添加分割符号,测试时侯才发觉的 photoUrl = ','.join(result["imgUrls"]) http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_0.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_1.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_2.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_3.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_4.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_5.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_6.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_7.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_8.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_9.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_10.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_11.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_12.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_13.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_14.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_15.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_16.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_17.webp,http://tx2.a.yximgs.com/ufile/atlas/MTI3MjAyMjYyXzE2NjAyMDc0NjI3XzE1NjYyODAxNTQ5MTc=_18.webp 如今思索问题,重复执行动作,会不会重复添加了数据,倘若是被覆盖了,也是会给数据库降低压力。后期假如数据不完整,须要重新爬取,须要一个判定操作。还有个问题,某些用户难以获取ksID,可能须要自己自动添加2021.3.19*添加静态问题问题 因为django在调试模式下不能加载静态文件,导出静态文件不能通常导出,可以使用外部链接。 STATICFILES_DIRS = [os.path.join(BASE_DIR,"static"),]STATIC_URL = '/static/' { % load static %}{ % block title %}管理页面{ % endblock title %}{ % block style %}{ % endblock %} 2021.3.20*获取指定数组的全部数据 allCover = UserVideo.objects.values("coversUrl") 参考博客: 继续 遇见了有的视频封面大小不一样的问题 观察了一下,live界面的视频左右两侧会有一些空白,vi'deo是恰好填充好,还是根据live页面的款式写吧。 获取图片原始规格: 再想想,live界面没有展示的视频,肯定是不好根据那个规格展示的视频 这么,还是先做主播主页的页面吧。 统计数据库中的video和photo统计每位用户的video数目 def showAdmin(request): allUser = UserTitle.objects.values("userName","userID") for uID in allUser: theUsr= UserTitle.objects.get(userID=uID["userID"]) myVideo = UserVideo.objects.filter(theUser=theUsr.id) print(uID) print(len(myVideo)) return render(request,'pages/showAdmin.html',{ "result":allUser}) 这种逻辑前面要使用插口触发,不然一进这个视图就触发一次,太消耗时间。 http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_0.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_1.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_2.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_3.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_4.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_5.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_6.webp,http://tx2.a.yximgs.com/ufile/atlas/NTE5MzQ5NDg0MTc0OTc3NzcxOV8xNjE1NjI4ODcwNjA0_7.webp 获取图片数目的时侯出现了多的,可能与爬虫逻辑有关 我查看了一下图片,名子和图片不匹配,确实是逻辑问题删掉储存图片的数据,重新执行动作,数据可以被重复添加。进一步处理爬虫类和状态表示 执行爬虫脚本失败要中止,数据库不能储存到数据库。设计一个状态表示,不能重复储存数据。脚本还是设置延时参数,可以调节。 我做了进一步的处理,恳请到result=0,可能不是爬取太快的问题,其他问题。假如reslut=0,再自己浏览器中多刷新几次,直至出现作品,再执行代码result=1. 爬取不完整就舍弃,或则多次爬取互相补充。前面数据更新了,自己也要对爬虫进行跟新。 如今要决定一下工作,简单的就是爬取到数据,最后自己写脚本把须要的数据下载到本地。复杂的是写可持续爬虫的代码,官网跟新不更改代码就可以直接爬取过来。假如要作为找工作的项目,就还须要加入用户注册登入系统,可以点赞,关注。再复杂的是评论,上传视频等,这样一做就要考虑其他问题,如doss功击,服务器显存等问题。代码逻辑新能问题就早已一团糟了。 延时设置为5秒,爬取一波是正常的。3秒也正常。之后设置爬取数据不完整,不储存到数据库。 userdetailLiveSpider() 这个类是获取live界面的视频信息,暂时测试延时可以不要。 我设置5状态可以转变为1或则2状态,假如这样回头再执行一遍,应当会出现重复的问题。确实有,还是入库前要判定一下。进行了处理,多次运行出现问题,获取Photo时侯获取不了,浏览器刷新也出现不了数据,使用IP代理就别了吧,实在不想就只要vide的视频。明天要处理的问题恐怕就没问题。重复运行提取数据就可以了,下一步做随机获取username和userID唉!真难,以为没有问题出现了死循环。我把傲游里面的cookie复制过来,可以后去photo随机获取userIDdict与json数据之间的转换:2021.3.21js发送post参考博客:之后我又找了个弹出框的插件,如今可以再弹出框填写数据,发送post恳求。 $("#openDialog1").dialog({ id: "superDialog", //必填,必须和已有id不同 title: "我的标题", //对话框的标题 默认值: 我的标题 type: 0, //0 对话框有确认按钮和取消按钮 1 对话框只有关闭按钮 easyClose: true, // 点击遮罩层也可以关闭窗口,默认值false form: [{ description: "用户名", type: "text", name: "username", value: "tom" }, { description: "密码", type: "text", name: "password", value: "123456" }, { description: "姓名", type: "text", name: "name", value: "tom" }, { description: "年龄", type: "text", name: "age", value: "18" }], //form 是填充表单的数据,必填 submit: function (data) { //data是表单收集的数据 console.log(data); $.ajax({ url: 'http://127.0.0.1:8000/api/getUserRandom/3/', type: 'POST', { #dataType: 'json',#} data:data, beforeSend: function (xhr, setting) { xhr.setRequestHeader("X-CSRFToken", "{ { csrf_token }}")}, success: function (msg) { console.log(msg)}, }) //这个可自行删去 if (true) { alert("提交成功\n(你自己可以去掉这个alert)"); //清空表单数据 传递参数=上述指定的id值 clearAllData("superDialog"); } } }) xhr.setRequestHeader("X-CSRFToken","{ { csrf_token}}")},这一步很重要 处理一下返回的数据为json格式 def getUserRandom(request,counts): if request.method == 'POST': print("-----------") cDate = currentData() theGetScript = getUserIDRandom(cDate.theCookie) theGetScript.get_data() results = theGetScript.endResult messgae = json.dumps(results) # return render(request,results) myRes = json.dumps({ "result":2}) return HttpResponse(myRes) else: myRes = json.dumps({ "result": 1}) return HttpResponse(myRes) 出现上一次相应的数据也添加到下一次相应的数据中了。 我把result在函数外定义为全局变量还是不行。result每次的内容不会被清空,对象的endResult会被清空,我就直接把这个作为返回值 还是这个问题,我形参给返回值,把属性值都清空了都还是那样。又有问题获取精彩视频页面也会被限制,我去浏览器刷新也刷新不出视频。看来,看来一切不是这么如意。须要赶紧结束这个项目,展示页面就重新开启一个项目把。这个项目就拿来写爬虫,把数据储存到数据库。恐怕真的是要http代理了。尝试了一下,其实不是封锁ip的问题。确实不是,我联接手机热点还是那种样子。我发觉了,退出登陆,之后再访问就是正常的。而且我复制cookie,代码还是未能获取信息。真是搞不懂。可能是某个帐户对某个页面恳求的次数太多就出现问题把。问题是现今不晓得如何恢复,填上退出登入的cookie页不行。睡了午觉我去睡了午觉,睡醒后再去执行代码,成功可以获取信息。这么就可以继续进行了,其他获取不到数据可能也是这样就可以了,不是cookie问题,由于自己再下一次写代码的时侯,执行爬虫脚本开始都是成功的。尼玛!我再mytools中测试类成功得到数据,在前端执行动作老是不成功,cookie更换得也是一样的。还有最后一个头像地址,刚好听到一个错位的。真想舍弃,都做到这儿了。继续找缘由吧。我去吃了个饭,礼拜天上午的菜真的不行。点了两个肉菜,肉不好吃把上面的莴苣给吃了,还伴着油水把饭吃了。去买方便面的时侯迷糊地多付了一元钱,拿了两根棒棒糖。我上来在测试的时侯,后台动作添加video是成功的,觉得还好,我就感觉自己的代码写得没有问题,可能是测试的用户不同,添加photo有问题。使用result判定是否有数据出现错误,没有数据状态也改变了。直接使用厚度来判定。在setting中调用类中的ksCookie的问题,我在mytools中调用也是获取不到数据。可能是全局变量引入的形式,我get到了再__init__文件下边设置变量,这样引入就可以了 from app01 import KSCOOKIE 成功,前端执行不成功,就是导出变量的问题。其他发觉问题,获取photo的时侯,须要每次更新cookie,就是从成功恳求到数据的浏览器中获取。多降低一个用户都不行。 好吧,我说把kscookie复制到了THECOOKIE 我不晓得曾经是如何搞的,延时就可以使用一个cookie多次获取视频信息。 假如video+photo不等于应当作品数目,就须要再live界面获取视频,对比入库。这是可能碰到的问题,先写一下。 我观察了一下ks怎么买热门,每次就是cookie中这个参数改变了。 确实,还是要想办法获取cookie。我以为这个工程要烂尾了,由于cookie最后的一个值我没有对比到。并且,我把里面的最前面恳求的cookie复制过来还是可以运行。好吧,还是一次性的。我都怀疑自己之前是如何做到使用延后,可以多次复用。不行不行,还是对应恳求的cookie好用。确实好用,就是不晓得如何获取。变的就是最后面的那条数值我还是根据这篇博客一步步地做把,说不定成功了,博客:获取二维码成功,要不是博客中说要加data:image/png;base64,我估计如何也想不下来。这个信息填在这儿也幸好了这篇博客 扫描的结果中提取了登陆信息,响应后返回的是用户信息,之后携带登陆信息登入。 acceptResult恳求获取qrtoken qrtoken的值再这个表单里被发送出去 之后就是这个GET恳求,携带的数据博客上面有解释 三个变动的参数,每次都要交替更换,通过这样一波操作来获取动态的cookie。 把这三个数组替换,之后作为下一次恳求个人信息的cookie才有效。用户界面剖析这是刷新一下,下降一下发送的数据 我猜想passToken和sts?依次更新了cookie,之后在恳求数据。下边第一个graphql是登陆用户的个人信息,第二个是第一页面视频列表,下边v?又跟新了依次cookie,之后用这个cookie就可以仍然获取视频列表了。 如今要晓得passToken中的cookie中的passToken参数值如何获取。 我如今晓得cookie是如何获取的了,不是自己建立,而是按照响应数据中set-Cookie参数设定的。之前健康打卡系统就是没有使用上一次生成的cookie而失败的,不能自己建立。 cookie肯定是get恳求获取的,由于我筛选的是XRH没有见到GET恳求。好吧,全部上面也没有,难以获取。我使用这个gra中的cookie,可以爬取一个完整用户的视频。这个cookie可以获取到。有的不能,可能是最后依次恳求到的数据为空,之后判定爬取信息不完整。 这样每次只能爬取一个用户的视频,之后再更新cookie。使用初次登陆后更新cookie就可以获取数据。也是一次性的。如今要晓得如何更新。psotman发觉我用post模拟,到passToken的模拟才有效,后面的是token错误的返回值。 ok,模拟passtoken得到响应的"kuaishou.server.web.at“的值,作为下一次sts的params,之后sts就可以成功返回须要跟新的cookie三个数组,再和cookie固定的值凭着,就可以生成一个有效的cookie爬取一个主播的用户全部视频信息。 ok,上次就就须要把cookie拼接上去,封装成类就可以了 2021.3.24updateCookie类jupyterlab的相关的文件置于notebook/01/passToken下测试好了,写类的时侯遇见一个问题,第一个替换我没有做处理,相关数组没有server.web_st=。并且替换另一个的时侯也每做处理,最后却添加了server.web_st=。结果是想要的,但不晓得为何 不好意思,是代码弄错了。 写好了,执行爬取video的时侯更新一下cookie打算体验一下成果的时侯,发觉失败,程序中止。回头看一下,原先是掉了分号 "server.web_st="+st+";" 我都想好了等下测试成功了如何写哪些,并且失败了。我尝试了删掉类,每次恳求都更新依次cookie,但还是失败。不晓得为何,莫非恳求的cookie与动作有关,或则前后cookie是由关联的。好吧,我先暂停一下,好好整理一下爬虫相关的代码。既然不用持续更新视频,执行依次得到结果,这么就可以不把获取视频的代码写在工程上面了。 |