Python网页爬虫入门指南:从零开始抓取数据

在当今数据驱动的时代,网络爬虫已成为获取公开信息的重要工具。Python凭借其丰富的库和简洁的语法,成为编写网络爬虫的首选语言。本文将详细介绍如何使用Python编写一个基础的网页爬虫。

什么是网页爬虫?

网页爬虫是一种自动化程序,能够模拟人类浏览网页的行为,从网站上提取所需信息。它可以自动访问网页,解析HTML内容,并提取结构化数据。常见的应用场景包括价格监控、新闻聚合、搜索引擎索引等。

爬虫的基本工作原理

网络爬虫的工作流程通常包括以下几个核心步骤:发送HTTP请求获取网页内容、解析HTML文档、提取目标数据、存储处理结果。Python中有多个库可以简化这些操作,其中最常用的是requests和BeautifulSoup组合。

环境准备

开始编写爬虫前,需要安装必要的Python库。建议使用Python 3.6或更高版本,并通过pip安装以下包:

pip install requests beautifulsoup4

requests库用于发送HTTP请求,BeautifulSoup4用于解析HTML文档。这两个库组合起来可以处理大多数简单的爬虫任务。

编写第一个爬虫程序

以下是一个基础的爬虫示例,用于从示例网站提取文章标题:

import requests
from bs4 import BeautifulSoupurl = "http://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')titles = soup.find_all('h2')
for title in titles:print(title.get_text())

这个简单爬虫首先发送GET请求获取网页内容,然后使用BeautifulSoup解析HTML,最后提取所有h2标签的文本内容。

处理更复杂的网页结构

实际网站通常具有更复杂的结构。下面是一个更完整的示例,演示如何提取文章的标题、内容和发布时间:

import requests
from bs4 import BeautifulSoupdef scrape_article(url):response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')article = {'title': soup.find('h1').get_text(),'content': soup.find('div', class_='article-content').get_text(),'date': soup.find('span', class_='publish-date').get_text()}return articlearticle_url = "http://example.com/article"
article_data = scrape_article(article_url)
print(article_data)

处理分页内容

许多网站将内容分布在多个页面上。以下代码展示如何遍历分页内容:

base_url = "http://example.com/articles?page="for page in range(1, 6):  # 假设有5页url = base_url + str(page)response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')articles = soup.find_all('div', class_='article')for article in articles:title = article.find('h3').get_text()print(f"Page {page}: {title}")

遵守robots.txt

在编写爬虫时,必须尊重网站的robots.txt文件。这个文件规定了哪些页面允许爬取。可以使用robotparser模块来检查:

from urllib import robotparserrp = robotparser.RobotFileParser()
rp.set_url("http://example.com/robots.txt")
rp.read()if rp.can_fetch("*", "http://example.com/some-page"):# 允许爬取
else:# 不允许爬取

设置请求头

许多网站会检查请求头来判断访问者是否为真实用户。可以设置合理的请求头来模拟浏览器访问:

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'
}response = requests.get(url, headers=headers)

处理动态加载内容

对于使用JavaScript动态加载内容的网站,简单的requests库可能无法获取完整内容。这时可以使用selenium:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get("http://example.com")# 等待动态内容加载
dynamic_content = driver.find_element_by_class_name('dynamic-content')
print(dynamic_content.text)driver.quit()

数据存储

爬取的数据通常需要存储起来供后续分析。可以将数据保存为CSV文件:

import csvdata = [['Title', 'URL'], ['Example', 'http://example.com']]with open('output.csv', 'w', newline='') as file:writer = csv.writer(file)writer.writerows(data)

异常处理

网络请求可能会遇到各种问题,良好的异常处理是关键:

try:response = requests.get(url, timeout=5)response.raise_for_status()
except requests.exceptions.RequestException as e:print(f"Error fetching {url}: {e}")

遵守法律法规

在编写爬虫时,必须注意遵守相关法律法规和网站的使用条款。避免对服务器造成过大负担,设置合理的请求间隔:

import timetime.sleep(1)  # 每次请求间隔1秒

