文末有福利领取哦~
👉一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉二、Python必备开发工具
👉三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉 四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
👉五、Python练习题
检查学习结果。
👉六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
真的存在,并且还存在prev参数(前一页),说明我们的猜想可能是正确的,这时候细心的小伙伴可能发现了 url2中的next内容与url1中一致啊,哦原来是这样,这样才导致了我们刚刚调试台中出现3个url文件但是第二个与第三个一样的情况
但是我们猜想第三个url返回数据中应该没有next否则就应该出现第四个文件了,我们来试一试
在url3返回数据中检索next
真的为空了所以我们可以确定,只要瀑布流下方仍有数据,那么一定存在next参数 因此我们可以确定瀑布流url写法 我们网页分析完成 接下来就要进行真正的代码编写了
(其实我有一个疑问 url2与url3看起来确实是一模一样的并且我尝试做了差值运算,发现还是一样的,但是返回数据确实不同,有大神可以发现这两个url不同之处吗 下面放上这两个url)
(url已改变,根据官网实时更新数据一直在变)
url2=‘https://www.nike.com/w/graphql?queryid=products&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&endpoint=%2Fproduct_feed%2Frollup_threads%2Fv2%3Ffilter%3Dmarketplace(CN)%26filter%3Dlanguage(zh-Hans)%26filter%3DemployeePrice(true)%26filter%3DattributeIds(1c7c3d67-5d46-432d-9910-b1128d1b6503%2Ce09eabe9-5ff0-42af-b0a3-5f68af19d89a)%26anchor%3D24%26count%3D24%26consumerChannelId%3Dd9a5bc42-4b9c-4976-858a-f159cf99c647%26sort%3DproductInfo.merchPrice.currentPriceAsc’
url3=‘https://www.nike.com/w/graphql?queryid=products&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&endpoint=%2Fproduct_feed%2Frollup_threads%2Fv2%3Ffilter%3Dmarketplace(CN)%26filter%3Dlanguage(zh-Hans)%26filter%3DemployeePrice(true)%26filter%3DattributeIds(1c7c3d67-5d46-432d-9910-b1128d1b6503%2Ce09eabe9-5ff0-42af-b0a3-5f68af19d89a)%26anchor%3D48%26count%3D24%26consumerChannelId%3Dd9a5bc42-4b9c-4976-858a-f159cf99c647%26sort%3DproductInfo.merchPrice.currentPriceAsc’
我们首先需要写递归函数获取所有urls
我们观察json内容就会发现我们需要的商品数据都在一个名为objects的key中 因此需要将所有objects放在一起
递归函数(核心函数)如下
#刚刚在调试台得到的初始地址
url1=‘https://www.nike.com/w/graphql?queryid=filteredProductsWithContext&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&uuids=1c7c3d67-5d46-432d-9910-b1128d1b6503,e09eabe9-5ff0-42af-b0a3-5f68af19d89a&language=zh-Hans&country=CN&sortBy=priceAsc’
#观察其他urls发现前面参数是一样的如下 我们先写前半部分
urlother=‘https://www.nike.com/w/graphql?queryid=products&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&endpoint=’
urls=[url1]
#空list存放物品信息 观察发现json中的objects数据类型为list
pricedictlist=[]
#递归函数得到urls列表以及每个url中物品数据
def get_url_objcts(url=url1):
#首先得到初始url的json数据
response=requests.get(url)
#只取有用的数据内容 仔细观察json数据 得到下一个页面的next参数
#urllib.parse.quote(text)
按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。
所以 URL 中使用其他字符就需要进行 URL 编码。
try:
nextpage_json=quote(response.json()[‘data’][‘filteredProductsWithContext’][‘pages’][‘next’])
#添加objects内容到列表
pricedictlist.extend(response.json()[‘data’][‘filteredProductsWithContext’][‘objects’])
except KeyError:
nextpage_json = quote(response.json()[‘data’][‘products’][‘pages’][‘next’])
添加objects内容到列表
pricedictlist.extend(response.json()[‘data’][‘products’][‘objects’])
except TypeError:
nextpage_json=‘’
#递归获取url与objects
if nextpage_json!=‘’:
urlnext=urlother+nextpage_json
urls.append(urlnext)
nextpage_json=‘’
get_url_objcts(urlnext)
#else只在不存在下一页时执行,相当于此时已经完成了objects的获取 下面构建发送信息
else:
i = 0
STR = str(‘https://www.nike.com/cn/w/nba-sleeveless-and-tank-tops-18iwiz9sbux?sort=priceAsc’)
compStr1 = ‘’
for each in pricedictlist:
title = each[‘publishedContent’][‘properties’][‘seo’]
if title == None:
continue
currentPrice = each[‘productInfo’][0][‘merchPrice’][‘currentPrice’]
fullPrice = each[‘productInfo’][0][‘merchPrice’][‘fullPrice’]
#只选取有用的数据 我们不要童装 同时只要打折商品
if (not re.search(‘童’, str(title[‘slug’]))) and (fullPrice != currentPrice):
i = i + 1
STR = STR + ‘\n\n’ + ((str(title[‘slug’]) + “\n” + " 原价" + str(fullPrice) + " 现价" + str(
currentPrice)) + ’ ’ + str(currentPrice * 100 / fullPrice) + ‘%’)
#发现每个商品名称后面都有独特的商品码为6个字母标识,所以切片记录下来用于对比
compStr1 = compStr1 + str(title[‘slug’][-6:])
STR = STR + ‘\n’ + (“本次数据一共:” + str(i) + “个”)
这之上 我们已经完成了数据的获取,接下来就是微信机器人发送了
itchat是个人账户的开放源码wechat api项目,它使您可以通过命令行访问您的个人微信帐户。
如何向群发送消息?
import itchat
#登录微信网页版 参数enableCmdQR=0会出现图片二维码登录 为1则命令行窗口输出字符二维码 有的linux因为字符间距问题需要设置为2
itchat.auto_login(hotReload=0,enableCmdQR=0)
自己创建微信群,名称自定,并且要保存到通信录
chatroomName = ‘Money’ # 群名
itchat.get_chatrooms(update=True)
chatrooms = itchat.search_chatrooms(name=chatroomName)
print(compStr0)
if len(chatrooms) == 0:
print(‘没有找到群聊:’ + chatroomName)
exit(0)
else:
itchat.send_msg(‘hello world’, toUserName=chatrooms[0][‘UserName’]) # 发送消息
这就是简单的发送消息了,将我们上面的程序接合就可以实现微信发送了 还差一步,没错就是定时任务的问题
听名字就知道是干什么的 没错就是任务调度,我们可以使用这个库简洁的实现任务调度问题
简单例程如下:
from apscheduler.schedulers.blocking import BlockingScheduler
import time
scheduler = BlockingScheduler()
def job1():
print (“%s: 执行任务” % time.asctime())
scheduler.add_job(job1, ‘interval’, seconds=3)
scheduler.start()
将环境配置好,直接放在自己的服务器就可以运行了,这一步就不再赘述
import re
import requests
from urllib.parse import quote
import itchat
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
#登录微信网页版 参数enableCmdQR=0会出现图片二维码登录 为1则命令行窗口输出字符二维码 有的linux因为字符间距问题需要设置为2
itchat.auto_login(hotReload=0,enableCmdQR=2)
#比较字符串,用于判断是否更新数据
compStr0=‘fuckkkkkkkkkkkkkkkk’
def main():
#刚刚在调试台得到的初始地址
url1=‘https://www.nike.com/w/graphql?queryid=filteredProductsWithContext&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&uuids=1c7c3d67-5d46-432d-9910-b1128d1b6503,e09eabe9-5ff0-42af-b0a3-5f68af19d89a&language=zh-Hans&country=CN&sortBy=priceAsc’
#观察其他urls发现前面参数是一样的如下 我们先写前半部分
urlother=‘https://www.nike.com/w/graphql?queryid=products&anonymousId=A54CD5202A87B54B4415AD4BC11E5692&endpoint=’
urls=[url1]
#空list存放物品信息 观察发现json中的objects数据类型为list
pricedictlist=[]
#递归函数得到urls列表以及每个url中物品数据
def get_url_objcts(url=url1):
#首先得到初始url的json数据
response=requests.get(url)
#只取有用的数据内容 仔细观察json数据 得到下一个页面的next参数
#urllib.parse.quote(text)
按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。
所以 URL 中使用其他字符就需要进行 URL 编码。
try:
nextpage_json=quote(response.json()[‘data’][‘filteredProductsWithContext’][‘pages’][‘next’])
pricedictlist.extend(response.json()[‘data’][‘filteredProductsWithContext’][‘objects’])
except KeyError:
nextpage_json = quote(response.json()[‘data’][‘products’][‘pages’][‘next’])
pricedictlist.extend(response.json()[‘data’][‘products’][‘objects’])
except TypeError:
nextpage_json=‘’
#递归获取url与objects
if nextpage_json!=‘’:
urlnext=urlother+nextpage_json
urls.append(urlnext)
nextpage_json=‘’
get_url_objcts(urlnext)
#else只在不存在下一页时执行,相当于此时已经完成了objects的获取
else:
i = 0
STR = str(‘https://www.nike.com/cn/w/nba-sleeveless-and-tank-tops-18iwiz9sbux?sort=priceAsc’)
compStr1 = ‘’
for each in pricedictlist:
title = each[‘publishedContent’][‘properties’][‘seo’]
if title == None:
continue
currentPrice = each[‘productInfo’][0][‘merchPrice’][‘currentPrice’]
fullPrice = each[‘productInfo’][0][‘merchPrice’][‘fullPrice’]
#只选取有用的数据 我们不要童装 同时只要打折商品
if (not re.search(‘童’, str(title[‘slug’]))) and (fullPrice != currentPrice):
i = i + 1
STR = STR + ‘\n\n’ + ((str(title[‘slug’]) + “\n” + " 原价" + str(fullPrice) + " 现价" + str(
currentPrice)) + ’ ’ + str(currentPrice * 100 / fullPrice) + ‘%’)
#发现每个商品名称后面都有独特的商品码为6个字母标识,所以切片记录下来用于对比
compStr1 = compStr1 + str(title[‘slug’][-6:])
STR = STR + ‘\n’ + (“本次数据一共:” + str(i) + “个”)
#自己创建微信群,名称自定
chatroomName = ‘Money’ # 群名
itchat.get_chatrooms(update=True)
chatrooms = itchat.search_chatrooms(name=chatroomName)
global compStr0
print(compStr0)
if len(chatrooms) == 0:
print(‘没有找到群聊:’ + chatroomName)
exit(0)
else:
#判断数据是否变化
if (compStr1 != compStr0):
itchat.send_msg(STR, toUserName=chatrooms[0][‘UserName’]) # 发送消息
compStr0 = compStr1
print(compStr0)
get_url_objcts()
sched = BlockingScheduler()
任务调度 每2分钟触发 时间自定
sched.add_job(main, ‘interval’, minutes=2, next_run_time=datetime.now())
sched.start()
itchat.run()
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!