Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

Python 爬虫入门(一):从零开始学爬虫 「详细介绍」

  • 前言
    • 1.爬虫概念
      • 1.1 什么是爬虫?
      • 1.2 爬虫的工作原理
    • 2. HTTP 简述
      • 2.1 什么是 HTTP?
      • 2.2 HTTP 请求
      • 2.3 HTTP 响应
      • 2.4 常见的 HTTP 方法
    • 3. 网页的组成
      • 3.1 HTML
        • 3.1.1 HTML 基础结构
      • 3.2 CSS
        • 3.2.1 CSS 示例
      • 3.3 JavaScript
        • 3.3.1 JavaScript 示例
    • 4. 使用 Python 进行 Web 爬虫
      • 4.1 常用的 Python 库
      • 4.2 安装所需库
      • 4.3 编写一个简单的爬虫
        • 4.3.1 示例代码
      • 5. 处理复杂的网页
        • 5.1 使用 Playwright 示例
    • 6. 编写一个完整的爬虫项目
      • 6.1 项目要求
      • 6.2 项目步骤
        • 6.2.1 示例代码
      • 7. 特别注意事项
      • 8. robots.txt 文件是什么?
    • 总结

前言

警告声明:本文提供的信息和示例代码仅供学习和教育目的,请小伙伴们在遵守相关法律法规和网站政策的前提下使用。

1.爬虫概念

1.1 什么是爬虫?

网络爬虫,也称为网络蜘蛛、网络机器人,是一种自动化脚本或程序,用于自动浏览互联网并收集数据。

爬虫可以帮助我们从网页中提取信息,从而实现数据采集、信息检索、网站分析等功能。

1.2 爬虫的工作原理

在这里插入图片描述

  1. 发送请求:爬虫向目标网站发送 HTTP 请求。
  2. 获取响应:目标网站返回 HTTP 响应,包含请求的网页内容。
  3. 解析数据:爬虫解析网页内容,提取所需数据。
  4. 存储数据:将提取的数据存储在本地或数据库中。

2. HTTP 简述

2.1 什么是 HTTP?

HTTP(HyperText Transfer Protocol):是用于在 Web 浏览器和 Web 服务器之间传递信息的协议。它是一种基于请求-响应模式的协议,客户端发送请求,服务器返回响应。
在这里插入图片描述

2.2 HTTP 请求

HTTP 请求由以下几个部分组成:

  1. 请求行:包括请求方法(如 GET、POST)、请求 URL 和 HTTP 版本。
  2. 请求头:包含有关客户端环境的信息和请求体的元数据。
  3. 请求体:在 POST 请求中,包含要发送到服务器的数据。

2.3 HTTP 响应

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

  1. 状态行:包括 HTTP 版本、状态码和状态描述。
  2. 响应头:包含有关服务器环境的信息和响应体的元数据。
  3. 响应体:包含实际的响应内容,如 HTML 文档、图像或其他数据。

2.4 常见的 HTTP 方法

  • GET:请求指定的资源。一般用于请求数据。
  • POST:向指定的资源提交数据进行处理。
  • PUT:向指定资源位置上传最新内容。
  • DELETE:请求删除指定的资源。
  • HEAD:类似于 GET,但只返回响应头,不返回响应体。

3. 网页的组成

一个典型的网页由以下几个部分组成:
在这里插入图片描述

3.1 HTML

HTML(HyperText Markup Language):是用于创建和结构化网页内容的标准标记语言。HTML 使用标签来标记不同类型的内容,如文本、图像、链接等。

3.1.1 HTML 基础结构
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><h1>Hello, World!</h1><p>Welcome to my website.</p>
</body>
</html>

3.2 CSS

CSS(Cascading Style Sheets):是一种样式表语言,用于描述 HTML 文档的外观和格式。CSS 可以控制网页的布局、颜色、字体等。

3.2.1 CSS 示例
body {font-family: Arial, sans-serif;
}h1 {color: blue;
}p {font-size: 16px;
}

3.3 JavaScript

JavaScript :是一种高效的编程语言,通常用于网页开发,可以使网页具有动态交互功能。JavaScript 可以操作 HTML 和 CSS,响应用户事件,创建动态效果等。