完整示例代码

以下是一个完整的网页爬虫示例,包含上述所有最佳实践:

import requests
from bs4 import BeautifulSoup
import time
import csv
from urllib import robotparser# 检查robots.txt
rp = robotparser.RobotFileParser()
rp.set_url("https://example.com/robots.txt")
rp.read()if not rp.can_fetch("*", "https://example.com"):print("Not allowed to crawl this site according to robots.txt")exit()# 设置请求头
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'
}def scrape_page(url):try:response = requests.get(url, headers=headers, timeout=5)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')articles = soup.find_all('article')data = []for article in articles:title = article.find('h2').get_text().strip()link = article.find('a')['href']summary = article.find('p').get_text().strip()data.append([title, link, summary])return dataexcept requests.exceptions.RequestException as e:print(f"Error scraping {url}: {e}")return []def main():base_url = "https://example.com/blog?page="all_data = [['Title', 'URL', 'Summary']]for page in range(1, 6):  # 假设爬取5页url = base_url + str(page)print(f"Scraping page {page}...")page_data = scrape_page(url)if page_data:all_data.extend(page_data)time.sleep(1)  # 礼貌爬取# 保存数据with open('blog_data.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(all_data)print("Scraping completed. Data saved to blog_data.csv")if __name__ == "__main__":main()

进阶技巧

随着爬虫需求的复杂化,可能需要掌握以下进阶技术:

  1. 使用代理IP池防止被封禁
  2. 处理登录和会话保持
  3. 解析JavaScript渲染的内容
  4. 使用Scrapy框架构建大型爬虫项目
  5. 分布式爬虫设计

注意事项

  1. 尊重网站的robots.txt规则
  2. 设置合理的请求频率,避免给服务器造成过大负担
  3. 注意版权问题,不随意传播爬取的数据
  4. 不要爬取敏感或个人隐私信息
  5. 遵守目标网站的服务条款

总结

本文介绍了Python编写网页爬虫的基础知识和实践技巧。从简单的页面抓取到处理复杂结构,从基本请求到异常处理,涵盖了爬虫开发的多个方面。记住,强大的爬虫能力伴随着责任,使用时务必遵守法律法规和道德准则。

通过不断实践和探索,可以逐步掌握更高级的爬虫技术,构建更强大、更稳定的数据采集系统。

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

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

相关文章

客服Agent革命:智能客服系统的技术实现与效果评估

客服Agent革命:智能客服系统的技术实现与效果评估 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是我…

C++-红黑树

1、红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍,…

在Python中避免使用`None`表示特殊情况:函数返回值与异常处理的最佳实践 (Effective Python 第20条)

在Python编程中,函数的设计与实现直接影响代码的可读性、可维护性和健壮性。一个常见的问题是如何处理函数的返回值,尤其是在需要表示某种特殊或异常情况时。许多开发者习惯性地使用None来表示这些特殊情况,但这种方法往往会导致意想不到的错…

从反射到方法句柄:深入探索Java动态编程的终极解决方案

🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河; 🛠️ 每一个算法都是我绘制…

算法_python_学习记录_01

人心的成见是一座大山。一旦有山挡在面前,则很难到达下一站。所需要做的,是穿过这座山。 偶然间看了一个视频,说的是EMASMA的自动交易策略,这个视频做的很用心,在入场的时间不仅要看EMA的金叉,还需要看其他…

机器翻译中的语言学基础详解(包括包括语法、句法和语义学等)

文章目录一、语法(Grammar):语言规则的底层框架1.1 传统语法理论的应用1.2 生成语法(Generative Grammar)1.3 依存语法(Dependency Grammar)二、句法(Syntax)&#xff1a…

MQTT:Dashboard访问授权

目录一、认证1.1 创建认证器1.2 多认证器二、授权2.1 ACL文件授权配置2.2 使用内置数据库授权配置一、认证 认证:就是验证客户端的身份。 1.1 创建认证器 选择认证方式配置数据源配置数据源的相关参数 认证器创建之后,在使用客户端连接Dashboard时&am…

