Python基础12-爬虫抓取网页内容

在本文中,我们将学习如何使用 Python 的 requestsBeautifulSoup 库进行网页抓取。我们将从基本的网页请求开始,逐步扩展到更高级的主题,如处理分页、AJAX 请求、正则表达式和异步抓取。

1. 使用 requests 获取网页

要检索网页的内容,我们可以使用 requests 库。以下是一个简单的示例:

python 复制代码
import requests

url = 'https://example.com'
response = requests.get(url)
html = response.text

2. 使用 BeautifulSoup 解析 HTML

要解析 HTML 并提取数据,我们可以使用 BeautifulSoup 库。以下是一个简单的示例:

python 复制代码
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'html.parser')
print(soup.prettify())  # 美观地打印 HTML

3. HTML 树导航

要使用标签查找元素,我们可以使用 BeautifulSoup 的方法。以下是一个简单的示例:

python 复制代码
title = soup.title.text  # 获取页面标题
headings = soup.find_all('h1')  # 列出所有 <h1> 标签

4. 使用 CSS 选择器

要使用 CSS 选择器选择元素,我们可以使用 BeautifulSoupselect 方法。以下是一个简单的示例:

python 复制代码
articles = soup.select('div.article')  # 所有具有类 'article' 的 <div> 元素

5. 从标签中提取数据

要从 HTML 元素中提取文本和属性,我们可以使用 BeautifulSoup 的方法。以下是一个简单的示例:

python 复制代码
for article in articles:
    title = article.h2.text  # 获取 <h2> 标签内的文本
    link = article.a['href']  # 获取 <a> 标签的 'href' 属性
    print(title, link)

6. 处理相对 URL

要将相对 URL 转换为绝对 URL,我们可以使用 urllib.parse 库的 urljoin 函数。以下是一个简单的示例:

python 复制代码
from urllib.parse import urljoin

absolute_urls = [urljoin(url, link) for link in relative_urls]

7. 处理分页

要跨多个页面抓取内容,我们可以使用循环。以下是一个简单的示例:

python 复制代码
base_url = "https://example.com/page/"
for page in range(1, 6):  # 对 5 个页面进行循环
    page_url = base_url + str(page)
    response = requests.get(page_url)
    # 处理每个页面的内容

8. 处理 AJAX 请求

要抓取 AJAX 请求加载的数据,我们可以找到 AJAX 请求的 URL(使用浏览器的开发者工具)并获取它。以下是一个简单的示例:

python 复制代码
ajax_url = 'https://example.com/ajax_endpoint'
data = requests.get(ajax_url).json()  # 假设响应为 JSON

9. 在网页抓取中使用正则表达式

要使用正则表达式提取数据,我们可以使用 re 库。以下是一个简单的示例:

python 复制代码
import re

emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', html)

10. 尊重 robots.txt

要检查 robots.txt 的抓取权限,我们可以使用 urllib.robotparser 库。以下是一个简单的示例:

python 复制代码
from urllib.robotparser import RobotFileParser

rp = RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()
can_scrape = rp.can_fetch('*', url)

要维护会话并处理 cookie,我们可以使用 requests 库的 Session 类。以下是一个简单的示例:

python 复制代码
session = requests.Session()
session.get('https://example.com/login')
session.cookies.set('key', 'value')  # 如果需要,设置 cookie
response = session.get('https://example.com/protected_page')

12. 使用浏览器自动化进行抓取(selenium 库)

要抓取 JavaScript 呈现的动态内容,我们可以使用 selenium 库。以下是一个简单的示例:

python 复制代码
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://example.com')
content = browser.page_source
# 使用 BeautifulSoup 等解析和提取数据
browser.quit()

13. 网页抓取中的错误处理

要处理错误和异常,我们可以使用 try-except 语句。以下是一个简单的示例:

python 复制代码
try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()  # 为错误状态码引发错误
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

14. 异步网页抓取

要异步抓取网站以加快数据检索速度,我们可以使用 aiohttp 库。以下是一个简单的示例:

python 复制代码
import aiohttp
import asyncio

async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

urls = ['https://example.com/page1', 'https://example.com/page2']
loop = asyncio.get_event_loop()
pages = loop.run_until_complete(asyncio.gather(*(fetch(url) for url in urls)))

15. 数据存储(CSV、数据库)

要将抓取的数据存储在 CSV 文件或数据库中,我们可以使用 csv 库。以下是一个简单的示例:

python 复制代码
import csv

with open('output.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerow(['Title', 'URL'])
    for article in articles:
        writer.writerow([article['title'], article['url']])

通过学习这些技巧,您将能够使用 Python 进行高效的网页抓取。请确保遵循网站的 robots.txt 规则并尊重网站所有者的意愿。

相关推荐
三道杠卷胡3 分钟前
【AI News | 20250804】每日AI进展
人工智能·python·语言模型·github·aigc
小沈熬夜秃头中୧⍤⃝15 分钟前
Python 基础语法(二):流程控制语句详解
开发语言·数据库·python
max50060019 分钟前
基于开源人脸识别模型实现情绪识别功能
python·深度学习·开源·transformer
黄晓魚1 小时前
open3d python 鞋底点云点胶路径识别
开发语言·python·open3d
cxyll12341 小时前
Python接口自动化测试之之request
开发语言·python
华科云商xiao徐2 小时前
基于Mojo与Mechanize的Perl高效爬虫实现
爬虫·数据挖掘·数据分析
华科云商xiao徐2 小时前
PowerShell部署Windows爬虫自动化方案
爬虫·数据挖掘·数据可视化
华科云商xiao徐2 小时前
Nim开发高性能低成本爬虫的完整教程
大数据·爬虫·数据挖掘
树獭叔叔2 小时前
详解 Python 的异步上下文管理器语法
后端·python
leo__5202 小时前
Java的NIO体系详解
java·python·nio