爬虫入门教程(一)

爬虫入门教程

1.什么是爬虫

爬虫是一种自动获取网站数据的程序或脚本。它可以自动模拟人类访问网站,获取网页源代码,解析并提取出所需的数据

爬虫的工作原理类似于搜索引擎的索引程序,它们会按照预定的规则和算法在互联网上不断地爬取网页,收集信息并建立索引,以便用户可以通过搜索引擎来查找并获取所需的信息。

爬虫通常会从一个起始网址开始,然后根据超链接逐步地遍历整个网站或整个互联网。它们会访问网页的内容,抓取文本、图片、视频等数据,并对这些数据进行处理和分析。爬虫可以用于各种目的,如搜索引擎优化、数据挖掘、信息收集、监控等。

2.爬虫基础知识

在学习爬虫前,需要掌握以下基础知识:

2.1URL

URL是统一资源定位符(Uniform Resource Locator)的缩写,它是互联网上用于标识和定位资源(如网页、图片、视频等)的地址。URL通常由几个部分组成,包括协议、主机名、路径和可选的查询参数和片段标识符。

一个典型的URL的格式如下:

协议://主机名/路径?查询参数#片段标识符

(1)协议(Protocol):指定了访问资源所需的协议,常见的协议有HTTP、HTTPS、FTP、SMTP等。
(2)主机名(Host):标识了资源所在的主机或服务器的域名或IP地址。
(3)路径(Path):指定了服务器上资源的具体位置,用来定位资源在服务器上的存储位置。
(4)查询参数(Query Parameters):可选部分,用来传递额外的参数给服务器,通常以键值对的形式存在,多个参数之间用&符号分隔。
(5)片段标识符(Fragment Identifier):可选部分,用来指定资源中的特定部分,例如网页内的锚点。

举例来说,下面是一个典型的URL:

https://www.example.com/blog/article?id=123#section2

协议: HTTPS
主机名: www.example.com
路径是:/blog/article
查询参数: id=123
片段标识符:section2

通过URL,用户可以方便地访问互联网上的各种资源,浏览网页、下载文件、观看视频等。网络爬虫也是通过解析URL来访问网页并提取数据的。

2.2HTTP协议

HTTP(HyperText Transfer Protocol)是一种用于传输超文本数据(如 HTML)的应用层协议,是万维网的数据通信基础。HTTP是无状态的协议,即每个请求都是独立的,服务器不会维护关于客户端的状态信息。
HTTP通信过程:
在这里插入图片描述
HTTP请求由以下几部分组成:

(1)请求行:包括请求方法(GET、POST等)、请求的URL和协议版本。
(2)请求头部:包含关于请求的附加信息,如Accept、User-Agent等。
(3)请求主体:可选部分,在POST请求中包含提交的数据。

HTTP响应由以下几部分组成:

(1)状态行:包括协议版本、状态码和状态消息。
(2)响应头部:包含响应的附加信息,如Content-Type、Content-Length等。
(3)响应主体和空行:包含实际返回的数据。

2.3HTML/XML

大多数网站使用HTML作为展示内容的标记语言。解析HTML可以提取出页面文本、链接和其他有用信息。XML也是一种常见的结构化数据表示形式。

(1)标签和元素:了解HTML和XML的标签结构以及如何定义元素。
(2)属性:了解标签中的属性以及如何提取和利用这些属性。
(3)文本和注释:理解如何处理文本内容和注释。
(4)嵌套结构:了解标签如何嵌套以构建文档结构。

2.4其他

其他相关知识,比如正则表达式、Json格式处理、JS渲染页面解析、数据库存储等。同时不同国家和地区对互联网数据收集有不同的法律法规。编写爬虫时必须遵守相关法律,避免侵犯他人权益。

3.爬虫流程

一般爬虫开发包含以下步骤:

  1. 确定需求和目标
  2. 分析目标网站结构
  3. 编写爬虫代码
  4. 测试和运行爬虫
  5. 存储和后处理数据
  6. 部署上线和维护

3.1确定需求和目标

明确需要采集哪些网站的哪些数据,以及数据将用于什么目的。这一步决定了爬虫的开发重点和复杂程度。例如爬取网址https://qq.yh31.com/zjbq/的图片
在这里插入图片描述

3.2分析目标网站结构

分析待采集网站的URL路径设计、链接结构、反爬虫策略等,为编写高效稳定的爬虫代码做准备。可用开发者工具等方式辅助分析。