3.3.1 JavaScript 示例
document.addEventListener('DOMContentLoaded', function() {const button = document.getElementById('myButton');button.addEventListener('click', function() {alert('Button clicked!');});
});

4. 使用 Python 进行 Web 爬虫

4.1 常用的 Python 库

  • requests:用于发送 HTTP 请求。
  • BeautifulSoup:用于解析 HTML 和 XML 文档。
  • Scrapy:一个功能强大的爬虫框架。
  • Playwright:用于模拟浏览器操作,支持多种浏览器。

4.2 安装所需库

使用 pip 安装下列库:

pip install requests 
pip install beautifulsoup4 
pip install scrapy 
pip install openpyxl 
pip install playwright
python -m playwright install

4.3 编写一个简单的爬虫

下面是一个使用 requests 编写的简单爬虫示例。

4.3.1 示例代码
import requests# 发送请求
url = 'https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total'
response = requests.get(url)
# 解析JSON数据
data = response.json()if 'data' in data:# 遍历数据for item in data['data']:if 'target' in item and 'title' in item['target']:print(item['target']['title'])
else:print("没有获取到数据")

执行结果如下:
在这里插入图片描述

5. 处理复杂的网页

对于一些动态加载内容的网页,仅靠 requests 和 BeautifulSoup 可能无法获取所有数据。这时可以使用 Playwright 模拟浏览器操作。

5.1 使用 Playwright 示例
import asyncio
from bs4 import BeautifulSoup
from playwright.async_api import async_playwrightasync def run(playwright: async_playwright) -> None:browser = await playwright.chromium.launch(headless=False)context = await browser.new_context()page = await context.new_page()# 访问网页await page.goto('https://nba.hupu.com/')# 获取页面内容content = await page.content()# 解析 HTML(同样使用 BeautifulSoup)soup = BeautifulSoup(content, 'html.parser')# 提取页面标题title = soup.title.stringprint('Title:', title)# 提取推荐文章的标题及链接links = await page.locator('.list-recommend a, .list-container a').all()for link in links:title = await link.inner_text()href = await link.get_attribute('href')print(title, href)# 关闭浏览器和上下文await context.close()await browser.close()# 异步运行函数
async def main():async with async_playwright() as playwright:await run(playwright)# 运行主函数
asyncio.run(main())

在这里插入图片描述

6. 编写一个完整的爬虫项目

下面,我们将编写一个完整的爬虫项目,从一个网站中提取数据并保存到本地文件。

6.1 项目要求

  1. 从一个演出票务网站中提取演出信息;
  2. 将演出数据保存到 Excel 文件中。

6.2 项目步骤

  1. 发送请求并获取响应
  2. 解析响应内容
  3. 创建 Excel 工作簿、Sheet
  4. 将遍历数据保存到 Excel 文件
6.2.1 示例代码

下面是一个使用 requests 和 BeautifulSoup 编写的爬虫示例。

import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
from pathlib import Pathdef showStart(city_code):# 发送请求获取网页内容url = f'https://www.showstart.com/event/list?pageNo=1&pageSize=99999&cityCode={city_code}'response = requests.get(url)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')items = soup.find_all('a', class_='show-item item')# 创建Excel工作簿wb = Workbook()sheet = wb.active# 添加标题行sheet.append(['标题', '艺人', '价格', '时间', '地址', '链接'])for item in items:title = item.find('div', class_='title').text.strip()artist = item.find('div', class_='artist').text.strip()price = item.find('div', class_='price').text.strip()time = item.find('div', class_='time').text.strip()addr = item.find('div', class_='addr').text.strip()href = 'https://www.showstart.com' + item['href']# 将数据写入Excelsheet.append([title, artist, price, time, addr, href])# 保存Excel文件root_dir = Path(__file__).resolve().parentfile_path = root_dir / f'showstart_{city_code}.xlsx'wb.save(file_path)print(f'数据已保存到 {file_path}')else:print(f'请求失败,状态码:{response.status_code}')if __name__ == "__main__":city_code = input("请输入城市编码:")showStart(city_code)

打开Excel 文件,内容如下:
在这里插入图片描述

