一 爬虫发展历史,概念与反爬机制
(一)爬虫发展历史
- 早期爬虫(1990s)
- 起源 :早期的爬虫主要是为了构建搜索引擎。
- 典型案例: Yahoo!人工目录 → 谷歌PageRank算法驱动的自动化爬虫。
- 功能特点 :这些爬虫的功能比较单一,主要以抓取网页的文本内容为主,采用简单的广度优先或深度优先的策略遍历网页链接。对网页的分析也基本是基于文本关键词匹配。
- 传统爬虫(2000s - 2010年左右)
- 技术进步 :随着互联网的发展,网页数量急剧增加,企业级爬虫兴起(如Heritrix),聚焦垂直领域数据采集,出现分布式爬虫框架。同时,数据存储技术的发展使得爬虫可以将抓取的数据存储到关系型数据库等多种存储介质中。
- 技术突破: 多线程、代理IP池、动态页面解析。
- 应用拓展 :除了搜索引擎,爬虫开始被用于一些商业应用,对爬虫的精度和效率提出了更高的要求。
- 现代爬虫(2010s至今)
- 应对反爬技术 :由于网站为了保护自身数据和服务器资源,设置了各种反爬措施,催生Headless浏览器(如Puppeteer)、AI验证码识别等技术。例如,出现了模拟浏览器行为的爬虫,能够处理JavaScript动态渲染的网页;还有分布式爬虫,通过多台机器协同工作来提高爬取效率,并降低被封禁的风险。
- 大数据应用 :爬虫成为大数据时代数据收集的重要手段之一。它可以抓取社交媒体、电商、新闻等多种来源的数据,为数据分析、机器学习等提供海量的数据支持。同时,爬虫技术也面临着法律和道德的挑战,需要在合法合规的前提下进行数据收集。
(二)爬虫概念
- 爬虫定义:通过模拟HTTP请求自动获取并解析、提取和存储网页数据的程序。
- Robots协议: robots.txt文件定义爬虫访问规则(非强制,但需遵守行业伦理)。
- 数据边界:合法爬取公开数据,禁止入侵授权访问内容(如密码保护页面)。
- 网络爬虫是获取网络数据的重要工具,广泛应用于搜索引擎、数据分析、人工智能训练数据收集等领域。
(三)反爬机制
反爬手段 | 应对策略 | 代码示例 |
---|---|---|
User-Agent检测 | 随机切换UA伪装浏览器 | headers = {'User-Agent': '“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36”'} |
IP频率限制 | 使用代理IP池(如Scrapy-Proxy) | requests.get(url, proxies={'http': 'ip:port'}) |
验证码拦截 | OCR识别(Tesseract)或打码平台接入 | pytesseract.image_to_string(captcha_img) |
动态加载数据 | 渲染JavaScript(Selenium/Playwright) | driver.execute_script("return data") |
请求参数加密 | 逆向JS分析加密逻辑 | 使用PyExecJS解析加密算法 |
- 基于浏览器特征的反爬
- 原理 :网站会检查请求的浏览器特征,如User - Agent、浏览器的Accept - Encoding、Accept - Language等头部信息。如果这些信息不符合正常浏览器的特征,或者存在不一致的情况,服务器可能会拒绝请求。
- 基于访问频率的反爬
-
原理 :网站服务器会监测同一IP地址或同一用户代理(User - Agent)在单位时间内的访问请求数量。如果访问频率过高,服务器会认为这是爬虫的行为,可能会拒绝后续的请求或者将该IP地址暂时封禁。
-
应对方法 :爬虫可以通过设置合理的访问间隔时间,模拟真实的用户访问行为。例如,设置每秒只发送1 - 2个请求,或者采用随机的时间间隔。同时,可以使用代理IP池,通过切换不同的IP地址来避免因访问频率过高而被封禁。
- 基于验证码的反爬
-
原理 :当网站检测到异常访问行为时,会弹出验证码要求用户验证。验证码可以是数字字母组合、图形验证码等。验证码的目的是区分人和机器,因为目前大多数爬虫很难准确识别验证码。
-
应对方法 :对于简单的数字字母验证码,可以通过OCR(光学字符识别)技术进行识别。但对于复杂的图形验证码,如扭曲的字符、带有干扰线的验证码,识别的准确率可能会降低。在这种情况下,可以使用打码平台(需要付费)来帮助识别验证码,或者尝试通过模拟正常用户行为来避免触发验证码。
- 基于JavaScript动态渲染的反爬
-
原理 :现代网页很多内容是通过JavaScript动态加载的。一些网站会将关键数据放在JavaScript渲染后的页面中,并且对爬虫访问JavaScript资源进行限制。如果爬虫无法正确执行JavaScript,就无法获取这些数据。
-
应对方法 :可以使用支持JavaScript渲染的爬虫框架,如Selenium、Puppeteer等。这些工具通过模拟真实的浏览器环境来执行JavaScript,获取动态渲染后的网页内容。
二、网络信息传输过程,HTTP与Cookie的概念与作用
(一)网络信息传输过程
- 用户请求发起
- 当用户在浏览器地址栏输入网址(如https://www.example.com)并按下回车键,或者点击网页上的链接时,浏览器会根据URL中的协议(如HTTP或HTTPS)来确定如何发送请求。
- DNS解析
- 浏览器会先进行DNS(Domain Name System,域名系统)解析,将网址中的域名(如example.com)转换为IP地址。这是因为计算机在网络中通信是基于IP地址的。DNS服务器会查找域名对应的IP地址,并将结果返回给浏览器。
- 建立TCP连接
- 在获取到目标服务器的IP地址后,浏览器会与服务器建立TCP(Transmission Control Protocol,传输控制协议)连接。TCP连接的建立过程包括三次握手,确保双方可以可靠地通信。这个过程主要是为了保证数据传输的可靠性和有序性。
- 发送HTTP请求
- 一旦TCP连接建立成功,浏览器会按照HTTP协议的格式向服务器发送请求。HTTP请求包括请求行(如GET / HTTP/1.1)、请求头部(如Host、User - Agent、Accept等)、请求体(对于POST请求可能有请求体,如表单数据)和空行。
- 服务器处理并返回HTTP响应
- 服务器收到HTTP请求后,会根据请求的内容进行处理。例如,服务器会查找请求的资源(如网页文件)并生成相应的响应。HTTP响应包括状态行(如HTTP/1.1 200 OK)、响应头部(如Content - Type、Content - Length等)、响应体(如网页的HTML内容)和空行。然后服务器将响应通过TCP连接发送回浏览器。
- 断开TCP连接
- 浏览器收到HTTP响应后,会根据需要断开TCP连接。如果是HTTP/1.1协议,并且没有设置连接超时等参数,可能会保持连接一段时间,以便复用连接发送后续的请求。
- 浏览器渲染网页
- 浏览器收到网页的HTML内容后,会解析HTML内容并构建DOM(Document Object Model,文档对象模型)树。同时,浏览器还会根据HTML中的链接下载网页的其他资源,如CSS文件、JavaScript文件、图像等。然后浏览器会按照网页的布局和样式规则进行渲染,将网页内容呈现给用户。
(二)HTTP概念与作用
- 概念
- HTTP(HyperText Transfer Protocol,超文本传输协议)是用于从服务器传输超文本(如HTML文档、图像、视频等)到本地浏览器的传输协议。它是万维网(WWW)的基础协议,工作在OSI模型的应用层。 HTTP是一个无状态的协议,即服务器在处理完一个请求后,不会记录任何关于该请求的信息,每个请求都是独立的。
- 作用
-
请求 - 响应模式 :HTTP采用请求 - 响应模式进行通信,请求方法如下:
-
GET
:获取资源(参数在URL中,如page=2
) -
POST
:提交数据(参数在请求体,如登录表单)
-
-
状态码:
-
200 OK: 成功
-
403 Forbidden: 无权限访问
-
404 Not Found:网页不存在
-
503 Service Unavailable:服务器过载
-
-
超文本传输 :HTTP可以传输各种类型的超文本内容,如HTML、XML、JSON等。这使得它可以支持丰富的网页内容和数据格式,方便构建各种网络应用。
-
资源定位与访问 :通过URL(Uniform Resource Locator,统一资源定位符),HTTP可以定位互联网上的资源。URL包含了协议、主机名、端口号、路径等信息,使得客户端能够准确地访问服务器上的特定资源。
(三)Cookie概念与作用
- 概念
- Cookie是服务器发送到用户浏览器并存储在浏览器中的小块数据。它以键值对的形式存在,通常用于存储用户会话信息。当浏览器再次向服务器发送请求时,会自动将对应的Cookie包含在HTTP请求中。Cookie可以在客户端(浏览器)和服务器之间保持状态信息。
- 作用
-
爬虫管理:
import requestssession = requests.Session() # 自动管理Cookiesession.post(login_url, data=credentials) # 登录后Cookie自动保存response = session.get(protected_page) # 携带Cookie访问
-
会话跟踪 :Cookie的主要作用之一是用于会话跟踪。例如,当用户登录一个网站后,服务器会在响应中设置一个包含会话ID的Cookie。浏览器在后续请求中发送这个Cookie,服务器通过会话ID识别用户的身份,从而保持用户的登录状态。这样用户在浏览网站的不同页面时,不需要每次都要重新登录。
-
个性化设置存储 :网站可以使用Cookie来存储用户的个性化设置,如语言偏好、页面布局等。当用户再次访问网站时,网站可以根据Cookie中的信息为用户提供代码,提供账号,提供更个性化的服务。
-
数据收集与分析 :一些网站利用Cookie来收集用户的行为数据,用于网站流量统计和分析。例如,通过分析用户访问的页面、访问时间等信息,网站可以了解用户的兴趣和行为模式,从而优化网站内容和广告投放策略。
三、爬虫环境、爬虫基本流程与网页前端知识
(一)爬虫环境
- 基础工具链:
-
Python + Requests/Scrapy
-
浏览器开发者工具(Network/XPath定位)
-
数据库(MySQL/MongoDB存储数据)
- 编程语言选择
- Python :Python是目前最常用的爬虫编程语言之一。它有丰富的库和框架来支持爬虫开发,如urllib、requests用于发送HTTP请求,BeautifulSoup、lxml用于解析HTML内容,Scrapy是一个功能强大的开源爬虫框架。Python的语法简洁,开发效率高,适合快速构建爬虫应用。
- Java :Java也有相关的爬虫库,如Apache HttpClient用于发送HTTP请求,Jsoup用于解析HTML。Java的优势在于它具有良好的跨平台性和强大的性能,适合构建大型、高效的爬虫系统。
- JavaScript/Node.js :在一些特殊场景下,如需要处理大量JavaScript动态渲染网页时,可以使用JavaScript和Node.js。例如,使用Puppeteer或Selenium等工具来控制浏览器进行爬虫操作。
- 开发工具
- 文本编辑器/IDE :如VS Code(Visual Studio Code)、PyCharm(主要用于Python开发)等。这些工具提供了代码编辑、调试、语法高亮等功能,方便爬虫代码的编写和调试。
- 浏览器开发者工具 :用于分析网页的HTML结构、查看网络请求和响应、调试JavaScript等。在爬虫开发过程中,通过浏览器开发者工具可以了解目标网页的资源加载情况、请求参数等信息,为爬虫的开发提供重要的参考。
- 依赖库和框架
- 请求库 :如Python的requests库,它简化了HTTP请求的发送过程。可以方便地设置请求头部、处理重定向、管理Cookies等。例如,通过requests.get()方法可以轻松地获取网页内容。
- 解析库 :如BeautifulSoup和lxml,它们用于解析HTML和XML文档。BeautifulSoup提供了简单的接口来查找、提取网页中的数据,而lxml在处理大规模HTML文档时性能更高。例如,可以使用BeautifulSoup的find()和find_all()方法来查找网页中的特定标签。
(二)爬虫基本流程
- 爬虫标准流程