Web 代理、爬行器和爬虫
(一)Web 在线网页代理服务器的使用方法
1. 什么是 Web 在线网页代理服务器
Web 在线网页代理服务器就像是网络穿越仪一般,它是一种具有转发功能的应用程序,能够帮助用户在特定网络环境下访问被封锁的网页。用户在某些网络环境中可能无法直接访问特定的网页资源,而通过 Web 在线网页代理服务器,用户的请求可以被转发到目标网站,然后将目标网站的响应返回给用户,从而实现对被封锁网页的访问。
2. 使用流程详解
使用 Web 在线网页代理服务器的具体步骤如下:
首先,寻找可靠的代理服务器网站或服务提供商。用户可以通过网络搜索等方式找到一些信誉良好的代理服务器站点,比如一些知名的在线代理服务平台。
接着,打开代理网站,在网站的主页上通常会有一个输入框,提示用户输入要访问的网址。
然后,在输入框中输入要访问的被封锁的网址,并点击网站上的 “GO” 按钮或类似的开始按钮来提交请求。
此时,代理网站会接收到用户的请求,并将请求内容封装到 HTTP 包中。随后,代理网站会建立与目标网站的 TCP 连接,并发送封装好的 HTTP 包。
目标网站收到代理网站发送的请求后,解包并处理请求内容。处理完成后,目标网站将请求的资源封装到 HTTP 包中,然后发送回代理网站。
代理网站收到目标网站返回的 HTTP 包,解包并提取出资源。接着,代理网站将请求的资源封装到 HTTP 包中,并将该 HTTP 包发送回给用户的用户代理(如浏览器)。
最后,用户的用户代理收到代理网站返回的 HTTP 包后,解包并显示出请求的网页或资源。
3. 注意事项
使用 Web 在线网页代理服务器时,用户需要注意保护个人信息和隐私。虽然代理服务器可以帮助用户访问被封锁的网页,但它并不能保证网络安全。在使用代理服务器的过程中,用户的请求和响应都要经过代理服务器,这就增加了信息被泄露的风险。因此,用户在使用代理服务器时,应避免在通过代理访问的网页上输入敏感信息,如个人身份证号、银行卡密码等。
(二)Web 请求和响应中的代理方式
1. Web 开发中的请求方法
在 Web 开发中,主要的请求方法有 GET 请求、POST 请求和 HEAD 请求。
GET 请求用于从服务器请求数据,不改变服务器的状态。通常用于获取静态资源、HTML 文件或读取数据,比如从 API 获取列表或单条数据。其特点是请求参数通过 URL 传递,对传递的数据有长度限制,并且是幂等的,无论请求多少次,服务器的状态不会发生变化。同时,GET 请求不应用于提交敏感信息,因为参数信息会显示在地址栏的 URL 中,不安全。
POST 请求用于向服务器发送数据,通常用于提交表单、上传文件、或创建新的资源。发送的数据通常会影响服务器的状态,比如在数据库中创建记录。POST 请求的特点是请求体中包含数据,传递的内容没有长度限制。它不是幂等的,每次请求都会对服务器的状态产生影响。通常用于提交敏感信息,因为数据不会暴露在 URL 中。
HEAD 请求与 GET 请求类似,但是它只返回 HTTP 头部信息,不返回实际的内容主体。HEAD 请求通常用于检查资源是否存在、获取资源的元数据等。
2. 借助代理进行文件下载的示例
以文件下载为例,展示如何使用 NSURLRequest、NSURLConnection 等对象通过代理方式处理服务器响应。首先,需要设置代理服务器的地址和端口信息。然后,创建一个 NSURLRequest 对象,并将其配置为使用代理服务器。接着,使用 NSURLConnection 发送请求,并在连接的委托方法中处理服务器的响应。
以下是一个简单的代码示例:
// 设置代理服务器地址和端口
let proxyHost = "proxy.example.com"
let proxyPort = 8080
// 创建 URL
let url = URL(string: "http://download.example.com/file.zip")!
// 创建请求对象
var request = URLRequest(url: url)
// 设置代理
let proxyURL = URL(string: "http://(proxyHost):(proxyPort)")
let configuration = URLSessionConfiguration.default
configuration.connectionProxyDictionary = [kCFProxyHostNameKey as String: proxyHost, kCFProxyPortNumberKey as String: proxyPort]
let session = URLSession(configuration: configuration)
// 发送请求并处理响应
let task = session.dataTask(with: request) { (data, response, error) in
if let error = error {
print("Error: (error.localizedDescription)")
} else if let data = data {
// 处理下载的文件数据
// 将数据保存到本地文件等操作
}
}
task.resume()
在使用代理进行文件下载时,需要注意以下几点:
首先,确保代理服务器的稳定性和可靠性。如果代理服务器不稳定,可能会导致下载中断或速度缓慢。
其次,注意代理服务器的安全性。一些不可信的代理服务器可能会窃取用户的下载内容或个人信息。
最后,根据实际情况选择合适的代理方式。不同的代理服务器可能支持不同的协议和功能,需要根据具体的需求进行选择。
(三)web 服务器请求代理方式
1. 代理、网关和隧道的概念
代理、网关和隧道在通信中都起着重要的作用,但它们的功能和作用有所不同。
代理作为中间人转发请求和响应。代理服务器位于客户端和服务器之间,接收客户端的请求并转发给服务器,同时接收服务器的响应并返回给客户端。代理服务器可以用于缓存资源、过滤请求、隐藏客户端的真实 IP 地址等。
网关将 HTTP 请求转化为其他协议通信并提高安全性。网关可以将 HTTP 请求转换为其他协议,如 FTP、SMTP 等,以便与不同类型的服务器进行通信。网关还可以提供安全功能,如身份验证、加密等。
隧道用于中转客户端和服务器的通信并确保安全。隧道建立起一条与服务器的通信线路,使用 SSL 加密技术进行通信,确保客户端和服务器端安全通信。隧道通常用于在不安全的网络环境中建立安全的通信通道。
2. 参考文献说明
参考书籍《图解 HTTP》对理解相关内容有很大的帮助。这本书对互联网基盘 ——HTTP 协议进行了全面系统的介绍,包括代理、网关和隧道的概念和作用。通过阅读这本书,读者可以更深入地了解 Web 通信中的各种技术和概念,提高对 Web 开发和网络通信的理解。
二、爬虫的工作原理及案例
(一)网络爬虫概述
1. 定义和作用
网络爬虫是自动抓取互联网信息的程序或脚本。它们被广泛用于搜索引擎、数据挖掘等领域,能够从公开网页抓取数据,为不同领域如金融分析、市场趋势预测等提供数据支持。在一定程度上代替了手工访问网页,实现自动化采集互联网的数据,从而更高效地利用互联网中的有效信息。
2. 历史沿革
网络爬虫技术起源于 1990 年代初的搜索引擎。1990 年,Archie 搜索引擎的出现标志着网络爬虫研究的开始。1993 年麻省理工学院的马修格雷开发了名为 World wide Web Wanderer 的爬虫系统,该系统能够统计互联网中服务器的数量,为后续爬虫系统的开发提供了重要设计思想。
到了 1994 年,出现了机器人、蜘蛛、爬虫等网络自动跟踪索引程序。同年,美国华盛顿大学的师生开发了一种在网络上查询信息的工具,被认为是现代网络爬虫的雏形。它是首个能对 Web 页面进行全文搜索的搜索引擎,使用了广度优先的策略来遍历网页。同年,斯坦福大学的杨致远和大卫费罗共同创办了 Yahoo 公司,其搜索引擎后来成为极具影响力的分类目录式搜索引擎。随后,Lycos、Infoseek、Metacrawler 和 HotBot 等搜索引擎相继推出。
1995 年春,美国数字设备公司的三位科学家开发了 Altavista 搜索引擎,于同年 12 月开始提供信息检索服务,这是首次采用爬虫技术进行网页索引的实例之一。
1997 年,分布式网络爬虫技术的出现进一步推动了搜索引擎技术的发展。同年年底,斯坦福大学的拉里佩奇、谢尔盖布林、斯科特哈桑和阿伦斯特博格共同开发了 Google 搜索引擎,开启了以搜索引擎为主导的互联网新时代。1998 年由谢尔盖布林和拉里佩奇共同开发的 PageRank 算法大大改进了搜索引擎的效果,后来成为了谷歌爬虫的著名算法。
2002 年,开源的网络搜索引擎 Apache Nutch 发布,通过开放源代码的方式推动了网络爬虫技术的发展,促进了学术界和工业界对网络爬虫的研究和应用。
随着技术的发展,网络爬虫经历了从单一处理方式到分布式并行处理的显著演变。起初,爬虫技术仅限于捕获静态网页信息,但后来发展到能够处理动态和实时加载的页面内容。数据爬取的范围和精确性也得到了提升,从一般性的爬取转向更加专注和精准的目标数据爬取。
(二)爬虫工作原理
1. 基本步骤
(1)确定爬取目标:明确需要抓取的网页或数据范围。
(2)发送请求:向目标网页发送 HTTP 请求,获取网页内容。
(3)获取响应:接收服务器返回的响应,包括网页的 HTML 代码等。
(4)解析数据:使用特定的解析工具或库,从网页源代码中提取所需的数据。
(5)存储数据:将提取到的数据保存到本地文件或数据库中,以便后续分析和使用。
2. 实现方式
爬虫可以用多种编程语言实现,其中 Python 是常用的编程语言之一。Python 爬虫常用的库有 requests、BeautifulSoup、Scrapy、Selenium 和 PyQuery 等。
requests 是基于 urllib 编写的阻塞式 HTTP 请求库,发出一个请求,一直等待服务器响应后,程序才能进行下一步处理。
BeautifulSoup 是 HTML 和 XML 的解析库,从网页中提取信息,同时拥有强大的 API 和多样解析方式。
Scrapy 是一个强大的爬虫框架,可以满足简单的页面爬取,也可以用于复杂的爬虫项目。
Selenium 是自动化测试工具,可以模拟用户操作浏览器,适用于处理 JavaScript 渲染的页面。
PyQuery 是 jQuery 的 Python 实现,能够以 jQuery 的语法来操作解析 HTML 文档,易用性和解析速度都很好。
3. 注意事项
(1)合法合规爬取:在爬取数据时,要遵守法律法规和网站的使用条款。不得爬取受版权保护的内容或未经授权的数据。
(2)应对反爬机制:许多网站会采取反爬措施,如验证码、IP 封锁等。爬虫开发者需要不断更新技术,以绕过这些障碍。
(3)注意数据抓取方式:避免对目标网站造成过大的负担,不要在短时间内发送大量请求,以免影响网站的正常运行。
(三)Python 爬虫示例
1. 示例功能介绍
以从豆瓣电影中抓取电影名称和评分为例,该示例的功能是获取豆瓣电影的部分信息,包括电影名称、导演、时间和评分等。通过这个示例,可以了解 Python 爬虫的基本实现过程和方法。
2. 代码解读
以下是从豆瓣电影中抓取电影名称和评分的 Python 代码解读:
import requests
import xlwt
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
director_list = []
time_list = []
star_list = []
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
res = requests.get(link, headers=headers, timeout=10)
soup = BeautifulSoup(res.text, "lxml")
div_list = soup.find_all('div', class_='hd')
div1_list = soup.find_all('div', class_='bd')
div2_list = soup.find_all('div', class_='star')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
for each in div1_list:
info = each.p.text.strip()
if len(info) < 3:
continue
time_start = info.find('20')
if time_start < 0:
time_start = info.find('19')
end = info.find('...')
time = info[end + 32:end + 36]
time_list.append(time)
end = info.find('主')
director = info[4:end - 3]
director_list.append(director)
for each in div2_list:
info = each.text.strip()
star = info[0:3]
star_list.append(star)
file = xlwt.Workbook()
table = file.add_sheet('sheet name')
table.write(0, 0, "排名")
table.write(0, 1, "电影")
table.write(0, 2, "时间")
table.write(0, 3, "导演")
table.write(0, 4, "评分")
for i in range(len(star_list)):
table.write(i + 1, 0, i + 1)
table.write(i + 1, 1, movie_list[i])
table.write(i + 1, 2, time_list[i])
table.write(i + 1, 3, director_list[i])
table.write(i + 1, 4, star_list[i])
file.save('data.xls')
首先,设置请求头headers,包含user-agent和Host信息,模拟浏览器访问。然后,通过循环遍历豆瓣电影 top250 的页面,每次获取 25 部电影的信息。
使用requests.get()方法发送 HTTP 请求,获取网页内容。通过BeautifulSoup解析网页,分别找到电影名称、时间、导演和评分所在的元素。
对于电影名称,从div元素的class="hd"中提取a标签下span标签的文本内容,并去除空格。
对于时间和导演,从div元素的class="bd"中提取p标签的文本内容,通过字符串处理找到时间和导演信息。
对于评分,从div元素的class="star"中提取文本内容的前三个字符作为评分。
最后,将数据保存到 Excel 表格中,使用xlwt库的table.write()方法填写表格内容,并保存文件。
三、Web 爬行器的作用及案例
(一)使用 Python 的 Web 爬行器
1. 功能介绍
Python 开发 Web 爬行器具有诸多优势。首先,Python 语言简洁易读,使得代码易于理解和维护。其次,它拥有强大的库和框架,如 BeautifulSoup、Scrapy 等,为开发人员提供了丰富的工具和功能。Web 爬行器能够自动抓取和提取信息,实现自动化数据采集和处理,大大提高了工作效率。
2. 分类和优势
Web 爬行器主要分为通用爬行器、垂直爬行器和增量爬行器。通用爬行器可以爬取任意网站的数据,具有广泛的适用性。垂直爬行器专注于特定领域或特定类型的网站,如新闻网站、电商网站等,能够更深入地挖掘特定领域的信息。增量爬行器只爬取更新的数据,避免重复爬取已有的数据,节省时间和资源。
Web 爬行器的优势主要体现在以下几个方面:一是自动化数据采集,能够自动访问网页、提取数据,大大提高了数据采集的效率;二是数据多样性,可以采集各种类型的数据,如文本、图片、视频等;三是数据实时性,可以定期或实时地爬取数据,保持数据的最新性;四是可用于数据分析和挖掘,通过爬取大量数据,可以发现隐藏的规律和趋势。
3. 腾讯云相关产品
腾讯云提供了一系列与 Web 爬行器相关的产品。云服务器(CVM)提供弹性计算能力,支持多种操作系统和应用场景,为 Web 爬行器的运行提供稳定的计算资源。云数据库 MySQL 版(CDB)提供高可用、可扩展的 MySQL 数据库服务,可用于存储爬取的数据。云存储(COS)提供安全、稳定、低成本的对象存储服务,适用于图片、视频、文档等数据的存储和管理。人工智能平台(AI Lab)提供丰富的人工智能算法和模型,可对爬取的数据进行分析和处理。物联网(IoT Hub)提供稳定、安全的物联网连接和管理服务,可与 Web 爬行器结合,实现物联网数据的采集和处理。区块链服务(BCS)提供高性能、安全可信的区块链服务,可用于保障爬取数据的真实性和安全性。视频直播(Live)提供高清、低延迟的视频直播服务,与 Web 爬行器结合可实现直播数据的采集和分析。产品介绍链接可参考:云服务器产品介绍链接、云数据库 MySQL 版产品介绍链接、云存储产品介绍链接、人工智能平台产品介绍链接、物联网产品介绍链接、区块链服务产品介绍链接、视频直播产品介绍链接。
(二)大数据分享中的 Web 爬行器
1. 开源 Web 抓取工具的作用
开源 Web 抓取工具在大数据繁荣中发挥着重要作用。它们允许用户根据源代码或框架进行编码,为快速、简单但广泛的抓取方式提供了大量支持。用户可以轻松抓取所需的数据,进行数据分析和处理。2019 年十大开源 Web 抓取工具包括 Scrapy、Heritrix、Web-Harvest、MechanicalSoup、Apify SDK、Apache Nutch、Jaunt、Node-crawler、PySpider 和 StormCrawler。
Scrapy 是 Python 中最流行的开源和协作式 Web 抓取工具,建立在扭曲的异步网络框架之上,能高效提取数据并以多种格式存储。其优势包括快速而强大、易于使用、详细文档丰富、可插入新功能、社区健康资源丰富以及可在云环境下运行。
Heritrix 是基于 JAVA 的开源扩展程序,高度可扩展,设计用于 Web 归档,尊重 robot.txt 排除指令和 Meta 机器人标签,提供基于 Web 的用户界面。其优势有可更换的可插拔模块、基于 Web 的界面、尊重规则和出色的可扩展性。
Web-Harvest 是用 Java 编写的开源刮板,利用 XSLT、XQuery 和正则表达式等技术从指定页面收集数据,可通过自定义 Java 库增强提取功能。其优势为强大的文本和 XML 操作处理器、变量上下文支持以及支持真实脚本语言。
MechanicalSoup 是 Python 库,模拟人在使用浏览器时与网站的交互,围绕 Requests 和 BeautifulSoup 构建,自动存储和发送 cookie,跟随重定向和链接并提交表单。其优势是模拟人类行为、快速抓取简单网站、支持 CSS 和 XPath 选择器。
Apify SDK 是内置 JavaScript 的最佳 Web 抓取工具之一,可扩展的抓取库可使用无头 Chrome 和 Puppeteer 开发数据提取和 Web 自动化作业,具有大规模、高性能刮擦、通过代理池验证云避免被检测以及对 Node.js 插件内置支持等优势。
Apache Nutch 是完全用 Java 编写的开源刮板,具有高度模块化的体系结构,允许开发插件,优势包括高度可扩展和可扩展、遵守 txt 规则、充满活力的社区和积极的发展以及可插拔的解析、协议、存储和索引。
Jaunt 是基于 JAVA 的网络抓取工具,专为网络抓取、网络自动化和 JSON 查询而设计,提供快速、超轻巧、无头的浏览器,优势有处理单个 HTTP 请求 / 响应、轻松与 REST API 接口、支持 HTTP/HTTPS 和基本身份验证以及 DOM 和 JSON 中启用 RegEx 的查询。
Node-crawler 是基于 Node.js 的功能强大的 Web 搜寻器,原生支持非阻塞异步 I/O,支持 DOM 的快速选择,提高搜寻器开发效率。其优势包括速率控制、URL 请求不同优先级、可配置的池大小和重试以及服务器端 DOM 和自动 Cheerio 或 JSDOM 的 jQuery 插入。
PySpider 是 Python 中功能强大的网络爬虫系统,具有易于使用的 Web UI 和分布式体系结构,支持多种数据库进行数据存储。其优势为强大的 WebUI、多种消息队列支持以及分布式架构。
StormCrawler 是成熟的开源 Web 搜寻器,由可重复使用的资源和组件组成,主要用 Java 编写,用于构建低延迟、可扩展和优化的 Web 抓取解决方案。其优势有高度可扩展、易于扩展的附加库以及出色的线程管理。
2. 非编码工具的优势
非编码工具如 Octoparse 使抓取不再是开发人员的特权。对于不熟悉编程的用户来说,这些工具更适合,让抓取变得容易。它们无需用户具备编程知识,通过图形界面和简单的操作即可实现数据抓取。
(三)Web 爬行器在安全测试中的应用
1. 使用 DirBuster 寻找敏感文件和目录
DirBuster 是一款安全工具,可通过暴力或者表单进行来发现 Web 应用服务器上的目录名和文件名。具体实验步骤如下:首先,创建一个包含要查找的文件列表的文本文件,如 dir_dictionary.txt。然后,在 DirBuster 窗口中,将目标 URL 设置为靶机地址,如 http://192.168.123.12/。接着,设置线程数为 20 以获得不错的测试速度。选择基于列表的暴力破解,点击 “浏览”,选择创建的文件。取消选中 “Be Recursive” 选项,其余选项保留默认值。最后,点击 “Start” 开始扫描。如果转到结果选项卡,我们将看到 DirBuster 在字典中找到的文件夹,响应码 200 表示文件或目录存在并且可以被读取。
2. 使用 ZAP 寻找敏感文件和目录
OWASP Zed Attack Proxy(ZAP)是一种非常通用的 web 安全测试工具,具有代理、被动和主动漏洞扫描器、爬行器等特性。配置 ZAP 作为浏览器代理的步骤如下:从 Kali Linux 菜单启动 OWASP ZAP,选择 Applications |03 - Web Application Analysis owasp-zap 或者打开终端并输入 owasp-zap 命令。更改 ZAP 的代理设置,默认端口为 8080,为避免与其他代理冲突,可将端口更改为 8088。在 Firefox 中,转到主菜单并导航到 Preferences | Advanced / Network;在 Connection 中,单击 Settings,选择手动代理配置,并将 HTTP 代理设置为 127.0.0.1,将端口设置为 8088,选中该选项以对所有协议使用相同的代理,然后单击 OK。
使用 ZAP 扫描服务器存在的文件夹的方法:正确配置代理后,浏览到目标网站,如 http://192.168.123.130/WackoPicko/。我们将看到 ZAP 通过显示我们刚访问过的主机的树结构来对此操作做出反应。现在在 ZAP 的左上角面板(“站点” 选项卡)中在目标网站内右键单击,然后在上下文菜单中,导航到 Attack(攻击)强制浏览目录(和子目录),WackoPicko 文件夹。