深入学习 Python 爬虫:从基础到实战
深入学习 Python 爬虫:从基础到实战
前言
Python 爬虫是一个强大的工具,可以帮助你从互联网上抓取各种数据。无论你是数据分析师、机器学习工程师,还是对网络数据感兴趣的开发者,爬虫都是一个非常实用的技能。在本文中,我们将深入学习 Python 爬虫,涵盖从基础到进阶的各个知识点,帮助你全面掌握爬虫技术。
第一章:爬虫基础知识
1.1 什么是爬虫?
爬虫,顾名思义,是一种自动化的网络数据抓取程序。它通过模拟人类的浏览行为,向指定的 Web 服务器发送请求,获取网页数据,然后从中提取出有用的信息。
爬虫通常用于:
- 获取公共网站的数据。
- 监控某些网页的变化。
- 搜集数据用于分析和研究。
爬虫的核心概念包括:
- 请求(Request):发送到 Web 服务器的 HTTP 请求,通常是 GET 或 POST 请求。
- 响应(Response):服务器返回的网页内容,通常是 HTML 格式的数据。
- 数据提取:从 HTML 响应中提取你感兴趣的数据。
1.2 爬虫的工作流程
一个简单的爬虫工作流程如下:
- 发送请求:爬虫通过 HTTP 协议向目标网站发送请求(通常是 GET 请求)。
- 解析响应:服务器返回网页的 HTML 内容,爬虫通过解析 HTML 提取出目标数据。
- 存储数据:将提取的数据保存到本地文件或数据库中。
为了让爬虫高效且可靠地工作,通常我们需要关注以下几个要点:
- 请求频率控制:为了避免对目标网站造成过大负担,爬虫需要控制请求的频率。
- 错误处理:如网站不存在(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 提供了多个库来支持并发抓取,例如 threading
、concurrent.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 处理验证码
验证码是网站防止自动化爬虫的常用手段。破解验证码是一个非常复杂的任务,通常我们会通过以下几种方法来解决:
- 手动输入验证码:对于某些简单的验证码,你可以手动输入验证码值并继续抓取。
- OCR(光学字符识别)技术:通过 OCR 技术自动识别验证码的字符。例如,使用
Tesseract
库。 - 使用验证码破解服务:例如
2Captcha
或AntiCaptcha
提供验证码识别服务,可以通过 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 中不可见。对于这种类型的网页,传统的爬虫工具(如 requests
和 BeautifulSoup
)可能无法有效工作。我们可以使用 Selenium
或 Playwright
等工具模拟浏览器行为,获取渲染后的页面内容。
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 请求频率、检测请求头、使用验证码等。以下是一些常见的反爬虫机制和解决方案:
-
请求频率限制:你可以通过设置延迟(如使用
time.sleep()
)或使用随机的请求间隔来模拟人工访问,避免请求频率过高。 -
User-Agent 检测:一些网站会检测请求头中的
User-Agent
字段,以确定请求是否来自浏览器。你可以使用一个常见的浏览器User-Agent
,模拟真实的用户访问。 -
IP 屏蔽:网站可能会检测大量请求来自同一个 IP。如果你遇到 IP 被封的情况,可以使用代理 IP 或者切换 IP 来绕过封锁。
-
验证码:对于需要验证码的网站,可以尝试使用 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
)来管理任务,同时使用异步编程来提升性能。
asyncio
和 aiohttp
的组合是一个非常高效的方式,尤其是当你需要处理大量的网络请求时。
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 中的分析库(如 pandas
、matplotlib
等)来实现。
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 爬虫的基础和进阶技术,包括如何提高抓取效率、如何避免反爬虫机制、如何存储和分析数据等。爬虫的实现不仅仅是技术的挑战,更是对数据结构、网络请求、网页解析、性能优化等多个方面的综合应用。
希望你通过实践不断提高自己的技能,能够应对更复杂的爬虫任务,并解决实际应用中遇到的问题。如果你有任何问题,或者想了解更多内容,随时向我提问!