Serper注册无反应

google邮箱才行,163邮箱注册无反应,其他邮箱没试过 在尝试websailor系列的时候,需要注册serper,获取Google Search Key serper.dev/dashboard

聊聊经常用的微服务

聊聊微服务 架构演变 单体架构: All in One,所有的功能模块都在一个工程里。 SOA架构: 这个架构当不当正不正,对于现在来说,有点老,甚至需要ESB,WebService之类的,基本不会使用了。…

第十四届蓝桥杯青少年组省赛 编程题真题题解

明天我就要考蓝桥杯省赛了,本蒟蒻已瑟瑟发抖,所以现在写一篇文章。 题目分别为: 1.​​​​​​B4270 [蓝桥杯青少年组省赛 2023] 特殊运算符 2.B4271 [蓝桥杯青少年组省赛 2023] 四叶玫瑰数 3.B4272 [蓝桥杯青少年组省赛 2023] 质因数的…

HTML全景效果实现

我将为您创建一个精美的360度全景效果页面,使用Three.js库实现沉浸式全景体验,并提供用户友好的控制界面,完整代码看文章末尾。 设计思路 使用Three.js创建全景球体 添加控制面板用于切换不同场景 实现自动旋转和手动控制选项 添加加载状…

Python 属性描述符(描述符用法建议)

描述符用法建议 下面根据刚刚论述的描述符特征给出一些实用的结论。 使用特性以保持简单 内置的 property 类创建的其实是覆盖型描述符,__set__ 方法和 __get__ 方法都实现了,即便不定义设值方法也是如此。特性的 __set__ 方法默认抛出 AttributeError: …

Milvus 向量数据库内存使用相关了解

1、支持 MMap 的数据存储在 Milvus 中,内存映射文件允许将文件内容直接映射到内存中。这一功能提高了内存效率,尤其是在可用内存稀缺但完全加载数据不可行的情况下。这种优化机制可以增加数据容量,同时在一定限度内确保性能;但当数…

C++编程之旅-- -- --默认成员函数(全详解)

目录前言构造函数构造函数形式:构造函数的特性:explicit关键字析构函数析构函数的概念析构函数的特性含有类类型的成员变量的类析构函数的调用拷贝构造函数拷贝构造函数的概念拷贝构造函数的特性浅拷贝和深拷贝:拷贝构造函数典型调用场景&…

Linux网络编程:TCP的远程多线程命令执行

目录 前言: 一、前文补充 二、服务端的修改 三、Command类的新增 前言: 好久不见,最近忙于其他事情,就耽误了咱们的Linux的网络部分的学习。 今天咱们先来给之前所学的TCP的部分进行一个首尾工作,主要是给大家介绍…

重学React(三):状态管理

背景: 继续跟着官网的流程往后学,之前已经整理了描述UI以及添加交互两个模块,总体来说还是收获不小的,至少我一个表面上用了四五年React的前端小卡拉米对React的使用都有了新的认知。接下来就到了状态管理(React特地加…

java web项目入门了解

目录一、项目流程1. 使用servle2. 使用框架二、了解java web项目构造1. 项目目录结构2. 查看页面访问顺序3. 发起请求:jqueryajax4. 接受参数5. JSONJSON 数组三、get和post请求区别一、项目流程 1. 使用servle 有客户端和服务端,客户端和服务端进行交…

网络资源模板--基于Android Studio 实现的日记本App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情(部分) 创建修改页面 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载也可…

GO的启动流程(GMP模型/内存)

目录第一部分:程序编译第二部分:函数解读1)Golang 核心初始化过程2)创建第一个协程3)启动系统调度4)跳转main函数5)总结第三部分:GMP模型Goroutine流程解读第四部分:内存…

OLTP与OLAP:实时处理与深度分析的较量

OLTP(Online Transaction Processing)定义:OLTP 系统主要用于管理事务性应用程序的数据。这类系统需要支持大量的短时、快速的交互式事务,比如银行交易、在线购物订单等。特点:实时处理:OLTP 系统要求对数据…