使用selenium + Chrome爬取某网站乌云公开漏洞文章并保存为pdf文件

目的:使用selenium + Chrome爬取某网站指定类型的乌云公开漏洞文章,即在win10终端输入漏洞类型(如未授权),则爬取所有该类型的漏洞文章,并把每个分页的数字作为文件夹名,来保存该分页下面的所有的漏洞文章。

总结:本例只是能简单的爬取某一类型漏洞的所有文章,但不能爬取多个类型漏洞的所有文章,有时可能会有一些小bug导致没爬取完就崩溃,需要手工修改进而重新爬。其它问题解决看注释。

  1. 关于python代码里面出现中文在windows里面的处理,还没完全掌握。可参考Python for Windows 中文编码问题汇总
  2. 遇到的超时问题TimeoutException: Message: timeout 还没解决
  3. 本例代码只是输入漏洞的指定类型,才可以爬取其所有文章。但如想一块爬取漏洞的类型如 未授权、sql等,导入paramunittest也没搞定
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import unittest
import time
from lxml import etree
import urllib2
import pdfkit
import random
import os
import shutil
import urllib
# import chardet
import paramunittest

# @paramunittest.parametrized(
#     {‘user‘:‘编辑器漏洞‘,‘result‘:‘true‘},
    # {‘user‘:‘未授权‘,‘result‘:‘true‘},
# )

