网站源代码下载器的设计与实现
> **摘要:**随着时代的进步以及科技的发展,人们越来越多的需要高效地从互联网上获取所需的信息,然而其对网络的要求和一些站点人为的限制,却也制约了用户对网络信息的获取和保存。对此,针对于一项可以实现将网站数据便捷获取并长期保存的网站源代码下载器进行了学习研究设计开发,主要应用了爬虫技术通过伪装成客户端与服务器进行数据交互,实现数据采集。可视化网站源代码下载器将实现对用户输入站点的下载实现长期保存,便于用户访问。
关键词: 计算机网络
网络爬虫
WxPython正则表达式
requests
1.HTTP协议
HTTP 报文是在应用程序之间发送的数据块,这些数据块将通过以文本形式的元信息开头,用于 HTTP 协议交互。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。 HTTP 报文本身是由多行(用 CR LF 作换行符)数据构成的字符串文本。
网络爬虫就是自动从互联网中定向或者不定项的采集信息的一种程序。网络爬虫通过伪装成客户端与服务器进行数据交互的,从而实现数据采集,搜索引擎,模拟操作等功能(图2.1 网络爬虫知识图谱)。网络爬虫大致可分为三大模块即,发送请求获取数据,解析数据与获取数据。
爬虫的第一个步骤是获取数据,就是对起始 URL 发送请求,以获取其返回的响应,值得注意的是,发送请求实质上是指发送请求报文的过程。其报文头部的内容广泛使用于反爬虫策略与抗反爬虫策略。
数据下载是数据爬取过程中的重要环节。执行数据下载之前首先需要对数据爬取对象网站进行全面地了解,包括此网站数据展示介质、网站背景、网站的组织结构及今后的发展等,在对爬取对象可能出现的展示形式(Web、PC 端应用、APP)进行分析后,才能确定要爬取的具体展现形式[5]
一个完整的爬虫应用不光涉及网络技术,在获取并下载数据后,还需要对数据进行分析,提取需要的信息,并对数据进行可视化分析和展示。
requests库是基于urllib
库,采用Apache2 Licensed
开源协议编写的,基于其内置的urllib3,其允许程序发送HTTP/1.1请求,且不需要手动的为URL添加查询字串,也不需要对POST数据进行表单编码,可以轻易的向对应的网站发起请求,从而对网页数据进行获取,还可以获取服务器返回的响应内容和状态码。
2.2 正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。正则表达式一般用于脚本编程与文本编辑器中,在本程序中通过python re库正则表达式匹配方法,实现对正确输入文本的匹配及对部分内容的批量替换。
2.3 WxPython
WxPython是一个开发桌面端图形界面的跨平台函数库,开发语言为Python,它是基于C 的函数库wxWidgets的封装的跨平台GUI工具。
2.4 Beautiful Soup
Beautiful Soup就是Python的一个HTML或XML的解析库,提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能,主要用于将HTML标签转换为Python对象树,并通过解析文档为用户提供需要抓取的数据。
2.5 抗反爬虫策略
随着反爬虫程序被研发利用来,越多的网站都有自己的反爬机制,抓取数据已经不像以前那么容易。
目前,大部分网站都希望正常的用户进行访问,不希望爬虫轻易抓取他们的网站。究其原因,爬虫一方面会给他们的网站带来无用的性能压力,另一方面爬虫会造成他们网站的数据被“盗取”,于是,这些网站开始制定相应的反爬虫策略。一般的反爬策略例如:设置单个IP在单位时间内不能请求次数超过阈值或者请求的频率高于他们认为的人为行为频率、请求参数中带有他们加密后的字段值等。
要解决网站反爬的问题,首先要知道自己被封的原因和对方的“封堵机制”,这样才能更有效地使用上面的措施解决问题。针对单个IP单位时间内不能请求超过阈值情况,我们需要更改自己的抗反爬策略,一般情况下可以使用User-Agent池、降低下载频率、使用代理IP池等方式解决 ;针对数据加密的情况,可以通过反编译进行解决。
2.6 关于网络爬虫的法律问题
遵守Robots协议,此协议声明那些内容不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。
不能造成对方服务器瘫痪,2021年颁布实施的《数据安全管理办法》规定网络运营者采取自动化手段访问收集网站数据,不得妨碍网站正常运行[5]
不能非法获利,不能涉及个人隐私采集的信息,属于公民个人信息的,有可能构成非法获取公民个人信息的违法行为,情节严重的,有可能构成“侵犯公民个人信息罪”因此爬虫开发者的道德和良知才是避免触碰法律底线的根本所在。
3. 设计方法及思路
3.1 问题分析
网站源代码下载器这一程序设计的关键在于如何使用户更加便利的保存网络站点上的信息,实现在无互联网的情况下的长期保存。程序将在完成,发送请求获取数据,解析数据与获取数据这三大基本功能的前提下,实现将网页原始数据的加工处理。
3.2 设计思路
基于网络爬虫下实现网站源代码下载器的设计开发,在针对大量网站进行研究后,总结部分结论,不同类型站点网页设计人员对项目设计的方式差异性明显,部分站点可能因为开发时间和后期的修改,呈现出十分混乱的特点,这些都增加了网站源代码下载器的设计难度。针对以上特点,对网站源代码下载器的功能进行设计,利用正则匹配等方式尽可能保留站点原始样貌。
对于程序设计采用python语言,建立两大模块,即可视化客户端与网络爬虫程序,本项目的网络爬虫程序接近于聚焦网络爬虫,聚焦到特定主题目标网站进行爬取,包含页面爬取模块、无关链接过滤等功能。再对爬取到的信息进行提取和分析,最终能够运行实现网站源码下载器的开发。
4. 具体代码设计及运行
设置一个class类Frame,使用WxPython库的方法实现可视化程序的实现并提供后台接口(如图3.1 网络源代码下载器),通过输入事件监听与正则表达式对用户输入数据进行分析。在输入内容符合要求时通过后台网络爬虫,之后进行数据采集。实现网站源代码下载器的应用。(如图3.2 网站源码下载反馈)
代码语言:javascript复制def an1_anbdj(self, event):
if (self.url ==""):
toastone = wx.MessageDialog(None, "网站地址不能为空!", "错误信息提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if toastone.ShowModal() == wx.ID_YES:
# 如果点击了提示框的确定按钮
toastone.Destroy()
# 则关闭提示框
else:
match=re.search('(https?|ftp|file)://[-A-Za-z0-9 &@#/%?=~_|!:,.;] [-A-Za-z0-9 &@#/%=~_|]', self.url)
if match:
download_img()
代码语言:javascript复制host = re.search(u'[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62}) .?', self.url)
Host = 'https://' host.group(0)
a = requests.get(self.url, verify=False)
a.encoding = "utf-8"
bsobj = BeautifulSoup(a.content, 'lxml')
# 将网页源码构造成BeautifulSoup对象,方便操作
a_list = bsobj.find_all('a') # 获取网页中的所有a标签对象
script_list = bsobj.find_all('script')# 获取网页中所有的script标签
link_list = bsobj.find_all('link')# 获取网页中所有的link标签
img_list = bsobj.find_all('img')
对获取到的数据在运行空间暂存,程序对其进行分析,生成标准URL,再次转入数据获取函数,在数据获取完成后,对文件进行格式化保存,将通过数据解析的数据,以其在服务器的相对位置进行存储。
代码语言:javascript复制def save_file(chdir_path, filename, content):
if filename[-4:] in ['.jpg', '.png', 'webp','.png','jpeg', '.gif', '.bmp']:
with open(chdir_path '/' 'images/' filename , "wb ") as f:
f.write(content)
elif filename[-2:] == 'js':
with open(chdir_path '/' 'js/' filename, 'w ') as f:
f.write(content)
elif filename[-3:] == 'css':
with open(chdir_path '/' 'css/' filename, 'w ') as f:
f.write(content)
else:
with open(chdir_path '/' filename, 'w ',encoding='utf-8') as f:
f.write(content)
为便于用户后期的直接长期阅读,程序后台还通过re模块通过正则匹配将原程序Html文件及CSS中超链接路径匹配为相应的相对路径。
5.总结
本文使用Python程序设计软件设计开发了简单的源代码下载器,利用WxPython的有关知识,建立了可视化端口,为爬虫程序提供可用接口,基于网络爬虫的原理下,成功的设计出了程序,实现了网站源码下载器的开发。并且在正则表达式的支持下,将网页原始路径转化为相对路径,不会出现因防盗链和文件路径的不准确或者丢失的情况出现。实现了在没有互联网的情况之下数据的长期保存。
参考文献:
[1] 朱荣.《python与大数据分析应用》.清华大学出版社.2021.3.P101-P107 [2] 谢希仁.《计算机网络》.电子工业出版社.2013.6.P35-P37、P115-P124、P238-P241 [3] 吴海燕,佟秋利《我国网络安全法律法规体系框架》.中国教育网络.2021.08 P66-P67 [4] 2021 Bad Bot Report [EB/OL]. https://www.imperva.com/resources/reports/Bad-Bot-Report 2021 [5] 孟宝灿,《Python网络爬虫应用探讨》广播电视信息 2022.03 P108-P110