当前位置: 首页 > article >正文

深入学习 Python 爬虫:从基础到实战

深入学习 Python 爬虫:从基础到实战

前言

Python 爬虫是一个强大的工具,可以帮助你从互联网上抓取各种数据。无论你是数据分析师、机器学习工程师,还是对网络数据感兴趣的开发者,爬虫都是一个非常实用的技能。在本文中,我们将深入学习 Python 爬虫,涵盖从基础到进阶的各个知识点,帮助你全面掌握爬虫技术。


第一章:爬虫基础知识

1.1 什么是爬虫?

爬虫,顾名思义,是一种自动化的网络数据抓取程序。它通过模拟人类的浏览行为,向指定的 Web 服务器发送请求,获取网页数据,然后从中提取出有用的信息。

爬虫通常用于:

  • 获取公共网站的数据。
  • 监控某些网页的变化。
  • 搜集数据用于分析和研究。

爬虫的核心概念包括:

  • 请求(Request):发送到 Web 服务器的 HTTP 请求,通常是 GET 或 POST 请求。
  • 响应(Response):服务器返回的网页内容,通常是 HTML 格式的数据。
  • 数据提取:从 HTML 响应中提取你感兴趣的数据。

1.2 爬虫的工作流程

一个简单的爬虫工作流程如下:

  1. 发送请求:爬虫通过 HTTP 协议向目标网站发送请求(通常是 GET 请求)。
  2. 解析响应:服务器返回网页的 HTML 内容,爬虫通过解析 HTML 提取出目标数据。
  3. 存储数据:将提取的数据保存到本地文件或数据库中。

为了让爬虫高效且可靠地工作,通常我们需要关注以下几个要点:

  • 请求频率控制:为了避免对目标网站造成过大负担,爬虫需要控制请求的频率。
  • 错误处理:如网站不存在(404)、服务器错误(500)等需要处理的情况。
  • 数据存储:如何将抓取的数据保存到文件或数据库中,以便后续分析。

第二章:基础工具与库

2.1 Python HTTP 请求库:requests

requests 是 Python 中最常用的 HTTP 请求库,它简化了 HTTP 请求的操作,支持 GET、POST 等常见请求方法。

2.1.1 安装 requests

要使用 requests 库,你首先需要安装它。可以通过以下命令进行安装:

pip install requests
2.1.2 使用 requests 发送 GET 请求

最简单的爬虫请求就是使用 requests 发送 GET 请求,获取网页的 HTML 内容。

import requests

# 目标 URL
url = 'http://quotes.toscrape.com/'

# 发送 GET 请求
response = requests.get(url)

# 输出网页内容
print(response.text)

在这个示例中,requests.get(url) 会向指定 URL 发送一个 HTTP GET 请求,返回一个 response 对象。通过 response.text,你可以获取网页的 HTML 内容。

2.1.3 发送 POST 请求

除了 GET 请求,爬虫常常需要发送 POST 请求来获取数据(例如表单提交、登录验证等)。requests 也支持 POST 请求。

import requests

url = 'http://httpbin.org/post'
data = {'username': 'test', 'password': '1234'}

response = requests.post(url, data=data)

print(response.text)

在这个示例中,我们向 httpbin.org 发送了一个 POST 请求,并附带了一个字典数据(模拟表单提交)。响应的内容将显示 POST 请求的数据。

2.2 HTML 解析库:BeautifulSoup

HTML 文档通常是我们抓取的主要数据形式,BeautifulSoup 是一个用于解析 HTML 和 XML 的库,它提供了灵活的工具来提取网页中的内容。

2.2.1 安装 beautifulsoup4

你需要先安装 beautifulsoup4,可以使用以下命令:

pip install beautifulsoup4
2.2.2 解析 HTML 页面

BeautifulSoup 可以帮助你从 HTML 文档中提取需要的数据。首先,你需要将网页内容传递给 BeautifulSoup,然后使用它提供的各种方法来提取数据。

from bs4 import BeautifulSoup

# 假设 response.text 是我们已经获取的 HTML 内容
soup = BeautifulSoup(response.text, 'html.parser')

# 获取网页的标题
print(soup.title)

# 获取网页的所有链接
for link in soup.find_all('a'):
    print(link.get('href'))

在这个示例中,我们用 BeautifulSoup(response.text, 'html.parser') 将网页内容解析为一个 BeautifulSoup 对象,然后用 soup.find_all() 来查找所有的 a 标签并提取其中的 href 属性,获取所有的链接。

