网页结构分析:
分析页面的跳转URL连接和各篇文章对应的URL连接在HTML文件中所处的结构,以便运用正则表达式将其从HTML文件中解析出来。Paper上漏洞分析报告网页URL连接。
每个页面中含有5篇报告文章,数量不大,在代码实现时可以将其信息用列表暂时储存。
通过这些内容可以运用正则表达式将文章链接、文章名称等信息提取出来。存放在一组列表之中,并且各篇文章的信息有组合成元组,分别排列在列表之中。如下代码:
```
def get_essay_info(url):
r = requests.get(url)
r.encoding = r.apparent_encoding
reg = r'<h5 class="post-title"><a href="(.*?)">(.*?)</a></h5>'
info_list = re.findall(reg,r.text)
return info_list
```
运用正则表达式将href属性提取出来,在经过一定的拼接,形成下一页的完整URL连接。
正则语句:
reg = r'(?<=href=")(.*?)(?=">Older Posts)'
# 提取的部分是(.*?)对应的内容,在此处对正则语句不加以说明。
可以发现,与下一页跳转按钮对应的信息不存在了,所以之前的正则匹配就匹配不到任何内容,返回的是一个空的列表。我们可以运用这个空列表做是否结束爬取的判断,这样就能够实现爬虫自动结束爬取。
代码思维分析:
先上代码:
代码开头部分,在本代码中,只运用了requests库和re库
1、re库导入有关正则表达式的方法,提取有效信息
2、requests库提供向服务器发送请求和接受返回请求的方法
```
#-*- coding: UTF-8 -*-
import requests
import re
```
获取文章相关信息
```
def get_essay_info(url):
r = requests.get(url)
r.encoding = r.apparent_encoding
reg = r'<h5 class="post-title"><a href="(.*?)">(.*?)</a></h5>'
info_list = re.findall(reg,r.text)
return info_list
```
获取下一页UR了,以便于实现爬虫自动跳转页面继续爬取
其中的 if 判断语句,返回不同的内容。在正则表达式能够匹配到的情况下,返回匹配的URL,在未能匹配到的情况下,返回一个固定的字符串"null"。利用两种不同的返回结果使得后续代码执行时可以判断是否继续爬取。
```
def get_page_url(url):
r = requests.get(url)
r.encoding = r.apparent_encoding
reg = r'(?<=href=")(.*?)(?=">Older Posts)'
print re.findall(reg,r.text)[0]
if re.findall(reg,r.text)==[]:
return 'null'
else:
next_page_url = "https://paper.seebug.org/category/vul-analysis/"+ re.findall(reg,r.text)[0]
return next_page_url
```
对爬取的内容制表
方便以后查找有关CVE漏洞编号对应的文章
将数据存放在"xxx.csv"文件中,存放在其中的数据运用逗号(英文)隔开,该文件用excel软件打开后,就能按照对应的格式对数据制表。(相关示例操作在文章末尾给出)
```
def CVE_sort(essay_name,essay_url):
essay_name = essay_name.encode('utf-8')
essay_url = essay_url.encode('utf-8')
reg = r'(CVE-\d\d\d\d-\d\d\d\d\d?)'
CVE = re.findall(reg,essay_name)
if (CVE != []):
with open('./TestPaper/1CVE_sort.csv','a') as fn: # 其中'a'表示不刷新文件原有内容
for cve in CVE:
fn.write(cve)
fn.write(','+essay_name+','+essay_url+'\n')
else:
with open('./TestPaper/1CVE_sort.csv','a') as fn:
fn.write(','+essay_name+','+essay_url+'\n')
print essay_url
```
执行函数
调用前面所定义好的函数,实现网页的爬取。
```
def main():
flag = True
start_url = "https://paper.seebug.org/category/vul-analysis/"
while(flag):
print start_url
if start_url=='null':
print 'NO maore Page!'
flag = False #通过flag标记实现对爬虫进行的控制
else:
essay_info_list = get_essay_info(start_url)
for essay_info in essay_info_list:
#此处essay_info是包含了文章URL和名称的元组
essay_name = essay_info[1]
#Windows系统下创建文件对特定的一些字符有限制,故下面语句将该类字符替换掉
essay_name = essay_name.replace('/', ' ').replace('\\', ' ').replace(':', ' ').replace('*', ' ').replace('?',' ').replace('"', ' ').replace('<', ' ').replace('>', ' ').replace('|', ' ')
essay_url = 'https://paper.seebug.org'+essay_info[0]
CVE_sort(essay_name,essay_url)
with open('./TestPaper/'+essay_name+'.url','w') as fn:
fn.write('[InternetShortcut]\nURL='+essay_url)
print essay_name
start_url = get_page_url(start_url)
```
python脚本运行的起始点
```
with open('./TestPaper/1CVE_sort.csv','a') as fn:
fn.write('CVE编号,文章名称,文章链接'+'\n')
main()
```
说明:
1、此次爬虫,并没有进入每篇文章对其内容的爬取,而只是将每篇文章的URL连接提取出来制成网页的快捷方式。
2、有些网页用正则匹配下来的URL可能只是实际URL的一部分,所以在网页分析时,需要明确那些爬取下来的“残缺URL”缺少的部分是什么,在后续代码中运用字符串连接的方式恢复完整得到URL链接。示例图如下:
对比图如下
制作"xxx.csv"文件的方法:
首先打开excel软件,新建一个空白的表,将其另存时按如下操作:
得到一个文件,先用记事本形式打开,写入如下信息(注:一定要用英文逗号分隔):
保存后,双击打开(或用excel打开),如下图: