标签:羊毛 Python text list pics 获取 微博 url data
前言
最近沉迷薅羊毛,然后想第一时间得到新的消息。 不过说实话第一时间是不存在的,除非跟商家直接对接。 于是乎只能靠微博啊,企鹅群等,看别人发的新信息了。 那么做一个简单的爬虫,定时爬一下消息应该挺不错的。
明确目标
要想一直知道什么羊毛,那么就需要不断去获取信息,刷新的第一时间就反应给用户。
伪代码逻辑如下:
1 2 3 4 5
|
while(True): 获得羊毛 if(有新羊毛): if(符合关键字): 发送给用户
|
核心功能就是获得羊毛和清洗数据,提醒用户。其他的东西都属于一个处理逻辑,要根据需求来灵活变化。
获取信息
寻找目标
判断爬取目标
一开始想爬的是PC版 围脖 ,然后解析信息。 发现PC版 围脖 的信息,不好抓,抓了也不好解析。于是为了减少工作量,决定要去爬手机版的围脖。
分析数据包
在浏览器的开发者模式下打开我们要找的对象地址示例,看数据交互找一下我们要用到的东西。
一个个观察参考,可以过滤一下数据包,选择Fetch/XHR,过滤成数据请求。
观察到了一个api接口,请求了用户的某些数据。
在观察其获得的data,可以找到一些博主下面的微博
而且在一个list中,按顺序排列,里面有每条微博的信息。
1 2 3 4 5 6 7 8
|
data->cards->list[0,1,2,3,4]->mblog-> { created_at(创建时间), id(独立标识), pic_num(有多少图片), text(文本内容), retweeted_status(是不是转发的微博) }
|
这是这版本想要的部分信息,具体想要什么,还是要看需求。
代码处理
核心逻辑
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
import requests import json # 对应博主的用户参数 user_id = {"containerid": "1076035748988380","uid": "5748988380"} params = { 'containerid': containerid, 'type': 'uid', 'uid': uid } #api的地址 url = 'https://m.weibo.cn/api/container/getIndex?'# 请求api save_json_list = [] # 用于保存一个博主的数据list # 最简单的获取方法 response = requests.get(url,params=params).text # 这里我们是否获取成功不重要,就不去检查status_code了,下面这步已经弥补了是否获取成功的判断。 if 'mblog' in response: # 要是能够通过判断,说明我们数据已经获取成功了 # 顺便就要把获得的数据转换数据类型,方便我们去处理数据 father_data = json.loads(response) father_data = father_data['data']['cards'] # 微博列表 for card in father_data: # 每一个card里面,都是一条微博 data = card['mblog'] # 先获取mblog,要用的数据都在里面 is_retweeted_blog = data.get('retweeted_status')# 这里判断他是不是转发的微博 if is_retweeted_blog is not None: # 转发微博信息 # 获得该条微博信息 id = data['id'] # 获取该条微博的id created_time = timeanalysis(data['created_at']) # 获取这条微博的创建信息 author = str(data['user']['screen_name']) # 获得作者的名字 # 因为转发微博不存在自己发的图片,所以图片在转发的内容里 pics_url_pool = pics_get(data['retweeted_status']) child_data_json = { 'id' : id, 'text': msg, 'author': author, 'create_at_time': created_time, 'pics_url': pics_url_pool, 'isChild': 1, } else: # 原创微博 # 获得该条微博信息 id = data['id'] # 获取该条微博的id created_time = timeanalysis(data['created_at']) # 获取这条微博的创建信息 author = str(data['user']['screen_name']) # 获得作者的名字 # 获得正文内容 pics_url_pool = pics_get(data) child_data_json = { 'id' : id, 'text': msg, 'author': author, 'create_at_time': created_time, 'pics_url': pics_url_pool, 'isChild': 1, } save_json_list.append(child_data_json)
|
到最后save_json_list
里面就是要存本次获取到的数据了。
时间处理方法
timeanalysis方法是用于处理获取到的数据里面混乱的时间
数据里面获取到的时间如Fri Jan 07 19:24:16 +0800 2022
,这样的格式我们是没法很好得去转换成符合人类的语言
于是就有了这个处理方法
1 2 3 4 5
|
def timeanalysis(create_time): created_at_time = str(create_time) created_at_time = created_at_time.replace('+0800 ', '') # 过滤掉拿到的时间里面的+0800 , 暂时不知道有什么用?东八区的意思? created_at_time = time.mktime(time.strptime(created_at_time)) # 转换成时间戳 return created_at_time
|
文字信息处理方法
get_detailpage方法是用来处理text里面的东西的,由于写在核心逻辑里面,会显得很乱。
而且转发微博和原创微博都是同类型的数据,处理的方法一样,既然可以重复调用,那么就只做一次。
由于我们要获得羊毛信息,那么肯定是要得到商品信息,商品链接。价格有没有,就直接能在商品信息中获得。
所以结构估计就是
- 商品1信息+url
- 商品2信息+url
- 商品3信息+url
一般来说,就算一条微博里面有多个商品羊毛,那么也会是商品1,商品2…这样的格式。
那我们就要过滤并输出商品信息+URL的结构
那么我们就要输出这种结构的内容。
处理方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
import re
def get_detailpage(text): father_data = text log_text = re.sub('<br />', '\n', father_data) line_log_text = log_text.split('\n') output_text = '' for line_num in range(len(line_log_text)): text_list = [] url_list = re.findall('(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')', line_log_text[line_num], re.I|re.S|re.M) url_img = "<span class='url-icon'><img style='width: 1rem;height: 1rem' src='https://h5.sinaimg.cn/upload/2015/09/25/3/timeline_card_small_web_default.png'>" # 去除一个微博专用的链接图 # 处理文字 if re.findall('(.*?)</.*?>', line_log_text[line_num] , re.S|re.M) != []: text_list = re.findall('(.*?)</.*?>', line_log_text[line_num] , re.S|re.M) for text_num in range(len(text_list)): text_list[text_num] = re.sub('<.*?>','',text_list[text_num]) for i in text_list: if i == '': text_list.remove(i) if i == ' ': text_list.remove(i) else: a = line_log_text[0] a = re.sub(url_img,'',a) a = re.sub('<.*?>','',a) text_list.append(str(a)) # 处理URL链接 # 如果没有URL链接 # 如果没有文字 # 如果都有(直接判断哪个长) text_list.reverse() url_list.reverse() full_list = [(lambda i: text_list.pop() if ( text_list!= [ ] and ( i % 2 ==0 or url_list==[ ] )) else url_list.pop() )( i ) for i in range( len( text_list ) + len( url_list ) )] for full_msg in full_list: output_text += full_msg return output_text
|
这一段处理方法一定是有更好的操作的。但是暂时也想不出好用点的方法。于是就先将就着。
图片处理方法
此外我们还需要把图片信息提取,不然只有文字,用户可能不知道是什么样子的东西,究竟想不想要。
1 2 3 4 5 6 7 8 9 10 11
|
# 处理图片 (返回一个图片url列表) def pics_get(father_data): pics_url_pool = [] pics_num = father_data['pic_num'] # 判断图片数量 if pics_num != 0: child_pics_url = father_data['pics'] for url in child_pics_url: pics_url_pool.append(url['url']) else: pass return pics_url_pool
|
结语
当处理图片、处理时间、处理文字的情况都完成后,其他的就是一些筛选逻辑了。
具体的内容就不分享了,实际需求实际分析。
以上内容可能合理可能不合理,仅供参考。
标签:羊毛,
Python,
text,
list,
pics,
获取,
微博,
url,
data
From: https://www.cnblogs.com/hakold/p/16999360.html