2.2.3 使用 CSS 选择器查找元素

BeautifulSoup 还支持使用 CSS 选择器来查找元素。这对于查找特定的元素非常方便。

# 使用 CSS 选择器查找某个 div 标签
div = soup.select('div.classname')

2.3 处理 HTML 表单和 Cookies

许多网站需要登录才能访问或抓取数据。登录通常通过提交 HTML 表单来完成。使用 requests 库和 BeautifulSoup,我们可以模拟登录并抓取需要的数据。

2.3.1 登录示例
import requests
from bs4 import BeautifulSoup

login_url = 'http://quotes.toscrape.com/login'
data_url = 'http://quotes.toscrape.com/'

# 创建会话对象
session = requests.Session()

# 获取登录页面并解析
response = session.get(login_url)
soup = BeautifulSoup(response.text, 'html.parser')

# 提取登录表单的隐藏字段(如 CSRF Token)
csrf_token = soup.find('input', {'name': 'csrf_token'})['value']

# 登录时提交的数据
login_data = {
    'username': 'test',
    'password': '1234',
    'csrf_token': csrf_token
}

# 提交登录表单
session.post(login_url, data=login_data)

# 获取登录后页面的数据
data_response = session.get(data_url)
print(data_response.text)

在这个示例中,我们首先通过 session.get(login_url) 获取登录页面,并解析其中的 CSRF token。然后,我们将用户名、密码和 CSRF token 一并提交到登录页面。

2.3.2 处理 Cookies

在爬虫中,Cookie 用于保存登录状态或会话信息。requests.Session 会自动管理 Cookie,让你能够跨请求使用相同的会话。

# 查看当前会话的 cookies
print(session.cookies.get_dict())

第三章:爬虫实践

3.1 爬取静态网页

在本节中,我们将通过一个实际的例子来演示如何抓取网页的数据,并将其保存到 CSV 文件中。

3.1.1 目标网站:名人名言

我们将抓取一个名人名言网站 http://quotes.toscrape.com/,该网站提供了大量的名言和作者信息。

import requests
from bs4 import BeautifulSoup
import csv

url = 'http://quotes.toscrape.com/'

# 获取网页内容
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 找到所有的名言
quotes = soup.find_all('div', class_='quote')

# 打开 CSV 文件并写入数据
with open('quotes.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Quote', 'Author'])

    for quote in quotes:
        text = quote.find('span', class_='text').text
        author = quote.find('small', class_='author').text
        writer.writerow([text, author])

print('名人名言已保存到 quotes.csv')

在这个例子中,我们使用 BeautifulSoup 解析网页,提取出每条名言和作者,然后将这些数据保存到一个 CSV 文件中。通过这种方式,你可以轻松地抓取并存储网站上的数据。

3.2 爬取带有分页的网站

许多网站的数据是分页显示的,这时我们需要处理分页的抓取。以 http://quotes.toscrape.com/page/{page}/ 为例,以下是如何抓取多页数据的示例:

import requests
from bs4 import BeautifulSoup
import csv



base_url = 'http://quotes.toscrape.com/page/{}/'

# 打开 CSV 文件
with open('quotes_all.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Quote', 'Author'])

    # 遍历每一页
    for page in range(1, 11):  # 假设我们抓取前 10 页
        url = base_url.format(page)
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')

        quotes = soup.find_all('div', class_='quote')
        for quote in quotes:
            text = quote.find('span', class_='text').text
            author = quote.find('small', class_='author').text
            writer.writerow([text, author])

print('所有名人名言已保存到 quotes_all.csv')

第四章:进阶技术

4.1 反爬虫机制

很多网站会通过各种手段来防止爬虫的访问,例如限制访问频率、检测异常请求行为、使用验证码等。

4.1.1 设置请求头

网站通常会根据请求头(如 User-Agent)来判断请求是否来自浏览器。如果没有设置合适的请求头,服务器可能会拒绝你的请求。你可以通过 requests 设置请求头来模拟真实的浏览器请求。

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)
4.1.2 模拟浏览器行为

如果目标网站使用 JavaScript 动态加载内容,你可以使用 Selenium 来模拟浏览器行为,获取渲染后的网页内容。Selenium 可以自动操作浏览器,模拟用户行为,如点击按钮、填写表单等。

pip install selenium

使用 Selenium 启动浏览器并获取网页内容:

from selenium import webdriver