7. 特别注意事项

  • 尊重网站的 robots.txt 文件:大多数网站都有一个 robots.txt 文件,规定了爬虫的访问规则。请遵守这些规则,以避免对网站造成负担。
  • 设置适当的延迟:在发送大量请求时,设置适当的延迟(如使用 time.sleep),以避免对目标网站造成压力。
  • 处理反爬虫措施:一些网站有反爬虫措施,如使用验证码或检测大量请求行为。可以使用代理、模拟浏览器行为等方式绕过这些措施。

8. robots.txt 文件是什么?

robots.txt 文件是一个文本文件,通常放置在网站的根目录下。

它用来告诉搜索引擎的爬虫(spider)哪些页面可以抓取,哪些页面不可以抓取。

要找到网站的 robots.txt 文件,在浏览器的地址栏输入以下格式的URL:

http://www.xxx.com/robots.txt

如果访问的是不带www的域名:

http://xxx.com/robots.txt

  • 这里的 xxx.com 替换成想要查找 robots.txt 的网站域名。如果该网站有 robots.txt 文件,将能够直接在浏览器中看到它的内容。如果不存在,可能会看到404错误页面或者其他错误信息。
  • 此外,有些网站可能会使用 robots.txt 文件来提供关于网站地图(sitemap)的信息,这可以帮助搜索引擎更快地发现和索引网站上的新内容。

总结

本文介绍了 Python 爬虫的基本概念、HTTP 基础知识以及网页的基本组成部分、如何使用 Python 编写简单的爬虫,以及如何处理动态加载内容的网页。希望这些内容对小伙伴们学习和编写 Python 爬虫有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【MATLAB源码-第238期】基于simulink的三输出单端反激flyback仿真,通过PWM和PID控制能够得到稳定电压。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 概述 反激变换器是一种广泛应用于电源管理的拓扑结构&#xff0c;特别是在需要隔离输入和输出的应用中。它的工作原理是利用变压器的储能和释放能量来实现电压转换和隔离。该图展示了一个通过脉宽调制&#xff08;PWM&#…

基于springboot+vue+uniapp的居民健康监测小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

虚拟机centos9搭建wordpress

目录 1. 更换yum源更新系统软件包&#xff1a; 1.1备份yum源 1.1.1创建备份目录&#xff1a; 1.1.2移动现有仓库配置文件到备份目录&#xff1a; 1.1.3验证备份&#xff1a; 1.2更换yum源 1.2.1添加yum源 1.2.2删除和建立yum缓存 1.3更新系统软件包 1.4 yum与dnf介绍…

谷粒商城实战笔记-62-商品服务-API-品牌管理-OSS整合测试

文章目录 一&#xff0c;Java中上传文件到阿里云OSS1&#xff0c;整合阿里云OSS2&#xff0c;测试上传文件 二&#xff0c;Java中整合阿里云OSS服务指南引言准备工作1. 注册阿里云账号2. 获取Access Key3. 添加依赖 实现OSS客户端1. 初始化OSSClient2. 创建Bucket3. 上传文件4.…

nginx的学习(二):负载均衡和动静分离

简介 nginx的负载均衡和动静分离的简单使用 负载均衡配置 外部访问linux的ip地址:80/edu/a.html地址&#xff0c;会轮询访问Tomcat8080和Tomcat8081服务。 Tomcat的准备 准备两个Tomcat&#xff0c;具体准备步骤在nginx的学习一的反向代理例子2中&#xff0c;在Tomcat8080…

告别繁琐地推!Xinstall如何一键优化你的App地推方案

在这个移动应用遍地开花的时代&#xff0c;App地推活动早已成为各大厂商获取新用户、提升品牌曝光度的重要手段。然而&#xff0c;传统地推方案中的种种弊端&#xff0c;如填写地推码/邀请码的繁琐、渠道打包的工作量繁重、人工登记上报的不准确等&#xff0c;无一不在拖慢地推…

【接口设计】学会用 RestTemplate 发请求

《接口设计》系列&#xff0c;共包含以下 5 篇文章&#xff1a; 前后端的通信方式 REST如何设计统一 RESTful 风格的数据接口为 APP、PC、H5 网页提供统一风格的 API&#xff08;实战篇&#xff0c;附源码地址&#xff09;用 Swagger 实现接口文档学会用 RestTemplate 发请求 …

