热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无界面Linux系统和Windows系统使用selenium爬取CNVD数据

因为CNVD官网采用了反爬机制,所以使用selenium能够更容易的爬取漏洞数据1、在Windows中使用注意根据chrome版本下载对应chromedriver2、在无界面的Li

因为CNVD官网采用了反爬机制,所以使用selenium能够更容易的爬取漏洞数据

1、在Windows中使用

注意根据chrome版本下载对应chromedriver

2、在无界面的Linux中使用

因为对于爬虫的识别,无头模式相对于有头模式特征多,所以尽量使用有头模式,在无界面Linux中使用有头模式需要安装Xvfb。

yum install Xvfb -y

yum install xorg-x11-fonts* -y

有头模式不能添加add_argument('--headless'),如果使用无头模式则添加这一项。

安装Xvfb后可能会提示“DevToolsActivePort文件不存在”,那么添加options.add_argument('--no-sandbox')。

使用Xvfb启动:

xvfb-run python3 cnvd_download.py

### selenium使用的版本为1.141.0
### Python版本为3.8.12
import os
import random
import sys
import time
from configparser import ConfigParser
from io import BytesIO
import ddddocr
from PIL import Image
# from pytesseract import pytesseract
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
# 读取配置文件信息
cf = ConfigParser()
cf.read('config.ini')
sys_path = os.path.abspath(".")
def get_config_data(target):
cnnvd_filed = {}
for k, v in cf.items(target):
cnnvd_filed[k] = v
return cnnvd_filed
class DownloadCnvd(object):
def __init__(self):
# 从配置文件获取下载文件存放目录
self.download_path = get_config_data('CNVDPATH')['download_path']
# 从配置文件获取url
self.url = get_config_data('CNVDURL')['url']
# 登录CNVD官网的账号邮箱
self.login_email = get_config_data('CNVDLOGIN')['email']
# 登录CNVD官网的账号密码
self.login_password = get_config_data('CNVDLOGIN')['password']
optiOns= webdriver.ChromeOptions()
# 配置下载文件存放目录
prefs = {'profile.default_content_settings.popups': 0,
'download.default_directory': os.path.join(sys_path, self.download_path)}
options.add_experimental_option('prefs', prefs)
# 修改windows.navigator.webdriver,防机器人识别机制,selenium自动登陆判别机制
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 禁止策略化
options.add_argument('disable-infobars')
# 当在Linux中使用xvfb进行有头操作时,此行配置解决DevToolsActivePort文件不存在的报错
options.add_argument('--no-sandbox')
options.add_argument('--ignore-certificate-errors')
options.add_argument("--disable-web-security")
# Linux中运行的配置,浏览器配置文件夹路径
options.add_argument('--user-data-dir=/home/ubuntu/.config/google-chrome')
# Windows中运行的配置,浏览器配置文件夹路径
#options.add_argument(r'--user-data-dir=C:\Users\Leeeee\AppData\Local\Google\Chrome\User Data')
# Linux中运行的配置, chromedriver的位置
self.driver = webdriver.Chrome(executable_path='/usr/bin/chromedriver', chrome_optiOns=options)
#self.driver = webdriver.Chrome(executable_path='chromedriver.exe', chrome_optiOns=options)
self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
# 使用pytesseract库进行识别图片验证码,不过识别率感人
def get_code(self):
element = self.driver.find_element_by_id('codeSpan') # 定位验证码图片
# 获取验证码图片在网页中的位置
left = int(element.location['x']) # 获取图片左上角坐标x
top = int(element.location['y']) # 获取图片左上角y
right = int(element.location['x'] + element.size['width']) # 获取图片右下角x
bottom = int(element.location['y'] + element.size['height']) # 获取图片右下角y
# img = conn.get(img_url)
# 通过Image处理图像
code_path = self.download_path + 'img' + '.png' # 生成随机文件名
self.driver.save_screenshot(code_path) # 截取当前窗口并保存图片
im = Image.open(code_path) # 打开图片
im = im.crop((left, top, right, bottom)) # 截图验证码
im.save(code_path) # 保存验证码图片
verityCode = Image.open(code_path)
code = pytesseract.image_to_string(verityCode)
return code
# 在Linux中获取验证码图片并识别验证码,使用ddddocr库进行图片验证码识别
def get_code2(self):
element = self.driver.find_element_by_id('codeSpan') # 定位验证码图片
# 获取图片验证码的请求地址
img_path0 = element.get_attribute('src')
url = img_path0
print(url)
time.sleep(1)
# 打开新的页面,url为图片验证码的请求地址,因为我在登陆页直接截图获得验证码图片的是白灰方格,不是正常验证码图片,所以。。。
newTab = f'window.open("{url}");'
self.driver.execute_script(newTab)
self.driver.switch_to.window(self.driver.window_handles[-1])
element2 = self.driver.find_element_by_xpath('/html/body/img')
left = int(element2.location['x']) # 获取图片左上角坐标x
top = int(element2.location['y']) # 获取图片左上角y
right = int(element2.location['x'] + element2.size['width']) # 获取图片右下角x
bottom = int(element2.location['y'] + element2.size['height']) # 获取图片右下角y
code_image = self.driver.get_screenshot_as_png()
code_png = Image.open(BytesIO(code_image)) # 打开图片
code_png = code_png.crop((left, top, right, bottom)) # 截图验证码
code_png.save('code_png.png')
my_ocr = ddddocr.DdddOcr()
with open('code_png.png', 'rb') as f:
code_img_bytes = f.read()
code = my_ocr.classification(code_img_bytes)
# 切换标签页为登录页面
self.driver.switch_to.window(self.driver.window_handles[0])
print(code)
return code
def get_code1(self):
element = self.driver.find_element_by_id('codeSpan') # 定位验证码图片
# 获取验证码图片在网页中的位置
left = int(element.location['x']) # 获取图片左上角坐标x
top = int(element.location['y']) # 获取图片左上角y
right = int(element.location['x'] + element.size['width']) # 获取图片右下角x
bottom = int(element.location['y'] + element.size['height']) # 获取图片右下角y
# img = conn.get(img_url)
# 通过Image处理图像
code_path = os.path.join(sys_path, self.download_path)+ 'img' + '.png' # 生成随机文件名
# self.driver.save_screenshot(code_path) # 截取当前窗口并保存图片
# im = Image.open(code_path) # 打开图片
# im = im.crop((left, top, right, bottom)) # 截图验证码
# im.save(code_path) # 保存验证码图片
code_image = self.driver.get_screenshot_as_png()
code_png = Image.open(BytesIO(code_image)) # 打开图片
code_png = code_png.crop((left, top, right, bottom)) # 截图验证码
code_png.save(code_path)
my_ocr = ddddocr.DdddOcr()
with open(code_path, 'rb') as f:
code_img_bytes = f.read()
code = my_ocr.classification(code_img_bytes)
os.remove(code_path)
print(code)
return code
# 点击文件进行下载,一页下载十个文件
def get_file(self, flag):
file_count = 10
if flag == 1:
file_count = 1
num = 1
while num <= file_count:
file = self.driver.find_element_by_xpath(
'/html/body/div[4]/div[1]/div/div[2]/table/tbody/tr[{}]/td[1]/a'.format(num))
file.click()
num += 1
time1 = random.random()
time2 = random.randint(1, 3)
time.sleep(time1 + time2)
# 获取“下一页”按钮并点击进行翻页
def get_next_page(self):
try:
page = self.driver.find_element_by_class_name('nextLink')
page.click()
except Exception as e:
return False
return True
# 在登录页进行登录
def login(self):
# 莫名其妙有时根据ID获取不到邮箱填写框,出错时根据xpath再找一次
try:
email = self.driver.find_element_by_id('email')
except NoSuchElementException as e:
email = self.driver.find_element_by_class_name('ipt')
# email = self.driver.find_element_by_xpath('/html/body/div[4]/div/form/div/p[1]/input')
passwd = self.driver.find_element_by_id('password')
code = self.driver.find_element_by_id('myCode')
code_password = self.get_code1()
email.clear()
# 怕填写太快,添加延时
for i in self.login_email:
email.send_keys(i)
time.sleep(random.random())
for i in self.login_password:
passwd.send_keys(i)
time.sleep(random.random())
for i in code_password:
code.send_keys(i)
time.sleep(random.random())
time.sleep(5)
# 找到登录按钮点击登录
login = self.driver.find_element_by_xpath('/html/body/div[4]/div/form/div/p[5]/a/span')
login.click()
time.sleep(2)
# 如果捕捉到“验证码错误”,则重新进行填写登录
try:
code_err = self.driver.find_element_by_id('myCode_error')
#重新填写
self.login()
except:
time.sleep(2)
self.driver.get(self.url)
return True
# 如果flag为0则全量下载,如果flag为1则只下载最新的一个文件
def run(self, flag=0):
self.driver.get(self.url)
# for i in d:
# driver.add_COOKIE(i)
if self.login():
while True:
self.get_file(flag=flag)
time.sleep(2)
if flag == 1:
break
result = self.get_next_page()
if not result:
break
self.driver.close()
self.driver.quit()
if __name__ == '__main__':
if len(sys.argv) != 2:
print('请添加参数 init:初始化规则库 update:更新规则库')
sys.exit()
get_cnvd_rule = DownloadCnvd()
if sys.argv[1] == 'init':
get_cnvd_rule.run()
elif sys.argv[1] == 'update':
get_cnvd_rule.run(1)
else:
print('请添加参数 init:初始化规则库 update:更新规则库')
#get_cnvd_rule = DownloadCnvd()
#get_cnvd_rule.run()


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有