这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了4种常见的注入技术,包括全局钩子、远线程钩子、突破SESSION 0隔离的远线程注入、APC注入。这篇文章主要讲解威胁情报分析,通过Python抓取FreeBuf网站“APT”主题的相关文章,后续会进一步采用数据挖掘、机器学习、知识图谱等方法进行深入分析。基础性文章,希望对您有所帮助~
作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~
文章目录
- 一.FreeBuf主网站分析
- 二.Python抓取文章标题
- 三.正文内容抓取
- 四.正文爬取完整代码
- 五.总结
作者的github资源:
软件安全:https://github.com/eastmountyxz/Software-Security-Course
其他工具:https://github.com/eastmountyxz/NetworkSecuritySelf-study
Windows-Hacker:https://github.com/eastmountyxz/Windows-Hacker-Exp
声明:如果侵权请联系读者,会立刻删除,作者的初衷是想分享大数据分析与安全、威胁情报结合的知识点,供更多安全人去学习。本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。
前文学习:
[网络安全自学篇] 一.入门笔记之看雪Web安全学习及异或解密示例
[网络安全自学篇] 二.Chrome浏览器保留密码功能渗透解析及登录加密入门笔记
[网络安全自学篇] 三.Burp Suite工具安装配置、Proxy基础用法及暴库示例
[网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
[网络安全自学篇] 五.IDA Pro反汇编工具初识及逆向工程解密实战
[网络安全自学篇] 六.OllyDbg动态分析工具基础用法及Crakeme逆向
[网络安全自学篇] 七.快手视频下载之Chrome浏览器Network分析及Python爬虫探讨
[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster工具
[网络安全自学篇] 九.社会工程学之基础概念、IP获取、IP物理定位、文件属性
[网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
[网络安全自学篇] 十一.虚拟机VMware+Kali安装入门及Sqlmap基本用法
[网络安全自学篇] 十二.Wireshark安装入门及抓取网站用户名密码(一)
[网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
[网络安全自学篇] 十四.Python攻防之基础常识、正则表达式、Web编程和套接字通信(一)
[网络安全自学篇] 十五.Python攻防之多线程、C段扫描和数据库编程(二)
[网络安全自学篇] 十六.Python攻防之弱口令、自定义字典生成及网站暴库防护
[网络安全自学篇] 十七.Python攻防之构建Web目录扫描器及ip代理池(四)
[网络安全自学篇] 十八.XSS跨站脚本攻击原理及代码攻防演示(一)
[网络安全自学篇] 十九.Powershell基础入门及常见用法(一)
[网络安全自学篇] 二十.Powershell基础入门及常见用法(二)
[网络安全自学篇] 二十一.GeekPwn极客大赛之安全攻防技术总结及ShowTime
[网络安全自学篇] 二十二.Web渗透之网站信息、域名信息、端口信息、敏感信息及指纹信息收集
[网络安全自学篇] 二十三.基于机器学习的恶意请求识别及安全领域中的机器学习
[网络安全自学篇] 二十四.基于机器学习的恶意代码识别及人工智能中的恶意代码检测
[网络安全自学篇] 二十五.Web安全学习路线及木马、病毒和防御初探
[网络安全自学篇] 二十六.Shodan搜索引擎详解及Python命令行调用
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)
[网络安全自学篇] 二十八.文件上传漏洞和Caidao入门及防御原理(一)
[网络安全自学篇] 二十九.文件上传漏洞和IIS6.0解析漏洞及防御原理(二)
[网络安全自学篇] 三十.文件上传漏洞、编辑器漏洞和IIS高版本漏洞及防御(三)
[网络安全自学篇] 三十一.文件上传漏洞之Upload-labs靶场及CTF题目01-10(四)
[网络安全自学篇] 三十二.文件上传漏洞之Upload-labs靶场及CTF题目11-20(五)
[网络安全自学篇] 三十三.文件上传漏洞之绕狗一句话原理和绕过安全狗(六)
[网络安全自学篇] 三十四.Windows系统漏洞之5次Shift漏洞启动计算机
[网络安全自学篇] 三十五.恶意代码攻击溯源及恶意样本分析
[网络安全自学篇] 三十六.WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
[网络安全自学篇] 三十七.Web渗透提高班之hack the box在线靶场注册及入门知识(一)
[网络安全自学篇] 三十八.hack the box渗透之BurpSuite和Hydra密码爆破及Python加密Post请求(二)
[网络安全自学篇] 三十九.hack the box渗透之DirBuster扫描路径及Sqlmap高级注入用法(三)
[网络安全自学篇] 四十.phpMyAdmin 4.8.1后台文件包含漏洞复现及详解(CVE-2018-12613)
[网络安全自学篇] 四十一.中间人攻击和ARP欺骗原理详解及漏洞还原
[网络安全自学篇] 四十二.DNS欺骗和钓鱼网站原理详解及漏洞还原
[网络安全自学篇] 四十三.木马原理详解、远程服务器IPC$漏洞及木马植入实验
[网络安全自学篇] 四十四.Windows远程桌面服务漏洞(CVE-2019-0708)复现及详解
[网络安全自学篇] 四十五.病毒详解及批处理病毒制作(自启动、修改密码、定时关机、蓝屏、进程关闭)
[网络安全自学篇] 四十六.微软证书漏洞CVE-2020-0601 (上)Windows验证机制及可执行文件签名复现
[网络安全自学篇] 四十七.微软证书漏洞CVE-2020-0601 (下)Windows证书签名及HTTPS网站劫持
[网络安全自学篇] 四十八.Cracer第八期——(1)安全术语、Web渗透流程、Windows基础、注册表及黑客常用DOS命令
[网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[网络安全自学篇] 五十.虚拟机基础之安装XP系统、文件共享、网络快照设置及Wireshark抓取BBS密码
[网络安全自学篇] 五十一.恶意样本分析及HGZ木马控制目标服务器
[网络安全自学篇] 五十二.Windows漏洞利用之栈溢出原理和栈保护GS机制
[网络安全自学篇] 五十三.Windows漏洞利用之Metasploit实现栈溢出攻击及反弹shell
[网络安全自学篇] 五十四.Windows漏洞利用之基于SEH异常处理机制的栈溢出攻击及shell提取
[网络安全自学篇] 五十五.Windows漏洞利用之构建ROP链绕过DEP并获取Shell
[网络安全自学篇] 五十六.i春秋老师分享小白渗透之路及Web渗透技术总结
[网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
[网络安全自学篇] 五十八.Windows漏洞利用之再看CVE-2019-0708及Metasploit反弹shell
[网络安全自学篇] 五十九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及shell深度提权
[网络安全自学篇] 六十.Cracer第八期——(2)五万字总结Linux基础知识和常用渗透命令
[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析及Signcode、PEView、010Editor、Asn1View等工具用法(二)
[网络安全自学篇] 六十二.PE文件逆向之PE文件解析、PE编辑工具使用和PE结构修改(三)
[网络安全自学篇] 六十三.hack the box渗透之OpenAdmin题目及蚁剑管理员提权(四)
[网络安全自学篇] 六十四.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)复现及详解
[网络安全自学篇] 六十五.Vulnhub靶机渗透之环境搭建及JIS-CTF入门和蚁剑提权示例(一)
[网络安全自学篇] 六十六.Vulnhub靶机渗透之DC-1提权和Drupal漏洞利用(二)
[网络安全自学篇] 六十七.WannaCry勒索病毒复现及分析(一)Python利用永恒之蓝及Win7勒索加密
[网络安全自学篇] 六十八.WannaCry勒索病毒复现及分析(二)MS17-010利用及病毒解析
[网络安全自学篇] 六十九.宏病毒之入门基础、防御措施、自发邮件及APT28样本分析
[网络安全自学篇] 七十.WannaCry勒索病毒复现及分析(三)蠕虫传播机制分析及IDA和OD逆向
[网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
[网络安全自学篇] 七十二.逆向分析之OllyDbg动态调试工具(一)基础入门及TraceMe案例分析
[网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制全网源码详细解读
[网络安全自学篇] 七十四.APT攻击检测溯源与常见APT组织的攻击案例
[网络安全自学篇] 七十五.Vulnhub靶机渗透之bulldog信息收集和nc反弹shell(三)
[网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点
[网络安全自学篇] 七十七.恶意代码与APT攻击中的武器(强推Seak老师)
[网络安全自学篇] 七十八.XSS跨站脚本攻击案例分享及总结(二)
[网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解
[网络安全自学篇] 八十.WHUCTF之WEB类解题思路WP(代码审计、文件包含、过滤绕过、SQL注入)
[网络安全自学篇] 八十一.WHUCTF之WEB类解题思路WP(文件上传漏洞、冰蝎蚁剑、反序列化phar)
[网络安全自学篇] 八十二.WHUCTF之隐写和逆向类解题思路WP(文字解密、图片解密、佛语解码、冰蝎流量分析、逆向分析)
[网络安全自学篇] 八十三.WHUCTF之CSS注入、越权、csrf-token窃取及XSS总结
[网络安全自学篇] 八十四.《Windows黑客编程技术详解》之VS环境配置、基础知识及DLL延迟加载详解
[网络安全自学篇] 八十五.《Windows黑客编程技术详解》之注入技术详解(全局钩子、远线程钩子、突破Session 0注入、APC注入)
前文欣赏:
[渗透&攻防] 一.从数据库原理学习网络攻防及防止SQL注入
[渗透&攻防] 二.SQL MAP工具从零解读数据库及基础用法
[渗透&攻防] 三.数据库之差异备份及Caidao利器
[渗透&攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包
一.FreeBuf主网站分析
FreeBuf是国内非常优秀的安全网站,它包括了各种安全相关的文章,强烈推荐读者去学习。接下来我们对该网站“APT”主题进行网页DOM树结构分析。
https://www.freebuf.com/
第一步,打开该网站的主页并搜索“APT”主题,查看其网站基本布局。
返回内容如下图所示,共搜到1736条结果。
第二步,分析该网站的翻页URL。
网络爬虫非常重要的一个步骤是分析翻页的URL变化情况,但该网站点击下一页URL始终不变。此时,有多种处理方法,常见的是:
- 审查网站的Network,查看发送请求的变化情况
- 通过Selenium模拟浏览器点击“下一页”操作,但速度较慢
第三步,通过浏览器审查元素(F12)获取Network内容,并发现有包含Page的URL。
当我们发现包含Page的URL时,就能够实现翻页操作。注意,某些网站的Page不会直接显示在URL中,需要发送POST请求来实现翻页,请大家结合具体情况进行分析。
我们输入该网址,可以发现对应的内容,第一条是“Whats APT:浅谈APT攻击”,基本和我们的第一页内容一致。
- https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=1
接着分析最后一页(174页)网址,发现其内容也基本一致,比如“SSCTF线上赛解题报告Part 3(解密和溢出)”。
- https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=174
二.Python抓取文章标题
第一步,分析Json格式数据。
接下来我们需要通过Python来抓取数据,看到前面的结果,我们发现其是Json格式的数据,我们可以通过Requests来进行解析。代码如下:
import requests, json
#抓取数据
page = 1
url = "https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=" + str(page)
r = requests.get(url)
print(r.text)
#解析Json
state = json.loads(r.text)
print(state)
for n in state:
print(n)
#获取对应的值
status = state.get('status')
data = state.get('data')
print(status)
print(data)
for n in data:
print(n)
主要调用requests发送请求,json解析数据。
- json.dumps把一个Python对象编码转换成json字符串
- json.loads把json格式字符串解码转换成Python对象
输出结果如下图所示,通过state.get(‘data’)获取了json节点“data”的子节点。那么,继续获取“list”子节点内容,是否就能获取所需的值呢?
此时代码如下:
import requests, json
#抓取数据
page = 1
url = "https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=" + str(page)
r = requests.get(url)
print(r.text)
#解析Json
state = json.loads(r.text)
print(state)
for n in state:
print(n)
#获取对应的值
status = state.get('status')
data = state.get('data')
print(status)
print(data)
for n in data:
print(n)
#获取内容
content = state.get('data').get('list')
for n in content:
print(n)
此时输出结果如下:
{
'url': 'https://www.freebuf.com/160412.html',
'imgUrl': 'https://image.3001.net/images/20180115/1516029123242.png!380.190',
'title': 'Whats <em>APT</em>:浅谈<em>APT</em>攻击',
'content': 'Whats <em>APT</em>:浅谈<em>APT</em>横看成岭侧成峰,远近高低各不同<em>APT</em>(Advanced Persistent Threat):高级持续威胁....',
'time': '2018-01-15',
'type': 2,
'name': 'LinuxSelf',
'userUrl': 'https://www.freebuf.com/author/LinuxSelf',
'moneyFlag': 1,
'coin': 0,
'identity': [3]
}
第二步,解析Json键值对并存储数据。
通过上述步骤我们成功提取了标题内容、标题URL、作者姓名、发布时间、作者、URL、类别、Logo等信息。接下来我们需要继续解析Json键值对,然后将数据存储至本地CSV文件中。
下面的代码能分别提取Key和Value值,通过循环获取。
import requests, json
#抓取数据
page = 1
url = "https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=" + str(page)
r = requests.get(url)
print(r.text)
#解析Json
state = json.loads(r.text)
print(state)
for n in state:
print(n)
#获取对应的值
status = state.get('status')
data = state.get('data')
print(status)
print(data)
for n in data:
print(n)
#获取内容
content = state.get('data').get('list')
for dic_json in content:
for key in dic_json:
#获取key
print("key:", key)
#获取value
text = str(dic_json[key])
#删除多余空格 换行 加粗字段<em>APT</em>
text = text.replace(' ','')
text = text.replace('\n','')
text = text.replace('<em>','')
text = text.replace('</em>','')
print("value:", text)
else:
print("") #换行
输出结果如下:
接着我们将获取的内容存储至CSV文件中,代码如下:
import csv
import requests, json
#抓取数据
page = 1
url = "https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=" + str(page)
r = requests.get(url)
print(r.text)
#解析Json
state = json.loads(r.text)
print(state)
for n in state:
print(n)
#获取对应的值
status = state.get('status')
data = state.get('data')
print(status)
print(data)
for n in data:
print(n)
#定义CSV文件
c = open("FreeBuf-APT.csv", "a+", newline = '',encoding = 'gb18030') #写文件
writer = csv.writer(c)
#url、imgUrl、title、content、time、type、name、userUrl、moneyFlag、coin、identity
writer.writerow(['序号','URL','imgRul','标题','内容简介','发布时间','类型','作者姓名','作者URL','MoeyFlag', 'coin', 'identity'])
#获取内容
content = state.get('data').get('list')
no = 1
for dic_json in content:
tlist = []
tlist.append(str(no))
for key in dic_json:
#获取key
print("key:", key)
#获取value
text = str(dic_json[key])
#删除多余空格 换行 加粗字段<em>APT</em>
text = text.replace(' ','')
text = text.replace('\n','')
text = text.replace('<em>','')
text = text.replace('</em>','')
print("value:", text)
#添加变量
tlist.append(text)
else:
print("") #换行
#写入文件
writer.writerow(tlist)
no = no + 1
print("next content\n")
#结束循环
c.close()
print("OVER!!!")
抓取的内容如下图所示,这是第1页的10条文章标题信息。
第三步,实现翻页获取所有APT标题及相关信息。
上面的代码仅抓取了第1页的内容,然后实际包括174页内容,接下来我们只需要增加一个循环,每次递增Page页码变量,然后爬虫代码重复执行即可。同时,建议注释掉多余的print输出,这样爬虫的效率更高。最终代码如下:
import csv
import requests, json
#----------------------------------------------定义CSV文件----------------------------------------------
c = open("FreeBuf-APT-all.csv", "a+", newline = '',encoding = 'gb18030') #写文件
writer = csv.writer(c)
#url、imgUrl、title、content、time、type、name、userUrl、moneyFlag、coin、identity
writer.writerow(['序号','URL','imgRul','标题','内容简介','发布时间','类型','作者姓名','作者URL','MoeyFlag', 'coin', 'identity'])
#-----------------------------------------------抓取数据----------------------------------------------
page = 1
while page<=174:
url = "https://search.freebuf.com/search/find/?year=0&articleType=0&time=0&tabType=1&content=APT&page=" + str(page)
r = requests.get(url)
print(url)
#解析Json
state = json.loads(r.text)
print(state)
#获取对应的值
status = state.get('status')
data = state.get('data')
#获取内容
content = state.get('data').get('list')
no = 1
for dic_json in content:
tlist = []
tlist.append(str(no))
for key in dic_json:
#获取key
#print("key:", key)
#获取value
text = str(dic_json[key])
#删除多余空格 换行 加粗字段<em>APT</em>
text = text.replace(' ','')
text = text.replace('\n','')
text = text.replace('<em>','')
text = text.replace('</em>','')
#print("value:", text)
#添加变量
tlist.append(text)
else:
print("") #换行
#写入文件
writer.writerow(tlist)
no = no + 1
print("next content\n")
#翻页
page = page + 1
#结束循环
c.close()
print("OVER!!!")
输出结果如下图所示,将1736篇文章的标题、URL、作者、简介等数据爬取下来,接下来我们可以针对其标题、简介进行大数据分析或文本挖掘。
三.正文内容抓取
写到这里文章并没有结束,因为在做威胁情报分析时,可能需要获取全文来进行系统的分析,比如APT组织名称、采用攻击方法、CVE漏洞、Hash值、所属地区等等,这又涉及到自然语言处理中实体识别、属性抽取、事件抽取等内容,这里不进行详解介绍。
第一步,分析网页源代码。
接着我们尝试打开某篇文章,通过浏览器审查元素获取其DOM树结构。
- https://www.freebuf.com/160412.html
- https://www.freebuf.com/articles/web/35898.html
具体分析如下:
- div class="title"为标题
- div class="author"为作者姓名
- div class="date"为发布日期
- div class="review"为阅读量
- div class="comment-num"为评论量
- div class="content-detail"为正文内容
第二步,Xpath技术基本普及。
这里使用xpath技术进行节点分析,你也可以采用BeautifulSoup或Selenium扩展包。使用xpath之前需要对网页进行 lxml 库中的 etreej解析 ,把它变为特有的树状形式,才能通过它进行节点定位。
from lxml import etree #导入解析库
html_etree = etree.HTML(reponse) #看成一个筛子,树状
当我们提取标签内的文本时,需要在复制到的xpath后面加上/text() ,告诉它说我需要提取的内容是一个标签呈现的数据,如“2014-06-05 09:30:02”。
<div data-v-f695e7d4 class="author-info">
<span data-v-f695e7d4="" class="date" style="margin: 0px 15px;">2014-06-05 09:30:02</span>
</div>
xpath建议写成如下所示,因为可能出现多个“date”类型,所以尽量从特殊标签处进行定位。
//*[@class="author-info"]/span[1]
此时提取文章的代码如下:
import csv
import requests, json
from lxml import etree
#请求数据
page = 1
url = "https://www.freebuf.com/160412.html"
reponse = requests.get(url).text
print(reponse)
#解析Json
html_etree = etree.HTML(reponse)
date = html_etree.xpath('//*[@class="author-info"]/span[1]/text()')
print("数组形式:",date)
print("字符形式:",date[0])
输出结果如下图所示:
注意,如我们想要获取URL怎么解决呢?由于每个链接都是在标签内的,通常放在src=" " 或者 href=" " 之中,如只需要使用“a”标签即可。
xpath为:
movie_url = html_etree.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/@href')
print ("数组形式:",movie_url)
print ("字符形式:",movie_url[0])
输出结果为:
数组形式: ['https://movie.douban.com/subject/1292052/']
字符形式: https://movie.douban.com/subject/1292052/
这里推荐学生杨有的文章:https://blog.csdn.net/ayouleyang/article/details/105412096
第三步,编写爬虫尝试抓取某一篇正文内容。
这里你可能会疑问为什么需要爬取阅读量和评论量呢?因为在进行数据分析时,它们可能就是特征,我们可以通过阅读量和评论量来获取热点文章和技术。
完整代码如下:
import csv
import requests, json
from lxml import etree
#请求数据
page = 1
url = "https://www.freebuf.com/160412.html"
reponse = requests.get(url).text
print(reponse)
#解析网页
html_etree = etree.HTML(reponse)
print(html_etree)
title = html_etree.xpath('//*[@class="title"]/span[1]/text()')[0] #网站标题
print(title.strip())
author = html_etree.xpath('//*[@class="author"]/text()') #作者
print(author)
date = html_etree.xpath('//span[@class="date"]/text()') #发布时间
print(date)
review = html_etree.xpath('//span[@class="review"]/text()') #阅读量
print(review)
comment = html_etree.xpath('//span[@class="comment-num"]/text()') #评论量
print(review)
content = html_etree.xpath('//*[@class="content-detail"]/text()') #正文内容
print(content)
输出结果如下图所示:
注意,上述代码部分结果总是爬取为空值,而且找不到解决办法。最终换成了另一种方法实现。o(╥﹏╥)o 编程有时候需要掌握多种方法,针对不同的问题提出解决方案,推荐作者三年前的爬虫专栏,近40篇文章。
- https://blog.csdn.net/eastmount/category_9264385.html
Selenium完整代码如下,该方法会模拟打开浏览器进行定位和爬取,广泛应用于需要自动登录和测试的网站,缺点是效率较低。
# coding=utf-8
import os
import csv
import time
import codecs
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
#访问网址
url = "https://www.freebuf.com/160412.html"
print(url)
driver.get(url)
time.sleep(2)
#网站标题
title = driver.find_element_by_xpath('//div[@class="title"]/span')
print(title.text)
#作者
author = driver.find_element_by_xpath('//div[@class="author-info"]/a[1]')
print(author.text)
#发布时间
date = driver.find_element_by_xpath('//div[@class="author-info"]/span[1]')
print(date.text)
#阅读量
review = driver.find_element_by_xpath('//div[@class="author-info"]/span[2]')
print(review.text)
#评论量
comment = driver.find_element_by_xpath('//div[@class="author-info"]/span[3]')
print(comment.text)
#正文内容
content = driver.find_elements_by_xpath('//div[@class="content-detail"]/div[1]/p')
result = ""
for n in content:
print(n.text)
result = result + str(n.text)
#定义CSV文件
c = open("FreeBuf-APT-detail.csv", "a+", newline = '',encoding = 'gb18030') #写文件
writer = csv.writer(c)
writer.writerow(['序号','标题','作者','发布时间','阅读量','评论量','正文内容'])
#获取内容
no = 1
tlist = []
tlist.append(str(no))
tlist.append(title.text)
tlist.append(author.text)
tlist.append(date.text)
tlist.append(review.text)
tlist.append(comment.text)
tlist.append(result)
#写入文件
writer.writerow(tlist)
#结束循环
c.close()
print("OVER!!!")
输出结果如下图所示:
四.正文爬取完整代码
最后补充正文爬取的完整代码,大概步骤如下:
- 首先,从前面爬取标题CSV文件中依次读取URL;
- 其次,分别爬取每个URL对应的正文内容并存储至详情CSV文件;
- 再次,对部分数据进行处理,比如某些文章没有评论此时需要判断该节点是否存在再抓取数据;
- 最后,循环获取所有1736篇正文内容。
完整代码如下:
# coding=utf-8
import os
import csv
import time
import codecs
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#文件读取
url_list = []
with open("FreeBuf-APT-all.csv", "r", encoding = 'gb18030') as f:
#使用DictReader创建的reader是一个迭代器,遍历迭代器返回的数据是一个字典(有序字典)
#返回的结果不包含行首的标题
reader=csv.DictReader(f)
for row in reader:
url = row["URL"]
url_list.append(url)
#print("URL:", url)
#设置驱动
chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)
#定义CSV文件
c = open("FreeBuf-APT-detail.csv", "a+", newline = '',encoding = 'gb18030') #写文件
writer = csv.writer(c)
writer.writerow(['序号','标题','作者','作者URL','发布时间','阅读量','评论量','正文内容'])
#访问网址
page = 0
while page<len(url_list):
print("页码:", page)
url = url_list[page]
print(url)
driver.get(url)
time.sleep(2)
#网站标题
title = driver.find_element_by_xpath('//div[@class="title"]/span')
print(title.text)
#作者
author = driver.find_element_by_xpath('//div[@class="author-info"]/a[1]')
author_url = author.get_attribute('href')
print(author.text)
print(author_url)
#发布时间
date = driver.find_element_by_xpath('//div[@class="author-info"]/span[1]')
print(date.text)
#阅读量
review = driver.find_element_by_xpath('//div[@class="author-info"]/span[2]')
print(review.text)
#评论量 判断其是否存在
comment = driver.find_elements_by_xpath('//div[@class="author-info"]/span[3]')
#print(comment)
if comment:
com = comment[0].text
print(com)
else:
com = 0
print(com)
#正文内容
content = driver.find_elements_by_xpath('//div[@class="content-detail"]/div[1]/p')
result = ""
for n in content:
#print(n.text)
result = result + str(n.text)
#获取内容
tlist = []
tlist.append(str(page+1))
tlist.append(title.text)
tlist.append(author.text)
tlist.append(author_url)
tlist.append(date.text)
tlist.append(review.text)
tlist.append(com)
tlist.append(result)
#写入文件
writer.writerow(tlist)
page = page + 1
#结束循环
c.close()
print("OVER!!!")
输出结果如下图所示,它会自动控制Chrome浏览器进行数据爬取。
五.总结
写到这里,这篇文章就介绍完毕,希望对您有所帮助,后面一篇文章会介绍具体的威胁情报数据分析。学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。
《珈国情》
明月千里两相思,
清风缕缕寄离愁。
燕归珞珈花已谢,
情满景逸映深秋。
最感恩的永远是家人的支持,知道为啥而来,知道要做啥,知道努力才能回去。
夜已深,虽然笨,但还得奋斗。
欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。
(By:Eastmount 2020-07-15 下午4点写于武汉 http://blog.csdn.net/eastmount/ )