声明:
用到网站为搜索引擎搜索出来的,与本人无任何直接或间接关系。
本文章仅讲解python技术实现方法,仅供学习交流,不对网站内容负责。
Python获取节点实现方法
先上完整代码,看不懂的继续往下看讲解。
完整代码
import json
import re
import requests
try:
from lxml import etree
except ImportError:
import os
os.system('pip install lxml')
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/88.0.4324.150 Safari/537.36',
'origin': 'https://www.youneed.win',
'referer': 'https://www.youneed.win/free-ssr'
}
# 获取表单数据ps_ajax
def getData():
url = 'https://www.youneed.win/free-ssr'
res = requests.get(url, headers=headers).content.decode()
selector = etree.HTML(res)
ps_ajax = selector.xpath('//*[@id="passster-public-js-extra"]/text()')[0]
data = re.search('ps_ajax = (.*);', ps_ajax).group(1)
data = json.loads(data)
return data
# 提交表单获取ssr
def getSsr(ps_ajax):
form_data = { # 表单数据
'action': 'validate_input',
'nonce': ps_ajax['nonce'],
'captcha': 'success',
'post_id': ps_ajax['post_id'],
'type': 'captcha'
}
url = 'https://www.youneed.win/wp-admin/admin-ajax.php'
res = requests.post(url, headers=headers, data=form_data).json()
content = res['content']
selector = etree.HTML(content)
SSRs = selector.xpath('//td/a/@data')
return SSRs
# for ssr in SSRs:
# print(SSRs)
# writeMsg(ssr + "\n")
# 获取ssr更新时间
def getUpDate():
"""返回ssr的更新时间"""
url = 'https://www.youneed.win/free-ssr'
res = requests.get(url, headers=headers).text
# update = re.findall('<meta property="og:description" content="(.*) …" />', res)[0]
selector = etree.HTML(res)
update = selector.xpath('//section/p/text()')
print(update[0])
return update[0]
# 写入当前目录下ssr.txt文件
def writeMsg(item):
"""文本写入"""
with open('./ssr.txt', 'a', encoding='utf-8') as f:
f.write(item)
# 格式化文本
def formatFile():
with open(r'./ssr.txt', 'a+', encoding='utf-8') as f:
f.truncate(0)
if __name__ == "__main__":
date = getUpDate() # 获取ssr更新时间
formatFile() # 格式化文本
writeMsg(date + "\n\n") # 追加写入当前时间
cfg = getData() # 获取提交表单的参数
ssrArray = getSsr(cfg) # 获取ssr数组
for i in ssrArray:
print(i)
writeMsg(i + "\n")
print("done")
准备工作
用到的包:json, re, requests, lxml
如缺少包自行pip安装或使用如下代码
try:
import json
except ImportError:
import os
os.system('pip install json')
try:
import requests
except ImportError:
import os
os.system('pip install requests')
try:
import re
except ImportError:
import os
os.system('pip install re')
try:
from lxml import etree
except ImportError:
import os
os.system('pip install lxml')
分析网站
网站有一个算术题验证机制,
F12 > 点击network
然后刷新网页,计算一次结果,并点击提交
可以发现网站是通过ajax异步刷新实现展示的,响应体就是节点信息
然后查看请求头,发现post一个表单信息。并没有我们计算的结果在里边,可以确定获取节点信息不需要计算。
按ctrl+f > 搜索"nonce:",并将内容复制出来查看,
在下图这个中找到了这个代码,对heards中表单数据,这就是我们要找的。
可以看出来只有nonce 和 post_id两个是变量,在控制台中打印ps_ajax看看是个啥
json呀,我们再刷新一下网页,不提交算数验证码,控制台打印ps_ajax,发现竟然还是可以。这就证明了不需要验证算数,pa_ajax应该是存在html中的。
右键,查看网页源代码,搜索,果然有,找到之后,就好办多了。现在可以开始了
设置请求头模拟浏览器请求
# 设置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/88.0.4324.150 Safari/537.36',
'origin': 'https://www.youneed.win',
'referer': 'https://www.youneed.win/free-ssr'
}
获取ps_ajax数据
# 获取表单数据ps_ajax
def getData():
url = 'https://www.youneed.win/free-ssr'
res = requests.get(url, headers=headers).content.decode()
selector = etree.HTML(res)
ps_ajax = selector.xpath('//*[@id="passster-public-js-extra"]/text()')[0]
data = re.search('ps_ajax = (.*);', ps_ajax).group(1)
data = json.loads(data)
return data
获取节点
# 提交表单获取ssr, 传入getData
def getSsr(ps_ajax):
form_data = { # 表单数据
'action': 'validate_input',
'nonce': ps_ajax['nonce'],
'captcha': 'success',
'post_id': ps_ajax['post_id'],
'type': 'captcha'
}
url = 'https://www.youneed.win/wp-admin/admin-ajax.php'
res = requests.post(url, headers=headers, data=form_data).json()
content = res['content']
selector = etree.HTML(content)
SSRs = selector.xpath('//td/a/@data')
return SSRs
获取更新时间
# 获取ssr更新时间
def getUpDate():
"""返回ssr的更新时间"""
url = 'https://www.youneed.win/free-ssr'
res = requests.get(url, headers=headers).text
# update = re.findall('<meta property="og:description" content="(.*) …" />', res)[0]
selector = etree.HTML(res)
update = selector.xpath('//section/p/text()')
print(update[0])
return update[0]
操作文本文件
等下将结果写在同级目录下的ssr.txt
# 写入当前目录下ssr.txt文件
def writeMsg(item):
"""文本写入"""
with open('./ssr.txt', 'a', encoding='utf-8') as f:
f.write(item)
# 格式化文本
def formatFile():
with open(r'./ssr.txt', 'a+', encoding='utf-8') as f:
f.truncate(0)
main
if __name__ == "__main__":
date = getUpDate() # 获取ssr更新时间
formatFile() # 格式化文本
writeMsg(date + "\n\n") # 追加写入当前时间
cfg = getData() # 获取提交表单的参数
ssrArray = getSsr(cfg) # 获取ssr数组
for i in ssrArray:
print(i)
writeMsg(i + "\n")
print("done")