什么是爬虫
Web 爬虫,也称为网络蜘蛛或网络机器人,是一种用于自动化访问和抓取网页内容的程序。爬虫通过模拟用户访问网页的行为,从互联网上获取数据,并将其存储或进一步处理。
爬虫的应用场景
- 搜索引擎索引:如 Google、Bing,构建和更新搜索引擎的网页索引。
- 数据挖掘和分析:如价格监控、市场研究、新闻聚合等。
- 内容聚合:如新闻聚合网站、比价网站,从多个来源抓取内容并汇总。
- 竞争情报:监控竞争对手网站的变化,获取最新的市场动向。
爬虫的类型
1. 通用爬虫(General Web Crawler)
- 描述:抓取尽可能多的网页,不针对特定的网站或内容。
- 应用:搜索引擎(如 Googlebot、Bingbot)。
- 特点:广泛抓取,覆盖整个互联网,遵循网站的
robots.txt
文件。2. 聚焦爬虫(Focused Crawler)
- 描述:根据特定主题或关键词抓取相关网页。
- 应用:研究特定领域的信息、监控特定主题的动态。
- 特点:目标明确,抓取范围较狭窄,但深入特定领域。
3. 增量爬虫(Incremental Crawler)
- 描述:只抓取和更新自上次爬取以来发生变化的网页。
- 应用:保持索引的最新状态,减少重复抓取。
- 特点:高效更新,节省带宽和资源。
4. 深度爬虫(Deep Web Crawler)
- 描述:抓取深网内容,包括动态生成的页面、需要表单提交才能访问的内容。
- 应用:获取非公开网页、数据库内容、需要认证访问的资源。
- 特点:复杂度高,可能需要模拟用户行为(如登录、表单提交)。
5. 垂直爬虫(Vertical Crawler)
- 描述:专注于特定行业或领域的网站内容抓取。
- 应用:电商比价网站、招聘信息聚合、房产信息收集。
- 特点:聚焦于某一行业,抓取深度较深,内容质量较高。
6. 动态爬虫(Dynamic Crawler)
- 描述:能够抓取动态生成的内容,通过模拟浏览器行为执行 JavaScript。
- 应用:抓取现代 Web 应用(如单页应用,SPA)的内容。
- 特点:复杂度高,需要使用工具如 Selenium、Puppeteer。
爬虫关注的请求头
- Host:指定请求的目标主机和端口号。例如:Host: www.example.com
- Content-Type:告诉服务器请求中包含的内容的类型,以便服务器正确解析和处理请求主体。常见的值有 application/json,application/x-www-form-urlencoded,multipart/form-data 等。例如:Content-Type: application/json
- Connection:决定客户端和服务器之间的网络连接是否保持打开,或者在请求完成后关闭。常见的值有 keep-alive 和 close。例如:Connection: keep-alive
- Upgrade-Insecure-Requests:用于告知服务器,客户端愿意接收通过 HTTPS 提供的资源,而不是通过 HTTP。例如:Upgrade-Insecure-Requests: 1
- User-Agent:标识请求的客户端应用程序类型、操作系统、软件版本等。帮助服务器识别请求的客户端,有时服务器会根据 User-Agent 返回不同的内容或进行特定的处理。例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
- Referer:指示请求的来源页面的 URL。用于告诉服务器当前请求来自哪个页面。服务器有时会根据 Referer 进行分析或防止跨站请求伪造(CSRF)攻击。例如:Referer: https://www.example.com/previous-page
- Cookie:包含客户端存储的所有 cookie 数据。用于在请求中传递与服务器会话相关的数据,比如用户登录状态、首选项等。服务器可以使用这些 cookie 来识别和跟踪用户。例如:Cookie: sessionId=abc123; theme=light
- Authorization:包含身份验证信息。用于提供凭据,以证明请求用户的身份。常见的值有 Basic(基本认证)和 Bearer(通常用于 JWT 或 OAuth 令牌)。例如:Authorization: Bearer <token>
- Accept-Language:指定客户端期望接收的语言(如 en-US, zh-CN)。帮助服务器返回本地化的内容。例如:Accept-Language: zh-CN
- Accept-Encoding:指定客户端可以处理的内容编码(如 gzip, deflate),使用何种压缩方法传输数据以节省带宽。例如:Accept-Encoding: gzip, deflate
爬虫关注的响应头
- Content-Type:指示响应内容的 MIME 类型,告诉客户端如何解释响应内容。例如,text/html 表示 HTML 文档,application/json 表示 JSON 数据。例如:Content-Type: application/json
- Content-Length:指示响应内容的字节长度。例如:Content-Length: 348
- Set-Cookie:用于设置客户端的 cookie,服务器通过此头部向客户端发送 cookie,客户端会在后续请求中携带这些 cookie。例如:Set-Cookie: sessionId=abc123; Path=/; HttpOnly
- Server:提供服务器相关信息,但过多的详细信息可能会暴露安全风险。例如:Server: Apache/2.4.41 (Ubuntu)
- Cache-Control:指示缓存策略,控制客户端和中间代理的缓存行为,常见的值包括 no-cache, no-store, max-age=3600。例如:Cache-Control: no-cache
- Content-Encoding:指示响应内容的编码方式。常见的编码方式有 gzip, deflate, br。例如:Content-Encoding: gzip
- Location:指示重定向的目标 URL。用于重定向响应,通常与状态码 3xx 一起使用,告知客户端要重定向到的新位置。例如:Location: https://www.example.com/new-page
- Access-Control-Allow-Origin:控制跨域资源共享(CORS),指定哪些域名可以访问资源。* 表示允许所有域名访问。例如:Access-Control-Allow-Origin: *
爬虫对响应状态码的处理建议
常见状态码
1xx 信息响应(Informational Responses)
- 100 Continue
- 描述:请求已收到,客户端可以继续发送请求体。
- 应用:适用于较大请求体的分段传输。
2xx 成功响应(Successful Responses)
200 OK
- 描述:请求成功,服务器已返回所请求的数据。
- 应用:抓取成功的页面。
201 Created
- 描述:请求成功,并且服务器创建了新的资源。
- 应用:POST 请求后,资源成功创建时的响应。
204 No Content
- 描述:请求成功,但没有内容返回。
- 应用:DELETE 请求后,资源成功删除时的响应。
3xx 重定向响应(Redirection Responses)
301 Moved Permanently
- 描述:请求的资源已永久移动到新 URL。
- 应用:更新爬虫的 URL 记录,抓取新的地址。
302 Found
- 描述:请求的资源临时移动到新 URL。
- 应用:跟随重定向抓取新地址,但不更新 URL 记录。
304 Not Modified
- 描述:请求的资源未修改,可以使用缓存版本。
- 应用:减少不必要的抓取,使用本地缓存数据。
4xx 客户端错误响应(Client Error Responses)
400 Bad Request
- 描述:请求无效,服务器无法处理。
- 应用:检查请求的构建,修正错误。
401 Unauthorized
- 描述:请求需要身份验证。
- 应用:提供必要的认证信息,如 Token 或 Cookie。
403 Forbidden
- 描述:服务器拒绝请求,无权访问资源。
- 应用:可能需要更改策略或提供认证信息。
404 Not Found
- 描述:请求的资源不存在。
- 应用:记录该 URL,不再尝试抓取。
429 Too Many Requests
- 描述:请求频率过高,被服务器限流。
- 应用:调整抓取频率,遵守网站的请求速率限制。
5xx 服务器错误响应(Server Error Responses)
500 Internal Server Error
- 描述:服务器内部错误,无法完成请求。
- 应用:通常是服务器端问题,可能重试请求。
502 Bad Gateway
- 描述:网关或代理服务器从上游服务器接收到无效响应。
- 应用:可能是暂时性问题,重试请求。
503 Service Unavailable
- 描述:服务器目前无法处理请求,通常是暂时性的。
- 应用:通常由于服务器过载或维护,稍后重试。
504 Gateway Timeout
- 描述:网关或代理服务器等待上游服务器响应超时。
- 应用:可能是暂时性问题,重试请求。
处理建议
- 成功状态码(2xx):正常处理,提取和存储数据。
- 重定向状态码(3xx):跟随重定向,确保抓取正确的最终 URL。
- 客户端错误状态码(4xx):分析和调整请求,避免无效请求。
- 服务器错误状态码(5xx):适当重试请求,但要设置重试次数上限,防止无限重试。
- 状态码不是绝对可信的,例如:一些网站为了防止爬虫过度抓取,会故意返回错误的状态码,如 403、404、429、503等。一切以是否从响应中获取到数据为准,network中得到的源码是判断依据,elements中的源码是渲染之后的,不能作为判断依据。
爬虫的法律问题
数据访问权限:
- 爬虫必须遵守目标网站的使用条款和服务协议。某些网站可能明确禁止自动化访问或数据抓取。
- 解决方案:确保在合法授权或许可的范围内进行数据访问和抓取。
著作权和数据所有权:
- 爬虫抓取的内容可能受到版权保护。对于未经许可的数据抓取,可能侵犯原作者的著作权。
- 解决方案:尊重版权法,仅抓取公开或允许使用的数据,或者获取数据使用许可。
反竞争行为:
- 爬虫抓取竞争对手的价格信息或商业机密,可能构成不正当竞争或侵犯商业秘密。
- 解决方案:遵守竞争法规定,避免获取或使用未公开的商业机密信息。
隐私保护:
- 爬虫抓取的数据可能涉及个人隐私,如用户信息或敏感数据。未经授权地收集和处理这些数据可能违反隐私法规。
- 解决方案:遵守数据保护法律,确保在合法和透明的条件下处理个人数据。
网络攻击和破坏:
- 爬虫不得用于未经授权的网络攻击或破坏行为,如对目标网站进行拒绝服务攻击(DDoS)或其他恶意行为。
- 解决方案:遵守计算机犯罪法,确保使用爬虫技术不会损害他人的网络安全和正常运作。