driver = webdriver.Chrome()  # 启动浏览器
driver.get('http://quotes.toscrape.com/')  # 打开网页

# 获取页面源代码
html = driver.page_source
print(html)

driver.quit()

第五章:更复杂的爬虫技术

5.1 多线程和并发爬取

当你需要抓取大量网页时,单线程的爬虫效率可能会比较低。为了提高抓取效率,我们可以使用多线程或多进程的方式同时爬取多个网页。Python 提供了多个库来支持并发抓取,例如 threadingconcurrent.futures 等。

5.1.1 使用 concurrent.futures 模块进行并发爬取

concurrent.futures 是 Python 内置的库,可以方便地实现多线程和多进程。在爬虫中,使用多线程可以显著提高抓取网页的速度。

import requests
from concurrent.futures import ThreadPoolExecutor

# 目标 URL
url = 'http://quotes.toscrape.com/page/{}/'

# 定义爬取的任务
def fetch_page(page_number):
    response = requests.get(url.format(page_number))
    return response.text

# 使用 ThreadPoolExecutor 实现并发抓取
with ThreadPoolExecutor(max_workers=5) as executor:
    pages = range(1, 6)  # 假设我们抓取 5 页
    results = list(executor.map(fetch_page, pages))

# 输出抓取的结果
for result in results:
    print(result[:200])  # 输出每个页面的前 200 个字符

在这个示例中,ThreadPoolExecutor 会创建一个包含多个线程的线程池,max_workers=5 表示最多同时使用 5 个线程。我们使用 executor.map 来并发执行 fetch_page 函数,这样可以同时抓取多个页面,提升爬取速度。

5.1.2 使用 aiohttp 实现异步爬虫

除了多线程,Python 还支持异步编程(asyncio),可以使用 aiohttp 库来进行异步爬虫。这种方式特别适用于需要处理大量 IO 操作的爬虫任务,如请求网页、下载文件等。

pip install aiohttp
import aiohttp
import asyncio

# 异步爬取网页的任务
async def fetch_page(session, page_number):
    async with session.get(f'http://quotes.toscrape.com/page/{page_number}/') as response:
        return await response.text()

# 主任务:并发抓取多个页面
async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        for page in range(1, 6):  # 假设抓取 5 页
            task = asyncio.ensure_future(fetch_page(session, page))
            tasks.append(task)
        pages = await asyncio.gather(*tasks)
        
        # 输出每个页面的内容
        for page in pages:
            print(page[:200])  # 输出每个页面的前 200 个字符

# 启动异步爬虫
asyncio.run(main())

在这个示例中,我们使用 aiohttp 库来异步获取网页,通过 asyncio 事件循环并发执行多个爬取任务。异步方式相比传统的多线程方式具有更高的效率,尤其是在处理大量网络请求时。

5.2 模拟登录与验证码破解

一些网站要求用户登录才能访问或抓取数据。此外,许多网站会通过验证码来防止机器人抓取数据。这里我们将讨论如何处理这些问题。

5.2.1 模拟登录

有些网站需要登录才能抓取数据,模拟登录的过程通常包括发送一个包含用户名、密码的 POST 请求,同时处理登录后的 Cookie,保持会话状态。

import requests
from bs4 import BeautifulSoup

login_url = 'http://quotes.toscrape.com/login'
login_data = {
    'username': 'your_username',
    'password': 'your_password'
}

# 创建会话对象
session = requests.Session()

# 获取登录页面
response = session.get(login_url)
soup = BeautifulSoup(response.text, 'html.parser')

# 获取 CSRF Token 等隐藏字段
csrf_token = soup.find('input', {'name': 'csrf_token'})['value']

# 更新登录数据
login_data['csrf_token'] = csrf_token

# 模拟登录
session.post(login_url, data=login_data)

# 登录成功后抓取数据
data_url = 'http://quotes.toscrape.com/secret_page'
response = session.get(data_url)
print(response.text)

在这个例子中,我们首先访问登录页面,提取隐藏的 CSRF token(防止跨站请求伪造攻击),然后使用 requests.Session() 来保持会话,提交包含用户名、密码以及 CSRF token 的 POST 请求,最后抓取登录后的页面数据。

5.2.2 处理验证码

