上次写的微信版机器人的爬虫已经失效了,这次重新搞了爬虫,平常用的qq比较多所以也换成了qq版。
需要准备:
- Windows服务器一台,阿里云ECS即可(Linux也可以但是需要Wine,不如直接原生Windows)
- QQ小号一个,用来作为发送消息的载体
首先到coolq的社区下载最新版的coolq air,图灵版或者小i版都行,无所谓,我们不会用到他们的ai。
下载过后解压,双击CQA.exe即可运行coolq,之后像在电脑上登录一样登录自己的qq号即可,如下即为运行成功。
然后装一下coolq http插件,直接到release界面下载最新的插件,是一个后缀为cpk的文件,把他直接放到coolq的app目录之下
重启coolq,之后我们还需要手动启用一下这个插件
提示需要所有权限,点确定就可以了。
这时候会弹出一个coolqHttp的cmd窗口,就说明他已经开始工作了。
之后我们来处理爬虫的问题,要做到监控nike官网的目的,首先要能实时掌握他的数据。nike的nba官网爬虫写起来还是比较简单的,只有一个坑点是他有一些球衣会放到同一个大块里,然后随机展示其中的某一项为大图,比如詹姆斯,库兹玛和戴维斯三个人就经常放到一起,然后随机詹姆斯和戴维斯两个人的球衣作为展示图。这里的处理就是在普通的json object里它有嵌套了一个object,我们只需要递归地处理一下就可以了。
# crwaler.py
import requests
import json
UA = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
# 金额降序排列页面
url0 = 'https://www.nike.com/product_feed/rollup_threads/v2?filter=marketplace%28CN%29&filter=language%28zh-Hans%29&filter=employeePrice%28true%29&filter=attributeIds%281c7c3d67-5d46-432d-9910-b1128d1b6503%2Ce09eabe9-5ff0-42af-b0a3-5f68af19d89a%29&anchor=0&count=24&consumerChannelId=d9a5bc42-4b9c-4976-858a-f159cf99c647&sort=productInfo.merchPrice.currentPriceAsc'
def getObjInfo(object):
item = {}
item["名称"] = object["productInfo"][0]["productContent"]["title"]
item["类型名称"] = object["productInfo"][0]["productContent"]["subtitle"]
item["现价"] = object["productInfo"][0]["merchPrice"]["currentPrice"]
item["原价"] = object["productInfo"][0]["merchPrice"]["fullPrice"]
item["折扣"] = round((int(item["现价"]) / int(item["原价"])), 2)
return item
def get_url_objcts(url=url0):
item_list = []
response = requests.get(url, headers=UA)
json_dict = json.loads(response.text)
objects = json_dict["objects"]
for object in objects:
item = getObjInfo(object)
if '幼童' not in item["类型名称"]:
item_list.append(item)
for subObj in object["rollup"]["threads"]:
item = getObjInfo(subObj)
if '幼童' not in item["类型名称"]:
item_list.append(item)
next = json_dict["pages"]["next"]
if next != "":
next_url = "https://www.nike.com/" + str(next)
item_list.extend(get_url_objcts(next_url))
return item_list
写好爬虫之后,我们再写一个调用coolq http api的bot,实时监控有没有发生变化就可以了,这里的部分逻辑比较简单,就不多说了,关于coolq http的api可以直接看开发者的docs,讲解和demo都非常清晰明了。
import requests
import time
import copy
from crawler import *
log_file='test.log'
group_id=12345#这里填写你的qq群号,因为我是把这个bot放到一个群里通知所有人的,你也可以做你自己的,调用个人发送api。
url='http://127.0.0.1:5700'
group_path='/send_group_msg'
def send_group_msg(group_id=group_id,message=""):
resp=requests.post(url=url+group_path,data={"group_id":group_id,"message":message})
ago_clothes=[]
now_clothes=[]
while(True):
try:
print("页面爬取开始"+str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
now_clothes = get_url_objcts()
if sorted(ago_clothes, key=lambda x: x['名称']) != sorted(now_clothes, key=lambda x: x['名称']):
time.sleep(0.5)
send_group_msg(message="当前时间"+str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))+"球衣数据发生变化请注意!!!!!")
data=""
for index, clothing in enumerate(now_clothes):
time.sleep(0.5)
data=data+str(clothing)+'\n\n'
if index%3==0:
print(data)
send_group_msg(message=str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + '\n' + data)
data=''
print('发送成功')
ago_clothes = now_clothes
print("爬取完毕,等待下次执行"+str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))))
time.sleep(300)
except:
print("程序出现错误,将在60秒后重试")
time.sleep(60)
continue
运行即可。
当然我们一个py脚本在后台很难长时间保持稳定运行下去,我们可以利用nssm把运行的python脚本作为一个Windows服务,这样就可以长期稳定运行下去了。