3.3编写爬虫代码

根据需求和分析结果,选择Python、Java等编程语言,结合第三方网络库如Requests等,编写完成各模块的爬虫代码,包括:

  • 链接提取
  • 网页下载
  • 内容解析
  • 数据存储
  • 调度控制

示例代码:

import re
import requests
import os# 网站URL
url = "https://qq.yh31.com/zjbq/"# 发送请求获取网页HTML代码
response = requests.get(url)
html_content = response.content.decode("utf-8")# 使用正则表达式匹配所有JPG图片链接
pattern = r'<img\s+src="(http[s]?://[^"]+\.jpg)"'
image_urls = re.findall(pattern, html_content)# 创建文件夹用于存储下载的图片
folder_name = "downloaded_images"
if not os.path.exists(folder_name):os.makedirs(folder_name)# 下载图片并保存到本地
for i, image_url in enumerate(image_urls, start=1):try:response = requests.get(image_url)image_data = response.content# 构造图片文件名image_name = f"{folder_name}/image_{i}.jpg"# 保存图片到本地with open(image_name, "wb") as file:file.write(image_data)print(f"Downloaded {image_url} as {image_name}")except Exception as e:print(f"Error downloading {image_url}: {e}")print("Download completed.")

3.4测试和运行爬虫

编写完爬虫代码后,先在测试环境中运行检查是否正常工作。如果运行正常无误,可以部署在更大规模的环境下长期运行采集数据。在这里插入图片描述
在这里插入图片描述

3.5存储和后处理数据

采集的数据需要存储并进行必要的后处理,以满足不同的使用需求。可存储为文本文件、数据库等多种格式。后处理包括数据清洗、格式化等步骤。

3.6部署上线和维护

对于长期自动运行的大规模爬虫系统,需要做好容灾、负载均衡、代理IP池等工作,保证稳定高效运行。同时监控和分析日志,持续改进和优化爬虫,维护其健壮性和可扩展性。

4.爬虫库和框架

为了方便快速构建爬虫程序,开发者贡献了诸多优秀的第三方库和框架,大大提高了爬虫开发效率。

常见的Python爬虫库和框架包括:

  • Requests: 功能强大的网络请求库
  • Scrapy: 由Scrapy团队维护的爬虫框架
  • PySpider: 支持分布式的爬虫框架
  • Selenium: 自动控制浏览器的工具
  • PyQuery: 方便解析HTML的库

5.反爬虫策略

网站为了防止被恶意爬虫扫描,采取了各种反爬虫策略,主要包括:

  • 用户识别
  • 限制访问频率
  • IP黑名单和白名单
    -验证码机制
  • Javascript指纹检测
  • 蜜罐链接陷阱

爬虫开发者需要针对不同策略制定相应的应对措施,如设置随机User Agent、使用代理IP池、极验验证码破解等,让爬虫更加人性化,避免被服务器拦截或封杀。

总结

这是一个大致的爬取教程,后续的文章将为大家详细讲解爬虫的知识以及具体的操作。在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s知识

k8s是用于容器编排和管理的&#xff0c;docker或者ctr是k8s的运行时&#xff0c;k8s通过容器运行时来启动容器&#xff0c;容器启动需要镜像&#xff0c;镜像可以用docker构建&#xff0c;dockerfile就是用于自定义如何构建镜像&#xff0c;所以上面那套流水线就是先用dockerfi…

Linux|从 STDIN 读取 Awk 输入

简介 在之前关于 Awk 工具的系列文章中&#xff0c;主要探讨了如何从文件中读取数据。但如果你希望从标准输入&#xff08;STDIN&#xff09;中读取数据&#xff0c;又该如何操作呢&#xff1f; 在本文中&#xff0c;将介绍几个示例&#xff0c;展示如何使用 Awk 来过滤其他命令…

即插即用篇 | YOLOv8引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv8-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

mysql 查询变量@i:=@i+1

学习完mysql的查询&#xff1a;基本查询&#xff0c;连接查询和子查询和mysql 正则表达式查询&#xff0c;接下来先学习下变量查询。 mysql中没有oracle序列号那一列。mysql可以使用查询变量的方式去处理。我们先了解下查询变量&#xff0c;后面应用起来就更清晰。 1&#xff0…

“弱智吧”才是人类面对AI的最后一道堡垒