验证码是网站防止自动化爬虫的常用手段。破解验证码是一个非常复杂的任务,通常我们会通过以下几种方法来解决:

  1. 手动输入验证码:对于某些简单的验证码,你可以手动输入验证码值并继续抓取。
  2. OCR(光学字符识别)技术:通过 OCR 技术自动识别验证码的字符。例如,使用 Tesseract 库。
  3. 使用验证码破解服务:例如 2CaptchaAntiCaptcha 提供验证码识别服务,可以通过 API 调用来破解验证码。

下面是使用 Tesseract OCR 来破解验证码的简单示例:

pip install pytesseract pillow
from PIL import Image
import pytesseract

# 打开验证码图片
image = Image.open('captcha.png')

# 使用 Tesseract 进行 OCR 识别
captcha_text = pytesseract.image_to_string(image)

print('识别的验证码:', captcha_text)

Tesseract 是一个开源的 OCR 引擎,可以将图片中的文字转换为字符串。你可以将验证码图片传递给 Tesseract 进行解析。

5.3 动态网页抓取

许多网站使用 JavaScript 动态加载数据,而这些数据在初始 HTML 中不可见。对于这种类型的网页,传统的爬虫工具(如 requestsBeautifulSoup)可能无法有效工作。我们可以使用 SeleniumPlaywright 等工具模拟浏览器行为,获取渲染后的页面内容。

5.3.1 使用 Selenium 进行动态网页抓取

Selenium 是一个自动化测试工具,也可以用于爬虫,模拟用户行为,处理 JavaScript 渲染的网页。

首先安装 Selenium 和 WebDriver:

pip install selenium

并下载与浏览器版本匹配的 WebDriver。以 Chrome 为例,下载 ChromeDriver,并将其路径添加到系统环境变量中。

from selenium import webdriver

# 启动 Chrome 浏览器
driver = webdriver.Chrome()

# 打开目标网页
driver.get('http://quotes.toscrape.com/js/')

# 获取渲染后的页面内容
html = driver.page_source

# 使用 BeautifulSoup 解析 HTML
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')

# 提取数据
quotes = soup.find_all('div', class_='quote')
for quote in quotes:
    text = quote.find('span', class_='text').text
    author = quote.find('small', class_='author').text
    print(f'"{text}" - {author}')

# 关闭浏览器
driver.quit()

在这个示例中,Selenium 启动一个浏览器实例,加载 JavaScript 动态渲染的页面。通过获取 driver.page_source,你可以获取页面渲染后的 HTML 内容,并使用 BeautifulSoup 进行解析和提取数据。

5.3.2 使用 Playwright 进行动态网页抓取

Playwright 是另一个流行的浏览器自动化工具,它支持 Chromium、Firefox 和 WebKit 等浏览器,且比 Selenium 更高效,适用于大规模爬虫。

首先安装 Playwright

pip install playwright
python -m playwright install

使用 Playwright 来抓取动态网页:

from playwright.sync_api import sync_playwright

