深入学习 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 requestsurl = '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 BeautifulSouplogin_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 csvurl = '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').textauthor = quote.find('small', class_='author').textwriter.writerow([text, author])print('名人名言已保存到 quotes.csv')

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

3.2 爬取带有分页的网站

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

import requests
from bs4 import BeautifulSoup
import csvbase_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').textauthor = quote.find('small', class_='author').textwriter.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 webdriverdriver = 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 BeautifulSouplogin_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').textauthor = quote.find('small', class_='author').textprint(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 解析 HTMLfrom bs4 import BeautifulSoupsoup = BeautifulSoup(html, 'html.parser')# 提取数据quotes = soup.find_all('div', class_='quote')for quote in quotes:text = quote.find('span', class_='text').textauthor = quote.find('small', class_='author').textprint(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 aiohttpasync 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 randomdef 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 TwoCaptchasolver = 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.mzph.cn/bicheng/68040.shtml

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

相关文章

基于改进粒子群优化的无人机最优能耗路径规划

目录 1. Introduction2. Preliminaries2.1. Particle Swarm Optimization Algorithm2.2. Deep Deterministic Policy Gradient2.3. Calculation of the Total Output Power of the Quadcopter Battery 3.OptimalEnergyConsumptionPathPlanningBasedonPSO-DDPG3.1.ProblemModell…

Redis为 List/Set/Hash 的元素设置单独的过期时间

一.业务简介 我们知道,Redis 里面暂时没有接口给 List、Set 或者 Hash 的 field 单独设置过期时间,只能给整个列表、集合或者 Hash 设置过期时间。 这样,当 List/Set/Hash 过期时,里面的所有 field 元素就全部过期了。但这样并不…

【51单片机】03 蜂鸣器-播放音乐

蜂鸣器-播放音乐 一、原理介绍1.硬件电路 二、练习1.让蜂鸣器发声2.尝试演奏小星星 一、原理介绍 蜂鸣器分为有源蜂鸣器、无源蜂鸣器两种。 有源蜂鸣器:施加合适的电压之后就会发出特定频率的声音 无源蜂鸣器:需要提供特定频率的声音信号,才能…

30_Redis哨兵模式

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图)

汽车基础软件AutoSAR自学攻略(四)-AutoSAR CP分层架构(3) (万字长文-配21张彩图) 前面的两篇博文简述了AutoSAR CP分层架构的概念,下面我们来具体到每一层的具体内容进行讲解,每一层的每一个功能块力求用一个总览图,外加一个例子的图给大家进…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器:定时器0、定时器1、定时器2 注意:51系列单片机一定有基本的2个定时器(定时器0和定时器1),但不全有3个中断,需要查看芯片手册,通常我们使用的是基本的2个定时器&#xff…

LeetCode热题100-合并两个有序链表【JavaScript讲解】

题目: 题解: 我们目前已经知道两条链表都是有序链表,我们就可以通过迭代的方法实现上述问题。当list1和list2都不是空链表时,判断list1和list2哪个头节点的值更小,将较小的值添加到结果里,被添加到结果里的…

Artec Leo 3D扫描仪与Ray助力野生水生动物法医鉴定【沪敖3D】

挑战:捕获大型水生哺乳动物(如鲸鱼)的数据,搭建全彩3D模型,用于水生野生动物的法医鉴定、研究和保护工作。 解决方案:Artec Eva、Artec Space Spider、Artec Leo、Artec Ray、Artec Studio、CT scans 效果&…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符(App ID)、证书,描述文件 3、首先创建标识符,用于新建App应用 3-1、App的话直接选择第一个App IDs,点击右上角继续 3-2、选择App&#x…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle(app模块)里引入依赖,然后Sync Now一下: android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

动植物基因表达调控

1, on and off状态 以及表达的量 2, 基因调控的生物学影响? 超过400多种细胞类型,数目上37万亿 不是所有的基因都表达 为什么多核真核细胞需要基因调控? 单个细胞往多个细胞逐渐进化的过程,形成复杂的…

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本)

2024年度漏洞态势分析报告,需要访问自取即可!(PDF版本),大家有什么好的也可以发一下看看

【数据结构】树的定义

在计算机科学中,树(Tree)是一种重要的基础数据结构,广泛应用于许多领域,如文件系统的目录结构、数据库的索引、编译器的语法树、人工智能的决策树等。理解树的基本概念和术语,对于学习计算机科学及其相关技…

三个shell脚本

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 测试结果: 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shell脚本将/usr/local 日录…

读书笔记--共享服务中心建设原则

最近阅读了《企业IT架构转型之道》记录和思考如下,供大家学习参考。随着企业的数字化转型推进,很多企业开始从原来的SPA模式应用转变为平台技术应用,比如阿里巴巴的共享服务中心,传统企业的统一认证的share服务等等。可以说&#…

DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议

文章目录 Pre概述业务流程需求分析的困境统一语言建模事件风暴会议什么是事件风暴(Event Storming)事件风暴会议 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对…

【C语言系列】函数递归

函数递归 一、递归是什么?1.1尾递归 二、递归的限制条件三、递归举例3.1举例一:求n的阶乘3.2举例二:顺序打印一个整数的每一位 四、递归与迭代4.1举例三:求第n个斐波那契数 五、拓展学习青蛙跳台问题 一、递归是什么? …

css盒子水平垂直居中

目录 1采用flex弹性布局: 2子绝父相margin:负值: 3.子绝父相margin:auto: 4子绝父相transform: 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接:文字水平垂直居中-CSDN博客 以下为盒子…

攻防世界 Web_php_wrong_nginx_config

​ 打开题目地址,显示为登录页面。尝试用御剑扫描一下,发现了admin页面,点进去显示如下 点开控制台,发现如下 isLogin参数为0。尝试抓包并该islogin参数为1,返回依旧不变。 再扫描,发现robots.txt&#xff…

HTML5实现好看的端午节网页源码

HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…