这是一个因为某天的突发奇想而诞生的项目,本人其实没有花太多时间进行维护,只是完成了爬虫部分的设计和部分数据的处理,主要的网站部分由勤勉的KurodaAkira完成,同时也感谢graydove[45735]的帮助;也感谢u2管理组的支持(XDD管理组一声不同意估计这项目就没了hhh),算起来突发奇想应该是国庆的时候,到现在将将好一个月,正好来整理一下内容。

需求及难点分析(仍有部分内容未向管理组求证)

  • 需要获取用户的邀请信息:是否为直接注册用户,如果不是,该用户由谁邀请?
  • 部分用户设置了高隐私,无法获取邀请信息,如何解决?
  • 用户名可以更改,目前的爬虫,全量爬取时间太长,中间大量的空白页面没有设置sleep,可能会对u2服务器造成一定的负担(考虑整理一份用户uid表,只爬取表内的uid页面,先鸽着);
  • 部分用户由于不珍惜账号或者现充掉导致账号被封禁或者被删除,这类账号能否正确获取邀请信息,如果不能,对于邀请树的制作有多大影响?有无方法解决?
  • 如何方便由爬虫数据制作邀请树,并且能够方便地进行更新?(似乎问题已经被KurodaAkira解决)

代码部分

模拟登陆,获取Cookie

(其实是我在网上照着抄的,自己改了点东西,但是找不到原来的地址了,就不贴了)

import gzip
import http.cookiejar
import io
import os
import socket
import sys
import re
import requests
import time
import urllib

CaptchaUrl = "https://u2.dmhy.org/captcha.php"
PostUrl = "https://u2.dmhy.org/takelogin.php"

Cookie_File = 'E:\\Cookie.txt'
Cookie = http.cookiejar.MozillaCookieJar(Cookie_File)
Handler = urllib.request.HTTPCookieProcessor(Cookie)
Opener = urllib.request.build_opener(Handler)

#Login Info
Loginmail = '{YourLoginEmail}'
password = '{YourPassword}'

# 请根据自己的情况填写,或者安全起见使用屏幕读入的方式使用

# Save Captcha
Captcha = Opener.open(CaptchaUrl).read()
local = open('E:\\Captcha.jpg','wb')
local.write(Captcha)
local.close()
Captcha_Code = input('请输入验证码:')

Post_Data = {
    'login_type': 'email',
    'login_ajax': 1,
    'username': Loginmail,
    'password': password,
    'captcha': Captcha_Code
}
Headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9,ja;q=0.8,zh-CN;q=0.7,zh;q=0.6',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
data = urllib.parse.urlencode(Post_Data)
request = urllib.request.Request(PostUrl,data=data.encode(encoding='UTF8'),headers=Headers)

try:
    response = Opener.open(request)
    result = response.read().decode('utf-8')
    print(result)
    Cookie.save()
    for item in Cookie:
        print('%s = %s' % (item.name,item.value))
except (urllib.request.HTTPError) as e:
    print(e.code)

用户数据爬取

好像用户名有可能会多获取一个<i></i>的标签,懒得改……暂时也不知道怎么改……不过好像有用户的用户名里就是有这个233

import time
import urllib
import http.cookiejar

f = open("E:\\output.txt","w",encoding='utf-8')
Cookie_File = "E:\\Python爬虫\Cookie.txt"
Cookie = http.cookiejar.MozillaCookieJar()
Cookie.load(Cookie_File,ignore_discard=True,ignore_expires=True)
Handler = urllib.request.HTTPCookieProcessor(Cookie)
Opener = urllib.request.build_opener(Handler)

Count = 0
Total_User = 0
Reject = 0
Normal = 0
Scan_Start = 46875
Scan_Stop = 49000
Scan_Num = Scan_Stop-Scan_Start+1


for uid in range(Scan_Start,Scan_Stop):
    Count += 1
    URL = 'https://u2.dmhy.org/userdetails.php?id='+str(uid)
    Flag=1
    while Flag:
        try:
            print("Processing: %d of %d" %(Count,Scan_Num))
            User_Page = Opener.open(URL,timeout=10).read().decode('utf-8')
            Flag = 0
        except (urllib.request.HTTPError,urllib.request.socket.timeout) as e: 
            Flag = 1
            Opener.close()
    #f.write(User_Page+"\n")
    try:
        User_Page.index("<tr><td class=\"text\">没有该ID的用户!</td></tr>")
    except:
        Total_User += 1 # 存在用户,总用户数+1
        try:
            Find_Name = User_Page.index("用户详情 - ")
            f.write("%d\n" %uid) # 保存uid
            Name_Find = User_Page[Find_Name:Find_Name+49] # 用户名
            f.write(Name_Find[Name_Find.index("-")+2:Name_Find.index("</title>")]+"\n")
        except:
            f.write("This_is_An_Anonymous!\n") # 获取出错,随手写一段文字
        try:
            If_Rejected = User_Page.index("用户想要保护其隐私")
            Reject += 1
            f.write("999999\n") # 邀请人 999999 表示神秘233
        except:
            try:
                Normal += 1
                Inviter_Find = User_Page.index("邀请人")
                Signin_Date_Find = User_Page.index("加入日期")
                TMP0 = User_Page[Inviter_Find:Signin_Date_Find]
                Inviter_Find = TMP0.index("userdetails.php?id=") + 19
                TMP = TMP0[Inviter_Find:Inviter_Find+8]
                TMP = TMP[0:TMP.index("\"")]
                Inviter_S = TMP0.index("dir=\'ltr\'>")
                Inviter_E = TMP0.index("</bdo>")
                f.write(TMP+" "+TMP0[Inviter_S+10:Inviter_E]+"\n")
            except:
                f.write("%d\n" % 0)
        f.write("EOU----------\n") # 单个用户信息的结束标识符
        time.sleep(3) # 缩进打错了,导致获取空页面之后不sleep,但是考虑到每个sleep 3s太慢了,于是没有改(即将被u2的sysop暴打(x
f.write("Total User = %d\n" %Total_User)
f.write("Normal = %d\n" %Normal)
f.write("Anonymous = %d\n" %Reject) # 统计信息
f.close()

邀请树查询网站前后端

被KurodaAkira大佬一个人全包了XDDD,我是学物理的不会写网页,溜了(x

Last modification:November 5, 2018
(๑´ڡ`๑)