Python网络爬虫基础指南

Python网络爬虫基础指南

网络爬虫(Web

Crawler)是一种自动化程序,用于遍历互联网上的网页并收集数据。Python因其强大的库支持和简洁的语法,成为开发网络爬虫的首选语言之一。本文将介绍如何使用Python编写一个简单的网络爬虫,涵盖从基本设置到数据提取的整个过程。

1. 环境准备

在开始之前,请确保你的系统上已经安装了Python。推荐使用Python 3.x版本。此外,还需要安装一些第三方库,如 requests 和 `

BeautifulSoup ` 。

bash复制代码

 pip install requests beautifulsoup4  
2. 基本爬虫结构

一个基本的网络爬虫通常包括以下几个步骤:

  1. 发送HTTP请求 :使用 requests 库向目标网站发送请求。
  2. 解析HTML内容 :使用 BeautifulSoup 解析HTML文档。
  3. 提取数据 :根据需求提取所需数据。
  4. 存储数据 :将提取的数据保存到文件或数据库中。
3. 示例代码

以下是一个简单的Python网络爬虫示例,用于爬取一个网页的标题和所有链接。

python复制代码

 import requests    
  
 from bs4 import BeautifulSoup    
     
 # 目标URL    
 url = 'https://example.com'    
     
 # 发送HTTP GET请求    
 response = requests.get(url)    
     
 # 检查请求是否成功    
 if response.status_code == 200:    
     # 解析HTML内容    
     soup = BeautifulSoup(response.content, 'html.parser')    
         
     # 提取网页标题    
     title = soup.title.string if soup.title else 'No Title'    
     print(f'Title: {title}')    
         
     # 提取所有链接    
     links = []    
     for link in soup.find_all('a', href=True):    
         href = link['href']    
         text = link.get_text()    
         links.append((href, text))    
         
     # 打印所有链接    
     for href, text in links:    
         print(f'Link: {href}, Text: {text}')    
 else:    
     print(f'Failed to retrieve the webpage. Status code: {response.status_code}')  
4. 处理相对链接和异常

在实际应用中,爬取的链接可能是相对链接,需要将其转换为绝对链接。此外,网络请求可能会遇到各种异常,如超时、连接错误等,需要进行适当的处理。

python复制代码

 from urllib.parse import urljoin    
  
     
 # 发送HTTP GET请求,并处理异常    
 try:    
     response = requests.get(url, timeout=10)    
     response.raise_for_status()  # 如果响应状态码不是200,则引发HTTPError异常    
 except requests.RequestException as e:    
     print(f'Error fetching the webpage: {e}')    
 else:    
     # 解析HTML内容    
     soup = BeautifulSoup(response.content, 'html.parser')    
         
     # 提取网页标题    
     title = soup.title.string if soup.title else 'No Title'    
     print(f'Title: {title}')    
         
     # 提取所有链接,并转换为绝对链接    
     base_url = response.url    
     links = []    
     for link in soup.find_all('a', href=True):    
         href = urljoin(base_url, link['href'])    
         text = link.get_text()    
         links.append((href, text))    
         
     # 打印所有链接    
     for href, text in links:    
         print(f'Link: {href}, Text: {text}')  
5. 遵守robots.txt协议和网站条款

在编写爬虫时,务必遵守目标网站的 robots.txt 协议和网站的使用条款。 robots.txt 文件通常位于网站的根目录(如 `

https://example.com/robots.txt ` ),定义了哪些路径允许或禁止爬虫访问。

6. 使用异步请求提升效率

对于需要爬取大量数据的任务,可以使用 aiohttp 等异步HTTP库来提升效率。异步请求允许在等待网络响应的同时执行其他任务,从而显著减少总耗时。

bash复制代码

 pip install aiohttp  

异步爬虫示例(简化版):

python复制代码

 import aiohttp    
  
 import asyncio    
 from bs4 import BeautifulSoup    
 from urllib.parse import urljoin    
     
 async def fetch(session, url):    
     async with session.get(url) as response:    
         return await response.text()    
     
 async def parse(content, base_url):    
     soup = BeautifulSoup(content, 'html.parser')    
     title = soup.title.string if soup.title else 'No Title'    
     links = [(urljoin(base_url, link['href']), link.get_text()) for link in soup.find_all('a', href=True)]    
     return title, links    
     
 async def main(url):    
     async with aiohttp.ClientSession() as session:    
         content = await fetch(session, url)    
         base_url = url  # 对于简单示例,假设base_url就是url本身    
         title, links = await parse(content, base_url)    
         print(f'Title: {title}')    
         for href, text in links:    
             print(f'Link: {href}, Text: {text}')    
     
 # 运行异步任务    
 loop = asyncio.get_event_loop()    
 loop.run_until_complete(main('https://example.com'))  
7. 总结

本文介绍了如何使用Python编写一个简单的网络爬虫,从基本结构到异常处理,再到异步请求。实际开发中,可能需要考虑更多因素,如防反爬虫机制、数据清洗与存储、多线程/多进程等。希望这篇文章能帮助你入门Python网络爬虫,并激发你进一步探索的兴趣。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群控系统服务端开发模式-应用开发-上传配置功能开发