# 启动浏览器
with sync_playwright() as p:
    browser = p.chromium.launch()
    page = browser.new_page()

    # 打开目标网页
    page.goto('http://quotes.toscrape.com/js/')

    # 获取渲染后的页面内容
    html = page.content()

    # 使用 BeautifulSoup 解析 HTML
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html, 'html.parser')

    # 提取数据
    quotes = soup.find_all('div', class_='quote')
    for quote in quotes:
        text = quote.find('span', class_='text').text
        author = quote.find('small', class_='author').text
        print(f'"{text}"

 - {author}')

    # 关闭浏览器
    browser.close()

Playwright 提供了比 Selenium 更为轻量和高效的 API,能够在抓取时处理 JavaScript 动态加载的内容。


第六章:常见问题与解决方案

6.1 网站反爬虫机制

许多网站会采取反爬虫机制,如限制 IP 请求频率、检测请求头、使用验证码等。以下是一些常见的反爬虫机制和解决方案:

  1. 请求频率限制:你可以通过设置延迟(如使用 time.sleep())或使用随机的请求间隔来模拟人工访问,避免请求频率过高。

  2. User-Agent 检测:一些网站会检测请求头中的 User-Agent 字段,以确定请求是否来自浏览器。你可以使用一个常见的浏览器 User-Agent,模拟真实的用户访问。

  3. IP 屏蔽:网站可能会检测大量请求来自同一个 IP。如果你遇到 IP 被封的情况,可以使用代理 IP 或者切换 IP 来绕过封锁。

  4. 验证码:对于需要验证码的网站,可以尝试使用 OCR 技术破解验证码,或者使用验证码识别服务(如 2Captcha)自动识别验证码。


第七章:爬虫性能优化

7.1 优化抓取速度

在实际的爬虫项目中,抓取速度是一个非常重要的因素。为了优化爬虫的性能,以下是一些常见的优化策略:

7.1.1 使用代理池

为了避免 IP 被封锁,可以使用代理池(Proxy Pool)。代理池是通过多种 IP 地址来轮换使用,减轻单个 IP 频繁请求的问题。你可以购买代理服务,或者使用一些免费的代理列表。

使用代理池的示例:
import requests
import random

# 代理池
proxy_pool = [
    'http://proxy1.com',
    'http://proxy2.com',
    'http://proxy3.com',
]

# 随机选择一个代理
proxy = {'http': random.choice(proxy_pool)}

# 发送请求时使用代理
response = requests.get('http://quotes.toscrape.com/', proxies=proxy)

print(response.text)

使用代理池可以避免频繁的 IP 被封禁,提高抓取的稳定性。

7.1.2 限制请求频率

频繁的请求可能会导致网站服务器的负担过重,甚至被封禁。为了避免过于频繁的请求,可以使用以下几种方法来控制请求的速率:

  • 增加请求间隔时间:通过增加请求之间的延迟,可以避免发送过多的请求。
  • 使用随机延迟:让每次请求之间的延迟时间随机化,这样可以模拟正常用户的浏览行为,避免被发现是爬虫。
实现请求间隔:
import time
import random

# 请求函数
def fetch_data(url):
    response = requests.get(url)
    print(response.text)

# 使用随机延迟来控制请求频率
urls = ['http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', 'http://quotes.toscrape.com/page/3/']
for url in urls:
    fetch_data(url)
    time.sleep(random.uniform(1, 3))  # 随机间隔 1 到 3 秒
7.1.3 使用队列和异步任务

为了高效抓取多个网页,你可以使用任务队列(如 queue 或者使用更强大的 Celery)来管理任务,同时使用异步编程来提升性能。

asyncioaiohttp 的组合是一个非常高效的方式,尤其是当你需要处理大量的网络请求时。

import asyncio
import aiohttp

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

async def main():
    urls = ['http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', 'http://quotes.toscrape.com/page/3/']
    tasks = [fetch_page(url) for url in urls]
    results = await asyncio.gather(*tasks)
    for result in results:
        print(result[:100])  # 打印每个页面的前 100 个字符

asyncio.run(main())

在这个例子中,asyncio.gather 会同时发出多个请求,从而显著提升爬虫的抓取效率。


第八章:防止被封禁的策略

网站通常会使用各种方法来防止爬虫抓取数据,常见的防爬虫措施包括 IP 屏蔽、限制请求频率、检测异常请求行为、验证码等。要避免被封禁,你可以使用以下几种策略:

8.1 使用模拟浏览器的方式

一些网站通过分析请求头(例如 User-Agent)来检测请求是否来自爬虫。为了规避这种检查,你可以模拟真实浏览器的行为。

8.1.1 设置请求头

通过在请求中设置常见的浏览器 User-Agent,可以减少被检测为爬虫的风险。

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('http://quotes.toscrape.com/', headers=headers)
print(response.text)
8.1.2 使用 Selenium 模拟浏览器行为

对于更复杂的反爬虫机制(如动态加载内容),Selenium 可以模拟真实用户的行为。你可以使用 Selenium 来模拟点击、滚动、输入等操作,获取渲染后的页面。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time

# 启动浏览器
driver = webdriver.Chrome()

# 打开页面
driver.get('http://quotes.toscrape.com/')

# 模拟滚动,加载更多内容
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

# 获取页面内容
html = driver.page_source
print(html)

driver.quit()

8.2 使用代理池

代理池可以帮助你避免 IP 被封禁。你可以通过轮换 IP 地址来分散请求,避免过多请求集中在一个 IP 上。为了构建一个代理池,你可以选择购买代理服务或使用免费的代理。

# 使用代理池
proxies = [
    {'http': 'http://proxy1.com'},
    {'http': 'http://proxy2.com'},
    {'http': 'http://proxy3.com'}
]

# 选择代理
proxy = random.choice(proxies)

response = requests.get('http://quotes.toscrape.com/', proxies=proxy)
print(response.text)

8.3 控制请求速度

通过设置合适的请求频率,可以避免过多的请求使得网站认为是恶意抓取。

8.3.1 设置请求间隔
import time
import random

def fetch_data(url):
    response = requests.get(url)
    print(response.text)

urls = ['http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/']
for url in urls:
    fetch_data(url)
    time.sleep(random.uniform(2, 5))  # 随机延迟 2 到 5 秒

8.4 使用 CAPTCHA 识别

有些网站使用 CAPTCHA(验证码)来防止自动化抓取。你可以通过人工输入验证码,或者使用验证码识别服务(例如 2Captcha 或 AntiCaptcha)来自动识别验证码。

8.4.1 使用 2Captcha 解决验证码
import requests
from twocaptcha import TwoCaptcha

solver = TwoCaptcha('YOUR_API_KEY')

# 传递验证码图片 URL
result = solver.recaptcha(sitekey='YOUR_SITE_KEY', url='YOUR_URL')

print(result)

2Captcha 提供了一个 API,可以帮助你自动识别验证码并提交。


第九章:存储与分析抓取的数据

抓取的数据往往是原始的 HTML,如何从中提取有用的信息并进行存储和分析,是爬虫开发中的重要环节。

9.1 存储数据

抓取的数据可以存储到不同的地方,常见的存储方式包括 CSV 文件、JSON 文件、SQLite 数据库等。

9.1.1 存储为 CSV 文件
import csv

# 模拟抓取的数据
data = [
    {'quote': 'The journey of a thousand miles begins with one step.', 'author': 'Lao Tzu'},
    {'quote': 'That which does not kill us makes us stronger.', 'author': 'Friedrich Nietzsche'}
]

# 存储为 CSV 文件
with open('quotes.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['quote', 'author'])
    writer.writeheader()
    writer.writerows(data)
9.1.2 存储为 JSON 文件
import json

# 存储为 JSON 文件
with open('quotes.json', 'w', encoding='utf-8') as file:
    json.dump(data, file, ensure_ascii=False, indent=4)
9.1.3 存储为 SQLite 数据库

SQLite 是一个轻量级的数据库,非常适合用于存储爬取的数据。

import sqlite3

# 创建数据库连接
conn = sqlite3.connect('quotes.db')
cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE IF NOT EXISTS quotes
                  (quote TEXT, author TEXT)''')

# 插入数据
for item in data:
    cursor.execute("INSERT INTO quotes (quote, author) VALUES (?, ?)", (item['quote'], item['author']))

# 提交事务并关闭连接
conn.commit()
conn

.close()

9.2 分析抓取的数据

分析爬取的数据可以通过 Python 中的分析库(如 pandasmatplotlib 等)来实现。

9.2.1 使用 Pandas 进行数据分析
import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('quotes.csv')

# 显示数据框的前几行
print(df.head())
9.2.2 可视化数据
import matplotlib.pyplot as plt

# 绘制某个字段的直方图
df['author'].value_counts().plot(kind='bar')
plt.show()

结语

通过本文的学习,你已经掌握了 Python 爬虫的基础和进阶技术,包括如何提高抓取效率、如何避免反爬虫机制、如何存储和分析数据等。爬虫的实现不仅仅是技术的挑战,更是对数据结构、网络请求、网页解析、性能优化等多个方面的综合应用。

希望你通过实践不断提高自己的技能,能够应对更复杂的爬虫任务,并解决实际应用中遇到的问题。如果你有任何问题,或者想了解更多内容,随时向我提问!


http://www.kler.cn/a/500080.html

相关文章:

  • Unity + Firebase + GoogleSignIn 导入问题
  • LLaMA-Factory web微调大模型并导出大模型
  • git: hint:use --reapply-cherry-picks to include skipped commits
  • STM32如何使用内部晶振作为晶振
  • Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)
  • 【UE5 C++课程系列笔记】27——多线程基础——ControlFlow插件的基本使用
  • docker 部署Nginx UI
  • 在UE5中使用视差贴图
  • 线程并发下的单例模式
  • 20_Spring Boot默认缓存管理
  • 【机器学习:七、分类问题】
  • 微服务电商平台课程六:后端代码框架认识
  • CI/CD与自动化运维的结合:加速交付与稳定运维
  • 联想java开发面试题及参考答案
  • 73.矩阵置零 python
  • 代码随想录算法训练营第3天(链表1)| 203.移除链表元素 707.设计链表 206.反转链表
  • EJB与微服务:Java的秘密武器
  • go oom堆内存分析
  • 论文导读 | 可串行化事务机制
  • LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎
  • web网页设 web网页设计,html页面制作,div布局 css js
  • 安全运维管理 10.2资产管理