【C++】选择结构案例-三目运算符

三目运算符语法格式&#xff1a; 布尔表达式?表达式1:表达式2 运算过程&#xff1a;如果布尔表达式的值为 true &#xff0c;则返回 表达式1 的值&#xff0c;否则返回 表达式2 的值 &#xff08;三目运算符指的是&#xff1f;和&#xff1a;&#xff09; 在这个三目运算符…

USB转多路串口-纯硬件实现串口数据传输指示灯电路

前言 串口相关产品往往要求有数据收发时LED闪烁&#xff0c;我们经常会用软件实现&#xff0c;在MCU内注册一个定时器&#xff0c;有数据发送时就闪烁一段时间。软件点灯这种方式存在两个缺陷&#xff0c;一是接收方向不好实现&#xff1b;二是定时器一般用固定频率&#xff0…

Redis的两种持久化方式---RDB、AOF

rdb其实就是一种快照持久化的方式&#xff0c;它会将Redis在某个时间点的所有的数据状态以二进制的方式保存到硬盘上的文件当中&#xff0c;它相对于aof文件会小很多&#xff0c;因为知识某个时间点的数据&#xff0c;当然&#xff0c;这就会导致它的实时性不够高&#xff0c;如…

Nature Electronics|柔性可吞服电子设备用于胃部电生理学监测(柔性健康监测/可吞服电子/柔性

美国麻省理工学院David H. Koch 综合癌症研究所的 Giovanni Traverso团队,在《Nature Electronics》上发布了一篇题为“An ingestible device for gastric electrophysiology”的论文。论文内容如下: 一、 摘要 从胃肠道和肠道神经系统记录高质量电生理数据的能力有助于了解…

信通院发布!首个大模型混合云标准

近日&#xff0c;中国信通院发布了首个大模型混合云标准&#xff0c;通过定位当前大模型混合云的能力水平&#xff0c;为基于混合云的大模型服务实践提供指引&#xff0c;并明确未来提升方向。同时&#xff0c;中国信通院基于标准展开大模型混合云能力成熟度专项测试&#xff0…

生信技能54 - WisecondorX多线程并行分析CNV

WisecondorX分析CNV,默认单样本分析,batch_analysis参数设置为True可启动多样本并行分析。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动化批量npz转换和reference构建 github: https://github.com/CenterForMedicalGe…

Windows 安装 PostgreSQL 并安装 vector 扩展

目录 前言 下载安装 pgAdmin 4 vector 扩展 前言 调研大模型时&#xff0c;了解到一些大模型的应用&#xff0c;其中一个就是知识库&#xff0c;用户可以上传文档到知识库中&#xff0c;系统解析文档并将内容向量化保存起来&#xff0c;以便在和模型交互时使用。 在和大模…

【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分&#xff1a;读锁&#xff0c;写锁 对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写&#xff0c;读-写操作或写-写操作这些情况可能会引起一些问题&#xff0c;需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时&#x…

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具&#xff0c;利用AI&#xff0c;将款选中的对象快速的提取选区&#xff0c;测试了一下&#xff0c;选区制作的非常nice快速选择工具 跟磁性套索类似&#xff0c;自动识别颜色相似…

如何快速抓取小红书帖子评论?两大实战Python技巧揭秘

摘要&#xff1a; 本文将深入探讨两种高效的Python方法&#xff0c;助您迅速获取小红书文章下方的所有评论&#xff0c;提升市场分析与用户洞察力。通过实战示例与详细解析&#xff0c;让您轻松掌握数据抓取技巧&#xff0c;为您的内容营销策略提供有力支持。 如何快速抓取小…

C++ | Leetcode C++题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; template <class T> class PeekingIterator : public Iterator<T> { public:PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {flag Iterator<T>::hasNext();if (flag) {nextElement Ite…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧&#xff0c; 可以实现同一个ShaderGraph&#xff0c;同一个Material材质球&#xff0c; 但使用不同的Texture贴图&#xff0c;而Sprite显示不会相互覆盖。 具体实现方法如下&#xff1a; 声明Texture2D时&#xff0c;把名字命名成&#xff1a…