警告:本教程仅可由于合法用途,由此带来的一切法律与其他形式责任自负。
这两天网课上得头疼,闲来无事,拿中国大学MOOC开开刀。
首先,打开自己的中国大学MOOC的“个人中心”页面。
可以看到,显示的信息包括用户名、关注、讨论等等。同时,发现其url格式为https://www.icourse163.org/home.htm?userId=XXX#/home/course
那好,随便修改一下userId再进行访问
成功跳转到了别人的个人中心界面。注意,这一部分其实应该属于公开信息!(因为如果你在讨论区域点击其他人的用户名一样会跳转到这个界面,官方并没有禁止访问)
想到刚开始用的时候老师曾经要求把用户名修改成学校+学号+姓名的格式(而且很多人不会再修改用户名)
那么,是否可以通过爬虫抓取用户名,从中筛选出有用的(也是相对敏感一些的)信息?当然可以。
尝试抓包,发现get到的html中并未含有有用信息(html在之后的加载过程中被修改了)
如果尝试模拟整个交互过程明显非常麻烦。怎么办?无头浏览器。通过模拟真实浏览器操作加载完整的html并进行抓取。
相关资料参见
selenium库的基本使用 - 简书
selenium无头浏览器–谷歌 - 北边的大鱼 - 博客园
下载chromedriver并进行配置。然后就可以进行抓取操作。
代码如下
import requests
import re
from selenium import webdriver
# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless') # # 浏览器不提供可视化页面
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速,GPU加速可能会导致Chrome出现黑屏,且CPU占用率高达80%以上
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) #不打印日志 否则每次抓取都会打印
driver = webdriver.Chrome(options=chrome_options, executable_path=r'XXXXX') #这里是chromedriver路径
#创建对象
for i in range(1140089847,1150170000): #i即为userId
url="https://www.icourse163.org/home.htm?userId={0}#/home/course"
url=url.format(i)
driver.get(url)
username = driver.find_elements_by_class_name('f-thide')[1].text #匹配到三个对象,第二个为用户名所在
#if(('u'in username) or('U' in username) or('大学' in username)): #筛选有用信息
print(i,end = " ")
print(username)
运行后就可以在命令行看到用户名以及对应的userId。至于userId的范围请自行实验,初步估计在1000万以上。
唯一的问题是信息有效率比较低,可能数千个数据仅有一个有效,而且数据来源无法定向。
但是另一个方面,资料的质量和效率相对较高。运气好的话详细信息全部会有。
更重要的有两点。一当然是这属于公开数据,相对安全。二是有了userId,可以通过课程/讨论/关注与粉丝,定位到该用户的同学和老师,再按照这些人的课程/讨论/关注与粉丝定位更多人。
如果该用户的用户名为敏感信息,则相关用户的用户名很有可能都是同一格式。换言之,这种方法提供的不是一个个单独的数据,而是一个个相互联系的人。
转载请注明出处 xyzmpv