class wooyunSelenium(unittest.TestCase):
# class TestDemo(unittest.TestCase):
    ‘‘‘
    利用unittest模块的测试类来解决js分页,模拟点击下一页。

    ‘‘‘

    def setUp(self):
    # def setParameters(self, user, result):
        ‘‘‘
        初始化方法(固定写法),为测试准备环境。

        ‘‘‘
        # self.user = user
        # self.result = result

        # 创建谷歌浏览器对象。
        self.driver = webdriver.Chrome()

        # 创建无头浏览器对象,实测速度比谷歌浏览器的要快点,但不是很多,没有浏览器窗口界面。
        # self.driver = webdriver.PhantomJS()

        # input输入的提示语如果是字符串,要加双引号,如果是数字,直接输入(python2),如果是raw_input函数,则不管输入的是什么,全部返回的类型为字符串类型。
        # vname = input(‘请输入要查询的漏洞类型:‘)  "编辑器漏洞"

        # raw_input输入的字符不用加双引号,始终返回字符串类型
        self.vname = raw_input(‘请输入要查询的漏洞类型:‘)

        # 输出类型为str类型,检测该字符串的编码格式
        # print chardet.detect(vname)

        # 对字符串中文进行url编码使用urllib.quote函数,对字典里面的中文进行url编码使用urlencode函数
        # print type(urllib.quote(‘编辑器漏洞‘))
        # print urllib.quote(‘编辑器漏洞‘)

        # 实测发现windows系统的代码里面出现中文,默认编码格式为gbk,要进行解码处理,才不会出现中文乱码。
        # print self.vname
        os.mkdir(self.vname.decode(‘gbk‘))
        os.chdir(self.vname.decode(‘gbk‘))

        # 该处发现先解码后编码为utf-8,才可以解决下面成功获取响应内容。
        self.vname = urllib.quote(self.vname.decode(‘gbk‘).encode(‘utf-8‘))

        self.page = 1

        # 对self.vname进行url编码,由于是字符串,所以采用urllib.quote()函数来编码字符串成为url编码格式,如果为字典,则使用urlencode函数来处理。
        # urllib.uquote(self.vname)

        # 请求网页,如果该行代码放在testMooc方法,会导致抓取的数据有重复,而且漏抓。注意vname要转换为urlcode编码格式,否则会报错 UnicodeDecodeError: ‘utf8‘ codec can‘t decode byte 0xb1 in position 41: invalid start byte
        self.driver.get("http://wooyun.jozxing.cc/search?keywords=" + self.vname + "&&content_search_by=by_bugs&&search_by_html=False&&page=" + str(self.page))
        # self.driver.get(‘http://wooyun.jozxing.cc/search?keywords=%E7%BC%96%E8%BE%91%E5%99%A8%E6%BC%8F%E6%B4%9E&content_search_by=by_bugs‘)

    def testWooyun(self):
    # def testcase(self):
        ‘‘‘
        具体的测试用例方法(方法名开头固定以test开头)

        ‘‘‘

        # 加上u用来处理中文乱码,但发现不能使用PhantomJS,老是爆错,而谷歌浏览器则不会。
        # os.mkdir(u‘代码执行‘)
        # os.chdir(u‘命令执行‘)

        # 外循环控制页数,因为经过观察,某类型漏洞文章的最多分页是没有达到1000的,所以用该数以保证爬取到该类型漏洞的所有分页
        for i in range(self.page,1000):

            # 创建一个文件夹来存放该页所有文章,文件夹名字为分页数字
            os.mkdir(str(i))

            # 让网页完全加载,避免网页没加载完导致获取的数据丢失
            time.sleep(3)
            # 获取网页源码
            html = self.driver.page_source
            # 把源码解析为html dom文档
            content = etree.HTML(html)
            # 使用xpath去匹配所有的课程链接

            links = content.xpath(‘//td[2]/a/@href‘)

            n = 0
            # 遍历该分页里面的文章链接
            for each in links:
                each = ‘http://wooyun.jozxing.cc/‘ + each
                print each
                try:
                    # self.driver2 = webdriver.Chrome()报错,发现页面空白。至于是漏洞文章页面还是分页页面,还没确定,
                    # 处代码表明是漏洞文章页面请求为空。大约请求第234个,会出现一个空白页面,一直等待好像死机一样。解决方法把谷歌浏览器驱动程序放入python安装目录下的script目录
                    self.driver2 = webdriver.Chrome()
                    # self.driver2 = webdriver.PhantomJS()
                    # 加上下面2行代码,即设置超时时间,实测发现有效去除 不能读取vr下面的某个文件 报错。Unable to read VR Path Registry from C:\Users\hp\AppData\Local\openvr\openvrpaths.vrpath
                    self.driver2.set_page_load_timeout(10)
                    self.driver2.set_script_timeout(10)
                    # self.driver2.implicitly_wait(10)
                    self.driver2.get(each)
                    html2 = self.driver2.page_source
                    content2 = etree.HTML(html2)
                    # 获取文章章标题
                    # title = content2.xpath("//h3[@class=‘wybug_title‘]/text()")[0]
                    # 处理获取不到页面时的异常(页面空白),再请求访问一次(可设置多次甚至循环),获取不到页面的原因可能是网站的反爬机制造成的。
                    title = content2.xpath("//h3[@class=‘wybug_title‘]/text()")[0]
                except:
                    # 关闭当前打开漏洞文章的浏览器窗口,发现使用close有时没作用,则使用quit直接退出当前漏洞文章浏览器窗口
                    self.driver2.quit()
                    # 重新获取该漏洞页面
                    self.driver2 = webdriver.Chrome()
                    # self.driver2.implicitly_wait(10)
                    self.driver2.set_page_load_timeout(10)
                    self.driver2.set_script_timeout(10)
                    # self.driver2 = webdriver.PhantomJS()

                    # 怎么老是报超时错误:TimeoutException: Message: timeout
                    self.driver2.get(each)
                    html2 = self.driver2.page_source
                    content2 = etree.HTML(html2)
                    title = content2.xpath("//h3[@class=‘wybug_title‘]/text()")[0]

                # 设置保存的文件名,由于windows环境对文件名命名有‘/‘、‘\‘、‘?‘、‘|‘、‘<‘、‘>‘、‘"‘、‘*‘有限制,所以要有如下过滤
                filename = title[6:].strip().replace(‘"‘,‘‘).replace(‘/‘,‘_‘).replace(‘\\‘,‘_‘).replace(‘<‘,‘‘).replace(‘>‘,‘‘).replace(‘(‘,‘‘).replace(‘)‘,‘‘).replace(‘[‘,‘‘).replace(‘]‘,‘‘).replace(‘\\‘,‘‘).replace(‘%‘,‘‘).replace(‘;‘,‘‘).replace(‘*‘,‘‘).replace(‘?‘,‘‘).replace(‘:‘,‘‘).replace(‘|‘,‘‘).replace(u‘?‘,‘‘).replace(‘.‘,‘‘).replace(‘&‘,‘‘)
                # file = filename + ".pdf"
                n += 1
                # 初始文件名
                file1 = str(n) + ‘.pdf‘
                # 保存文件名
                file2 = filename + ‘.pdf‘
                try:
                    path_wk = r‘C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe‘
                    config = pdfkit.configuration(wkhtmltopdf = path_wk)
                    pdfkit.from_url(each, file1, configuration=config)
                except:
                    path_wk = r‘C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe‘
                    config = pdfkit.configuration(wkhtmltopdf = path_wk)
                    pdfkit.from_url(each, file1, configuration=config)

                self.driver2.quit()
                # m变量值用来区分同名文件
                m = 1
                # 由于文件名有重复,所以使用递归函数来处理,文件重名的,文件名末尾加递增数字保存。如a.pdf,a2.pdf
                self.modify_filename(file1,file2,filename,m)
                # time.sleep(random.randint(1,3))
            # 把当前分页里面的所有的文章文件移动到对应的分页文件里面
            for d in os.listdir(‘.‘):
                if d.split(‘.‘)[-1] == ‘pdf‘:
                    shutil.move(d,str(i))

            # 退出循环条件,从网页源码里面没找到某个类名,则返回为-1,进而作为当点击下一页时,如果没法点击时,则此时的返回值不为-1
            if (html.find(‘next disabled‘)) != -1:
                break

            # 模拟浏览器手动点击下一页。  phantomjs好像不支持翻页,但有时候测试发现也支持。搞不懂。
            self.driver.find_element_by_xpath(‘//li[@class="next"]/a‘).click()
            # self.assertTrue(self.result == "true")

    def modify_filename(self,file1,file2,filename,m):
       ‘‘‘
       更改文件名函数
       如有多个同名文件,自动在文件名末尾加上数字,从2开始。
       方法递归

       ‘‘‘

       if os.path.exists(file2):
            m += 1
            file2 = filename + str(m) + ‘.pdf‘
            self.modify_filename(file1,file2,filename,m)
       else:
            os.rename(file1,file2)
            return

    def tearDown(self):
        ‘‘‘ 退出方法(固定写法),清理测试环境,以备下次测试使用‘‘‘

        self.driver.quit()

if __name__ == ‘__main__‘:
    unittest.main()
    # unittest.main(verbosity=2)

原文地址:https://www.cnblogs.com/silence-cc/p/9463227.html

时间: 2024-08-13 08:12:13

使用selenium + Chrome爬取某网站乌云公开漏洞文章并保存为pdf文件的相关文章

使用selenium + chrome爬取中国大学Mooc网的计算机学科的所有课程链接

目的:使用selenium + chrome爬取中国大学Mooc网计算机学科的所有的课程链接列表 思路:找到每个分页的节点属性为class="m-course-list" 的div元素,再找到该元素下面的类属性为class = "u-clist f-bg f-cb f-pr j-href ga-click"的div元素的属性data-href的值,使用xpath获取. 难点:在网页源码里面,是看不到相关的课程链接信息,点击分页,发现地址栏的url一直都在变,但改变u

selenium+python 爬取网络图片(1) -- soso、谷歌、好搜

做图像处理的朋友,都时常需要收集整理大量的图像数据集.做科研时有各种现有的标准数据集大家都直接拿来用,但是工程上却经常需要自己收集图片,从网上爬取图片便成了比较常见的任务.为了用python完成这个任务,需要解决如下两个问题: 1. 图片素材源自哪里呢?第一直觉就是搜索引擎里的图片,比如要收集手机的图片,则进入搜索引擎搜索关键字即可得到大量相关图片. 2. 动态网站的内容往往是通过ajax异步加载,直接用python中urllib库read到的内容不完整,且需要的内容基本都是异步加载进来的,直接

python爬虫--爬取某网站电影下载地址

前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用到的网址仅供交流学习使用,如有不妥,请联系删除. 背景:自己有台电脑要给老爸用,老爷子喜欢看一些大片,但是家里网络环境不好,就想批量下载一些存到电脑里.但是目前大部分的网站都是这样的, 需要一个个地点进去,才能看到下载地址 如果我要下载100部电影,那肯定手都要点断了,于是便想把这些地址给爬取出来,

python+selenium+requests爬取我的博客粉丝的名称

爬取目标 1.本次代码是在python2上运行通过的,python3的最需改2行代码,用到其它python模块 selenium 2.53.6 +firefox 44 BeautifulSoup requests 2.爬取目标网站,我的博客:https://home.cnblogs.com/u/yoyoketang爬取内容:爬我的博客的所有粉丝的名称,并保存到txt 3.由于博客园的登录是需要人机验证的,所以是无法直接用账号密码登录,需借助selenium登录 selenium获取cookies

python爬取某个网站的图片并保存到本地

python爬取某个网站的图片并保存到本地 #coding:utf-8 import urllib import re import sys reload(sys) sys.setdefaultencoding('gb2312') #获取整个页面的数据 def getHtml (url): page = urllib.urlopen(url) html = page.read() return html #保存图片到本地 def getImg(html): reg = r'src="(.+?\.

[python爬虫] Selenium定向爬取PubMed生物医学摘要信息

本文主要是自己的在线代码笔记.在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容.        PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要.它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科.它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学.        PubMed是因特网上使用最广泛的免费MEDLINE,该搜寻引

webmagic爬取渲染网站

最近突然得知之后的工作有很多数据采集的任务,有朋友推荐webmagic这个项目,就上手玩了下.发现这个爬虫项目还是挺好用,爬取静态网站几乎不用自己写什么代码(当然是小型爬虫了~~|).好了,废话少说,以此随笔记录一下渲染网页的爬取过程首先找到一个js渲染的网站,这里直接拿了学习文档里面给的一个网址,http://angularjs.cn/ 打开网页是这样的 查看源码是这样的 源码这么少,不用说肯定是渲染出来的了,随便搜了一条记录,果然源码里面找不到结果 那就开始解析网址了,从浏览器开发者工具里面

python爬虫-基础入门-爬取整个网站《3》

python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python2.x 使用类库: >> urllib 库 >> urllib2 库 python3.x 使用的类库: >> urllib 库 变化: -> 在python2.x中使用import urllib2 ----- 对应的,在python3.x 中会使用import url

Python骚操作!利用Python来爬取IP代理!偷偷给文章刷阅读量!

二.代码 代码直接参考了下文,更多解读参见原文,其中将ip提取部分修改了下,并将用来测试IP是否可用的百度url改成了CSDN博客里文章的url. 进群:548377875   即可获取数十套PDF哦! 另外也试了下豆瓣......嗯,立马就"403",上不去了,所以看了本文想刷其他网站数据的朋友,还是三思而行,如果账号被封,概不负责哦.==. 代码(py3.5版本):源码奉上! # coding: utf-8 import urllib.request import urllib.p