最近在看hostloc论坛,发现访问其他用户的主页还可以加积分,刚好写个爬虫实现自己签到获取积分,顺便练习一下xpath的使用。理论适用于discuz类论坛。

需求分析

  • 登录dscuz论坛

    • 获取登录地址
      一般discuz论坛登陆地址都如 :https://域名/member.php?mod=logging&action=login,可以延申到其他论坛
  • 访问其他用户空间

    • 随机生成十八个用户uid号,使用get请求访问https://www.hostloc.com/space-uid-"生成的uid".html
  • 账号退出论坛

代码如下:

import requests, random, time
import urllib3
from lxml import etree


def hostloc(username, password):
    # 一般discuz论坛登陆地址都如https://域名/member.php?mod=logging&action=login
    index = 'https://www.hostloc.com/member.php?mod=logging&action=login'
    # 构造请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36",
        "X-Requested-With": "XMLHttpRequest"
    }
    # 忽视verify = False的错误提示
    requests.packages.urllib3.disable_warnings()
    # 获取seesion对象
    session = requests.Session()
    # 发送请求,获取xpath解析下的html页面
    response = session.get(index, verify=False, headers=headers).content
    html = etree.HTML(response)
    # 获取loginhash和formhash
    formhash = html.xpath('//*[@id="scbar_form"]/input[2]/@value')
    loginhash = html.xpath('/html/body/div[6]/div/div[2]/div/div[2]/div[1]/div[1]/form/@action')[0][-5:]
    # 构建登录地址
    loginUrl = 'https://www.hostloc.com/member.php?mod=logging&action=login&loginsubmit=yes&frommessage&loginhash=' + loginhash + '&inajax=1'
    data = {
        "formhash": formhash,
        "referer": "https://www.hostloc.com/forum.php",
        "loginfield": "username",
        "username": username,
        "password": password,
        "questionid": "0",
        "answer": ''
    }
    requests.packages.urllib3.disable_warnings()
    # 登录到该网页
    req = session.post(loginUrl, data=data, verify=False, headers=headers)
    # 访问十八个用户的空间加积分
    for i in range(0, 19):
        uid = random.randint(0, 40000)
        url = "https://www.hostloc.com/space-uid-" + str(uid) + ".html"
        session.get(url)
    # 访问论坛主页,获取退出论坛的formhash值然后get一下退出链接
    forum = etree.HTML(session.get("https://www.hostloc.com/forum.php").content
    # 获取退出登录链接
    logoutUrl = 'https://www.hostloc.com/' + forum.xpath('//*[@id="um"]/p[1]/a[6]/@href')[0]
    # #退出登录
    session.get(logoutUrl)


if __name__ == '__main__':
    username= input("请输入你的用户名:")
    password= input("请输入你的密码:")
    hostloc(username,password)

遇到的坑:

pip install lxml出现以下错误

ERROR: Could not find a version that satisfies the requirement lxml (from versions: none)
ERROR: No matching distribution found for lxml

原因:可能是网络的问题,这时我们用国内的镜像源来加速

pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

设置定时任务

定时任务可以放到服务器上自己执行,如果没有服务器,放在Linux电脑上也可以。

设置定时任务用到的是crontabs服务。

编辑任务

执行crontab -e

# m h dom mon dow command
# 定时执行python脚本,输出log,每天八点半执行一次
30 8 * * * python /home/test.py > /tmp/test_cron_log.txt 2>&1 &
# 定时执行shell命令
* * * * * echo "Hello world!" >> /tmp/test_cron_log.txt
# 定时执行shell脚本,test.sh需要有执行权限
* * * * * /root/test.sh >> /tmp/test_cron_log.txt

查看任务

执行crontab -l可以查看任务,此时会打开任务文件

每次编辑任务后,都需要使用service cron reload命令重载任务

参数解释

# m h dom mon dow command
crontab 文件的格式:
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 
o minute: 区间为 0 – 59 
o hour: 区间为0 – 23 
o day-of-month: 区间为0 – 31 
o month: 区间为1 – 12. 1 是1月. 12是12月. 
o Day-of-week: 区间为0 – 7. 周日可以是0或7.

好了,然后我们把代码放到服务器上,编写一个定时任务就可以每天自动签到了。

文章目录