社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

[网络安全自学篇] 八十六.威胁情报分析之Python抓取FreeBuf网站APT文章(上)

Eastmount • 4 年前 • 723 次点击  

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了4种常见的注入技术,包括全局钩子、远线程钩子、突破SESSION 0隔离的远线程注入、APC注入。这篇文章主要讲解威胁情报分析,通过Python抓取FreeBuf网站“APT”主题的相关文章,后续会进一步采用数据挖掘、机器学习、知识图谱等方法进行深入分析。基础性文章,希望对您有所帮助~

作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~


作者的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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

主要调用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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

此时输出结果如下:

{
 '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]
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述


第二步,解析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("") #换行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

输出结果如下:

在这里插入图片描述

接着我们将获取的内容存储至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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

抓取的内容如下图所示,这是第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!!!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

输出结果如下图所示,将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)     #看成一个筛子,树状
  • 1
  • 2

当我们提取标签内的文本时,需要在复制到的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>
  • 1
  • 2
  • 3

xpath建议写成如下所示,因为可能出现多个“date”类型,所以尽量从特殊标签处进行定位。

//*[@class="author-info"]/span[1]
  • 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])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出结果如下图所示:

在这里插入图片描述

注意,如我们想要获取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])
  • 1
  • 2
  • 3

输出结果为:

数组形式: ['https://movie.douban.com/subject/1292052/']
字符形式: https://movie.douban.com/subject/1292052/
  • 1
  • 2

这里推荐学生杨有的文章: 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

输出结果如下图所示:

在这里插入图片描述

注意,上述代码部分结果总是爬取为空值,而且找不到解决办法。最终换成了另一种方法实现。o(╥﹏╥)o 编程有时候需要掌握多种方法,针对不同的问题提出解决方案,推荐作者三年前的爬虫专栏,近40篇文章。

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!!!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

输出结果如下图所示:

在这里插入图片描述

在这里插入图片描述



四.正文爬取完整代码

最后补充正文爬取的完整代码,大概步骤如下:

  • 首先,从前面爬取标题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!!!")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88

输出结果如下图所示,它会自动控制Chrome浏览器进行数据爬取。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述



五.总结

写到这里,这篇文章就介绍完毕,希望对您有所帮助,后面一篇文章会介绍具体的威胁情报数据分析。学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢师傅、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。


《珈国情》
明月千里两相思,
清风缕缕寄离愁。
燕归珞珈花已谢,
情满景逸映深秋。
最感恩的永远是家人的支持,知道为啥而来,知道要做啥,知道努力才能回去。
夜已深,虽然笨,但还得奋斗。

在这里插入图片描述

欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。

(By:Eastmount 2020-07-15 下午4点写于武汉 http://blog.csdn.net/eastmount/ )

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/71378
 
723 次点击