这是一个因为某天的突发奇想而诞生的项目,本人其实没有花太多时间进行维护,只是完成了爬虫部分的设计和部分数据的处理,主要的网站部分由勤勉的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
4 comments
看的我热血沸腾啊
大佬的代码是用python跑的吗?看着想,但是这个双斜杠注释又不是了。。。⊗﹏⊗
抱歉QAQ,太菜了,忘了Python注释是井号……已改……