下面直接进入上传配置功能开发,废话不多说。 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_upload (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,upload_type tinyint(1) UNSIGNED NOT NULL COMMENT 上传类型 1:本站 2&a…

HarmonyOS NEXT 应用开发实战(九、知乎日报项目详情页实现详细介绍)

在本篇博文中,我们将探讨如何使用 HarmonyOS Next 框架开发一个知乎日报的详情页,逐步介绍所用到的组件及代码实现。知乎日报是个小巧完整的小项目,这是一个循序渐进的过程,适合初学者和有一定开发经验的工程师参考。 1. 项目背景…

数据结构之链式结构二叉树的实现(初级版)

本文内容将主会多次用到函数递归知识&#xff01;&#xff01;&#xff01; 本节内容需要借助画图才能更好理解&#xff01;&#xff01;&#xff01; 和往常一样&#xff0c;还是创建三个文件 这是tree.h #pragma once #include<stdio.h> #include<stdlib.h> …

数据结构(Java)—— 认识泛型

1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 基本数据类型包装类byteByt…

LSTM模型改进实现多步预测未来30天销售额

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【BiLSTM模型实现电力数据预测】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…

使用带有令牌认证的 Jupyter Notebook 服务器

当你不想在默认浏览器打开Jupyter Notebook,但是在其他浏览器打开http://localhost:8890/lab或者http://localhost:8889/tree&#xff0c;却显示 Token authentication is enabled&#xff0c;如下图 可以按以下步骤操作&#xff1a; 获取令牌&#xff1a;在启动 Jupyter Note…

软考(中级-软件设计师)数据库篇(1101)

第6章 数据库系统基础知识 一、基本概念 1、数据库 数据库&#xff08;Database &#xff0c;DB&#xff09;是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储&#xff0c;具有较小的冗余度、较高的数据独立性和扩展…

【java】java的基本程序设计结构06-运算符

运算符 一、分类 算术运算符关系运算符位运算符逻辑运算符赋值运算符其他运算符 1.1 算术运算符 操作符描述例子加法 - 相加运算符两侧的值A B 等于 30-减法 - 左操作数减去右操作数A – B 等于 -10*乘法 - 相乘操作符两侧的值A * B等于200/除法 - 左操作数除以右操作数B /…

躺平成长-代码开发(07)-利用kimi帮助自己写代码

开源竞争&#xff1a; 开源竞争&#xff08;当你无法彻底掌握技术的时候&#xff0c;就去开源这个技术&#xff0c;让更多人了解这个技术&#xff0c;随着越来越多的人了解这个技术&#xff0c;就会培养出更多的技术依赖&#xff0c;让更多的人帮助你们完善你的技术依赖&#x…

基于javaweb(springboot+mybatis)网站建设服务管理系统设计和实现以及文档报告设计

基于javaweb(springbootmybatis)网站建设服务管理系统设计和实现以及文档报告设计 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取…

时间序列预测(十)——长短期记忆网络(LSTM)

目录 一、LSTM结构 二、LSTM 核心思想 三、LSTM分步演练 &#xff08;一&#xff09;初始化 1、权重和偏置初始化 2、初始细胞状态和隐藏状态初始化 &#xff08;二&#xff09;前向传播 1、遗忘门计算&#xff08;决定从上一时刻隐状态中丢弃多少信息&#xff09; 2、…

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一)

Sigrity Power SI 3D-EM Full Wave Extraction模式如何进行S参数提取和观测3D电磁场和远场操作指导(一) Sigrity Power SI的3D-EM Full Wave Extraction模式是Power SI的3D全波提取工具,相比于2D提取,3D全波提取的结果更为精确,且支持设置跨平面的port,也就是lump port,这…

rhce:web服务器

web服务器简介 服务器端&#xff1a;此处使用 nginx 提供 web 服务&#xff0c; RPM 包获取&#xff1a; http://nginx.org/packages/ /etc/nginx/ ├── conf.d #子配置文件目录 ├── default.d ├── fastcgi.conf ├── fastcgi.conf.default ├── fastcgi_params #用…

jenkins国内插件源

Jenkins是一个开源的持续集成和持续部署&#xff08;CI/CD&#xff09;工具, 可以大大减轻部署的工作量, 但是jenkins作为一个国外的软件, 在国内下载插件会很麻烦, 因此我们可以将其换为国内源 更换步骤 替换国内插件下载地址 以linux为例 首先, jenkins初始化完成之后不会…

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析 这是一篇发表在CVPR 2023的一篇论文&#xff0c;因为自己本身的研究方向是目标跟踪&#xff0c;之前看了一点使用扩散模型进行多跟踪的论文&#xff0c;里面提到了DiffusionDet因此学习一…

idea 配置tomcat 服务

选择tomcat的安装路径 选到bin的文件夹的上一层就行

opencv 图像预处理

图像预处理 ​ 在计算机视觉和图像处理领域&#xff0c;图像预处理是一个重要的步骤&#xff0c;它能够提高后续处理&#xff08;如特征提取、目标检测等&#xff09;的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法&#xff0c;以下是一些常见的图像预处理操作&…

初始JavaEE篇——多线程(4):wait、notify,饿汉模式,懒汉模式,指令重排序

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 wait、notify 方法 多线程练习 单例模式 饿汉模式 懒汉模式 指令重排序 wait、notify 方法 wait 和 我们前面学习的sleep…

新工具可绕过 Google Chrome 的新 Cookie 加密系统

一位研究人员发布了一款工具&#xff0c;用于绕过 Google 新推出的 App-Bound 加密 cookie 盗窃防御措施并从 Chrome 网络浏览器中提取已保存的凭据。 这款工具名为“Chrome-App-Bound-Encryption-Decryption”&#xff0c;由网络安全研究员亚历山大哈格纳 (Alexander Hagenah…

JavaSE笔记4】API、包、String类、Object类

目录 一、API 二、包 2.导入不同包下的同名程序 三、String 1. String类是什么&#xff1f; 2. 如何创建String对象?(常用的四种方法&#xff09; 3. String API a. 遍历字符串 b. 判断字符串内容是否相等&#xff1a; c. 截取子串 d. 替换部分内容 e. 匹配子串 f. 匹配开头字…