Python | 自动爬取节点示例,re, requests, lxml,仅供技术学习

本文主要讲解Python技术实现网站数据获取的方法。先给出完整代码,接着介绍准备工作,分析网站发现其有算术题验证机制,但获取节点信息无需计算,ps_ajax存在于html中。还涉及设置请求头、获取数据、节点和更新时间,最后将结果写入文本文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明:
用到网站为搜索引擎搜索出来的,与本人无任何直接或间接关系。
本文章仅讲解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="(.*) &hellip;" />', 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="(.*) &hellip;" />', 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")

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针不南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值