深入学习 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
库,你首先需要安装它。可以通过以下命令进行安装:
bash
pip install requests
2.1.2 使用 requests
发送 GET 请求
最简单的爬虫请求就是使用 requests
发送 GET 请求,获取网页的 HTML 内容。
python
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 请求。
python
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
,可以使用以下命令:
bash
pip install beautifulsoup4
2.2.2 解析 HTML 页面
BeautifulSoup
可以帮助你从 HTML 文档中提取需要的数据。首先,你需要将网页内容传递给 BeautifulSoup
,然后使用它提供的各种方法来提取数据。
python
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 选择器来查找元素。这对于查找特定的元素非常方便。
python
# 使用 CSS 选择器查找某个 div 标签
div = soup.select('div.classname')
2.3 处理 HTML 表单和 Cookies
许多网站需要登录才能访问或抓取数据。登录通常通过提交 HTML 表单来完成。使用 requests
库和 BeautifulSoup
,我们可以模拟登录并抓取需要的数据。
2.3.1 登录示例
python
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,让你能够跨请求使用相同的会话。
python
# 查看当前会话的 cookies
print(session.cookies.get_dict())
第三章:爬虫实践
3.1 爬取静态网页
在本节中,我们将通过一个实际的例子来演示如何抓取网页的数据,并将其保存到 CSV 文件中。
3.1.1 目标网站:名人名言
我们将抓取一个名人名言网站 http://quotes.toscrape.com/
,该网站提供了大量的名言和作者信息。
python
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}/
为例,以下是如何抓取多页数据的示例:
python
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
设置请求头来模拟真实的浏览器请求。
python
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
可以自动操作浏览器,模拟用户行为,如点击按钮、填写表单等。
bash
pip install selenium
使用 Selenium
启动浏览器并获取网页内容:
python
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 内置的库,可以方便地实现多线程和多进程。在爬虫中,使用多线程可以显著提高抓取网页的速度。
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 操作的爬虫任务,如请求网页、下载文件等。
bash
pip install aiohttp
python
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,保持会话状态。
python
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 来破解验证码的简单示例:
bash
pip install pytesseract pillow
python
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:
bash
pip install selenium
并下载与浏览器版本匹配的 WebDriver。以 Chrome 为例,下载 ChromeDriver,并将其路径添加到系统环境变量中。
python
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
:
bash
pip install playwright
python -m playwright install
使用 Playwright 来抓取动态网页:
python
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 频繁请求的问题。你可以购买代理服务,或者使用一些免费的代理列表。
使用代理池的示例:
python
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 限制请求频率
频繁的请求可能会导致网站服务器的负担过重,甚至被封禁。为了避免过于频繁的请求,可以使用以下几种方法来控制请求的速率:
- 增加请求间隔时间:通过增加请求之间的延迟,可以避免发送过多的请求。
- 使用随机延迟:让每次请求之间的延迟时间随机化,这样可以模拟正常用户的浏览行为,避免被发现是爬虫。
实现请求间隔:
python
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
的组合是一个非常高效的方式,尤其是当你需要处理大量的网络请求时。
python
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
,可以减少被检测为爬虫的风险。
python
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 来模拟点击、滚动、输入等操作,获取渲染后的页面。
python
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 上。为了构建一个代理池,你可以选择购买代理服务或使用免费的代理。
python
# 使用代理池
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 设置请求间隔
python
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 解决验证码
python
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 文件
python
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 文件
python
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 是一个轻量级的数据库,非常适合用于存储爬取的数据。
python
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 进行数据分析
python
import pandas as pd
# 读取 CSV 文件
df = pd.read_csv('quotes.csv')
# 显示数据框的前几行
print(df.head())
9.2.2 可视化数据
python
import matplotlib.pyplot as plt
# 绘制某个字段的直方图
df['author'].value_counts().plot(kind='bar')
plt.show()
结语
通过本文的学习,你已经掌握了 Python 爬虫的基础和进阶技术,包括如何提高抓取效率、如何避免反爬虫机制、如何存储和分析数据等。爬虫的实现不仅仅是技术的挑战,更是对数据结构、网络请求、网页解析、性能优化等多个方面的综合应用。
希望你通过实践不断提高自己的技能,能够应对更复杂的爬虫任务,并解决实际应用中遇到的问题。如果你有任何问题,或者想了解更多内容,随时向我提问!