【Python】羊毛获取小工具

前言

最近沉迷薅羊毛,然后想第一时间得到新的消息。 不过说实话第一时间是不存在的,除非跟商家直接对接。 于是乎只能靠微博啊,企鹅群等,看别人发的新信息了。 那么做一个简单的爬虫,定时爬一下消息应该挺不错的。

明确目标

要想一直知道什么羊毛,那么就需要不断去获取信息,刷新的第一时间就反应给用户。
伪代码逻辑如下:

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

结语

当处理图片、处理时间、处理文字的情况都完成后,其他的就是一些筛选逻辑了。
具体的内容就不分享了,实际需求实际分析。

以上内容可能合理可能不合理,仅供参考。

posted @ 2022-12-22 18:15  Hakold  阅读(91)  评论(0编辑  收藏  举报