Python网络爬虫与数据采集实战——网络爬虫的基本流程

网络爬虫(Web Scraper)是用于自动化地从互联网上抓取信息的程序。它广泛应用于搜索引擎、数据采集、市场分析等领域。本文将详细探讨网络爬虫的基本流程,包括URL提取、HTTP请求与响应、数据解析与存储,以及一个实际的爬虫示例。文章不仅关注基础概念,更会深入到实际开发中遇到的技术难点和最新的技术解决方案。

1. URL提取

URL提取是网络爬虫中最基础的步骤之一,爬虫首先需要从目标网站中提取出需要抓取的URL。这一过程通常可以通过两种方式进行:静态URL提取和动态URL提取。

1.1 静态URL提取

静态页面的URL提取主要依靠HTML页面中<a>标签的href属性。例如,我们可以使用正则表达式或HTML解析器从网页源代码中提取出所有链接。

import re
import requests# 获取网页内容
response = requests.get('https://example.com')
html_content = response.text# 使用正则表达式提取URL
urls = re.findall(r'href=["'](https?://[^s'"]+)', html_content)
print(urls)
1.2 动态URL提取

对于一些通过JavaScript动态加载的页面,直接提取HTML中的URL可能不奏效。在这种情况下,我们可以使用Selenium或Playwright等工具来模拟浏览器操作,加载JavaScript动态生成的页面,并提取其中的URL。

from selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://example.com')
# 等待页面加载完成
driver.implicitly_wait(10)# 获取页面中的所有链接
links = driver.find_elements_by_tag_name('a')
urls = [link.get_attribute('href') for link in links]
print(urls)

通过这种方式,我们能够提取动态生成的URL,但同时也需要考虑性能和效率问题,因为模拟浏览器的方式相对较慢。

2. HTTP请求与响应

一旦我们提取到URL,就需要向目标服务器发送HTTP请求并获取响应数据。通常,我们使用Python的requests库来发送GET或POST请求,并处理返回的HTTP响应。

2.1 HTTP请求

在发送HTTP请求时,我们可以通过自定义请求头、代理、超时等参数来模拟浏览器行为,以避免被反爬虫机制检测到。

import requestsurl = 'https://example.com'
headers = {'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','Accept-Language': 'en-US,en;q=0.9'
}
response = requests.get(url, headers=headers, timeout=10)
2.2 HTTP响应

一旦请求成功,服务器会返回一个HTTP响应。我们需要解析响应中的数据。requests库提供了响应对象response,其主要属性包括status_code(响应状态码)、text(响应内容)、json()(如果响应为JSON格式)等。

# 检查响应状态码
if response.status_code == 200:print("Request successful")
else:print(f"Request failed with status code {response.status_code}")# 获取网页内容
html_content = response.text

对于一些动态生成的页面,响应内容可能是JSON格式或JavaScript文件,通常需要进一步解析才能提取出所需的信息。

2.3 异常处理与重试机制

在实际开发中,网络请求可能因为网络波动、服务器异常等问题失败。因此,合理的异常处理和重试机制非常重要。

import timedef fetch_url(url):try:response = requests.get(url, headers=headers, timeout=10)response.raise_for_status()  # 如果响应码不是200,会抛出异常return responseexcept requests.RequestException as e:print(f"Error fetching {url}: {e}")time.sleep(5)  # 等待一段时间再尝试return fetch_url(url)response = fetch_url('https://example.com')
3. 数据解析与存储

数据解析和存储是网络爬虫中最关键的部分。我们需要从HTML页面中提取有用的信息,通常这些信息以文本、表格或列表等形式呈现。

3.1 数据解析

HTML页面的解析一般使用专门的库,比如BeautifulSouplxmlPyQuery等。BeautifulSoup是最常用的库,它提供了简单易用的接口来查找和筛选HTML元素。

from bs4 import BeautifulSoupsoup = BeautifulSoup(html_content, 'html.parser')# 提取所有的标题
titles = soup.find_all('h1')
for title in titles:print(title.get_text())# 提取链接
links = soup.find_all('a', href=True)
for link in links:print(link['href'])

对于结构化的数据(如表格、列表等),可以通过CSS选择器或XPath精确定位。

3.2 数据存储

爬取的数据需要存储到数据库或文件中。常见的存储方式有:

  • CSV/JSON文件:适用于小规模的数据存储。

  • 数据库:对于大规模、高频次的数据存储,推荐使用关系型数据库(如MySQL、PostgreSQL)或NoSQL数据库(如MongoDB)。

    import json

    存储数据到JSON文件

    data = {‘title’: ‘Example Title’, ‘url’: ‘https://example.com’}
    with open(‘data.json’, ‘w’) as f:
    json.dump(data, f)

对于大规模数据,使用数据库能够更好地管理和查询数据。

import sqlite3conn = sqlite3.connect('scraper.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS pages (title TEXT, url TEXT)''')# 插入数据
cursor.execute('INSERT INTO pages (title, url) VALUES (?, ?)', ('Example Title', 'https://example.com'))
conn.commit()
conn.close()
3.3 数据清洗

在数据存储之前,可能需要对数据进行清洗。比如,去除重复数据、处理缺失值等。对于Web抓取的数据,通常会遇到HTML编码问题、异常字符、重复页面等情况。

# 去除多余的空格和换行符
title = title.strip()# 处理HTML实体编码
import html
title = html.unescape(title)
4. 爬虫示例

下面我们将构建一个简单的爬虫示例,演示如何结合上述步骤提取网页中的文章标题和链接,并存储到SQLite数据库中。

import requests
from bs4 import BeautifulSoup
import sqlite3
import time# 创建SQLite数据库
conn = sqlite3.connect('scraper.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS articles (title TEXT, url TEXT)''')# 爬虫主体函数
def scrape_articles(base_url):response = requests.get(base_url)if response.status_code != 200:print(f"Failed to retrieve {base_url}")returnsoup = BeautifulSoup(response.text, 'html.parser')# 提取文章标题和链接articles = soup.find_all('a', class_='article-link')for article in articles:title = article.get_text(strip=True)url = article['href']print(f"Found article: {title} - {url}")# 将数据存储到数据库cursor.execute('INSERT INTO articles (title, url) VALUES (?, ?)', (title, url))conn.commit()# 示例:抓取一个网站的文章链接
scrape_articles('https://example.com/articles')# 关闭数据库连接
conn.close()
总结

网络爬虫的开发不仅仅是抓取网页内容,还涉及到诸如请求优化、数据解析、异常处理、数据存储等方面的技术。通过合理的URL提取、有效的HTTP请求、精确的数据解析与存储策略,开发者能够构建出功能强大且高效的网络爬虫系统。在实际开发中,遵循这些基本流程并结合最新的技术解决方案,将极大提升爬虫的可行性和实用性。

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

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

相关文章

1.3 双指针专题:快乐数(medium)

1.题目链接 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/submissions/609206400/ 2.题目描述 编写⼀个算法来判断⼀个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于⼀个正整数&#xff0c;每⼀次将该数替换…

系统结构知识点

1.主存和辅存以页面交换数据 2.计算机系统硬件固体软件 3.计算机系统结构概念的实质是确定计算机系统中软&#xff0c;硬件的界面&#xff0c;界面之上是软件实现的功能&#xff0c;界面之下是硬件和固体实现的功能 4.计算机组成是指计算机系统结构的逻辑实现。计算机实现是…

STM32 HAL库 CAN过滤器配置

之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法&#xff0c;当时由于并没有使用过滤器的现实需求&#xff0c;所以就也没仔细研究。现在工作中确实需要用到过滤器了&#xff0c;有些项目中控制器和发动机E…

飞搭系列|数据迁移功能全新升级,助力用户实现高效无缝迁移!

前言 飞搭低代码平台&#xff08;FeiDa&#xff0c;以下简称“飞搭”&#xff09;&#xff0c;为企业提供在线化、灵活的业务应用构建工具&#xff0c;支持高低代码融合&#xff0c;助力企业低门槛、高效率和低成本地快速应对市场变化&#xff0c;加速复杂业务场景落地。 在之…

【后端】【ubuntu】 ubuntu目录权限查看的几种方法

在Ubuntu中&#xff0c;有多种方式可以查看目录或文件的权限&#xff0c;以下为你详细介绍常见的指令及其使用方法&#xff1a; 1. ls -l 命令 这是最常用的查看文件和目录权限的命令&#xff0c;-l 选项用于以长格式列出文件和目录的详细信息&#xff0c;其中就包含权限信息…

深度学习与大模型基础-向量

大家好&#xff01;今天我们来聊聊向量&#xff08;Vector&#xff09;。别被这个词吓到&#xff0c;其实向量在我们的生活中无处不在&#xff0c;只是我们没注意罢了。 1. 向量是什么&#xff1f; 简单来说&#xff0c;向量就是有大小和方向的量。比如你从家走到学校&#x…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…

用Python和Docker-py打造高效容器化应用管理利器

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的发展,Docker已成为现代化应用部署的核心工具。然而,手动管理容器在规模化场景下效率低下。本文深入探讨如何利用Python结…

【RabbitMQ】事务

事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的&#xff0c;该协议实现了事务机制&#xff0c;因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的&#xff0c…

在 IntelliJ IDEA 中配置 Git

1. 确保已安装 Git 在配置之前&#xff0c;确保你的系统已经安装了 Git。 检查是否已安装 Git&#xff1a; bash 复制 git --version 如果未安装&#xff0c;请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置&#xff1a; Windo…

【A2DP】蓝牙A2DP协议剖析:从架构到规范

目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义&#xff08;Configurations and roles &#xff09; 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…

【从零开始学习计算机科学】操作系统(五)处理器调度

【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…

27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 组件介绍2. 效果展示3. 禁用状态设置3.1 整体禁用3.2 输入框禁用3.3 长按禁用 4. 完整示例代码5. 知识点讲解5.1 禁用状态属性5.2 禁用…

Shardingsphere-jdbc 自定义脱敏规则

添加邮件脱敏规则&#xff1a; // 123123123qq.com&#xff0c;将前4个字符脱敏 12312****qq.com 代码重写MaskAlgorithm相关方法&#xff1a; /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE…

大模型在甲状腺良性肿瘤诊疗全流程中的应用研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义与价值 二、甲状腺良性肿瘤概述 2.1 疾病介绍 2.2 流行病学特征 2.3 传统诊疗方法综述 三、大模型技术原理及应用优势 3.1 大模型技术简介 3.2 在医疗领域的应用进展 3.3 针对甲状腺良性肿瘤的应用优势 四、大模型在…

软件IIC和硬件IIC的主要区别,用标准库举例!

学习交流792125321&#xff0c;欢迎一起加入讨论&#xff01; 在学习iic的时候&#xff0c;我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢&#xff1f; 软件 IC&#xff08;模拟 IC&#xff09;和硬件 IC&#xff08;外设 IC&#xff09;是两种实现 IC 总线通信的方式…

店匠科技携手 PayPal 升级支付体验,助力独立站商家实现全球增长

在全球化电商竞争加剧的背景下,独立站为无数商户插上了通向事业成功的翅膀。然而,搭建店铺框架容易,真正实现有效运营却充满挑战。只有当各个环节如齿轮般严丝合缝,独立站运营才能更好地助推行进,实现稳健增长。如今,独立站商家面临着全链路运营的多重挑战。从品牌塑造、营销推…

密码学 网络安全 科普 网络安全密码技术

网络加密包括密码技术和网络加密方法两个方面。 一、 密码技术   密码技术一般分为常规密码和公钥密码。   常规密码是指收信方和发信方使用相同的密钥&#xff0c;即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有DES及其各种变形、IDEA、FEAL、Skipjack…

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 or Set--lower_bound()的解法!!!

P8686 [蓝桥杯 2019 省 A] 修改数组--并查集 题目 并查集解析代码【并查集解】 Set 解法解析lower_bound代码 题目 并查集解析 首先先让所有的f&#xff08;i&#xff09;i&#xff0c;即每个人最开始的祖先都是自己&#xff0c;然后就每一次都让轮到那个数的父亲1&#xff08…

Anaconda中虚拟环境安装g++和gcc相同版本

安装torchSDF的时候遇到的&#xff0c;这是g和gcc版本不一致的问题 gcc: fatal error: cannot execute cc1plus: execvp: No such file or directory compilation terminated.查看gcc, g版本 gcc --version | head -n1 g --version | head -n1发现gcc的是anaconda中的&#x…