在 AI 的研究领域中&#xff0c;语言模型的训练数据选择一直是一个关键问题。传统的智慧告诉我们&#xff0c;高质量的数据集应该是由专家精心挑选和校对的文本组成&#xff0c;以确保模型学习到的语言是规范、准确、有文化内涵的。 然而&#xff0c;最近的一项研究颠覆了这一观…

【Java】Java中类的初始化顺序(静态方法,静态块,非静态块,最后有流程图)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在日常使用Java的时候&#xff0c;我们都接触过new这个关键字&#xff0c;那你是否知道在我们的对象真正创建出来之前都做了哪些事情呢&#xff1f; 实际上要去判断一个类的初始化的顺序&#xff0c;需要分一下情况&…

Bean的默认名称

1.使用spring的注解 Component、Repository、Service、Controller 等注解去把一个类配置为bean时&#xff0c;如果不指定bean的名称&#xff0c;那么bean的名称的默认规则是&#xff1a; ①类名的首字母小写&#xff0c;例如&#xff1a;类名称 UserDao &#xff0c;那么默认的…

C++笔记:STL容器库的使用

前置&#xff1a; 对于stl容器库&#xff0c;我只做了一些常用的笔记&#xff0c;关于更详细的使用可以参考:https://cppreference.com/https://cppreference.com/ 一.string--字符串 对于C中string字符串会比C语言的字符数组使用起来会顺手许多。 命名空间&#xff1a;std 关于…

使用串口给ESP8266发送AT指令无反应解决

解决方法&#xff1a;重新烧录固件 设置PC机波特率 设置PC机上的端口波特率和flash下载工具中的波特率一致&#xff0c;否则flash下载工具会一直提示串口连接失败。我这里将PC机上的串口波特率设置为115200&#xff0c;然后flash下载工具波特率也设置为115200 Windows系统上…

电脑远程控制esp32上的LED

1、思路整理 首先esp32需要连接上wifi 然后创建udp socket 接受udp数据 最后解析数据&#xff0c;控制LED 2、micropython代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.…

芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第三集】芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖高效AsDDet检测头组合改进,适用于 YOLOv8 …

超详细解读Transformer框架

Transformer是由谷歌大脑2017年在论文《Attention is All You Need》中提出的一种序列到序列(Seq2Seq)模型。自提出伊始&#xff0c;该模型便在NLP和CV界大杀四方&#xff0c;多次达到SOTA效果。NLP领域中&#xff0c;我们所熟知的BERT和GPT就是从Transformer中衍生出来的预训练…

使用Ollama在本地运行AI大模型gemma

1.下载&#xff1a; https://github.com/ollama/ollama/releases 2.配置环境变量 我的电脑-右键-属性-系统-高级系统设置-环境变量-【系统环境变量】新建 变量名&#xff1a;OLLAMA_MODELS &#xff08;固定变量名&#xff09; 变量值&#xff1a;E:\Ollama\Lib &#xff0…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

express里面的鉴权及express-session中间件的使用总结

了解 HTTP 协议的无状态性是进一步学习 Session 认证机制的必要前提。http 协议的无状态性&#xff0c;指的是客户端的每次 http 请求都是独立的&#xff0c;连续多个请求之间没有直接的关系&#xff0c;服务器不会主动保留每次 http 请求的状态。 什么是 Cookie Cookie 是存储…

如何在CentOS安装Nexus容器无公网IP远程管理本地仓库

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

LeetCode-394. 字符串解码【栈 递归 字符串】

LeetCode-394. 字符串解码【栈 递归 字符串】 题目描述&#xff1a;解题思路一&#xff1a;辅助栈法解题思路二&#xff1a;递归法解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]…

ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录

文章目录 截图1.在开发者网站的app id中添加Sign in with Apple功能2.在Xcode中添加Sign in with Apple功能3.代码&#xff1a;只有第一次登录的时候可以获取到用户名参考博客chatGPT答案 截图 1.在开发者网站的app id中添加Sign in with Apple功能 1.1 如果你新建app id,记得在…

Spring事务简介,事务角色,事务属性

1.Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据操作同成功同失败 public interface PlatformTransactionManager{void commit(TransactionStatus status) throws TransactionE…

plasmo开发浏览器插件动态setIcon修改插件图标和setBadgeText显示徽标

动态修改图标和设置徽标主要用到action这个api&#xff0c;官网地址&#xff1a;https://developer.chrome.com/docs/extensions/reference/api/action?hlzh-cn#method-setIcon 如果你使用官方原生的方式开发&#xff0c;加载和修改图标应该是比较简单的&#xff0c;但是如果…