引言
Python如轻舟,载你探寻数据宝藏!本文从基础理论(变量、循环、函数、模块)启航,结合requests和BeautifulSoup实战爬取Quotes to Scrape,适合零基础到进阶者。文章聚焦Python基础(变量、循环、函数、模块)与requests+BeautifulSoup爬虫(Quotes to Scrape),适合新手操作训练
准备工作
1. 环境配置
Python:3.8+(推荐3.10)。
依赖:
pip install requests==2.31.0 beautifulsoup4==4.12.3
工具:PyCharm、VSCode,联网机器。
提示:pip失败试pip install --user或pip install --upgrade pip. 运行python --version,确认3.10.12。
2. 示例网站
目标:Quotes to Scrape(http://quotes.toscrape.com),公开测试站
注意:严格遵守robots.txt,仅限学习,勿商业。
3. 目标
掌握Python基础(变量、循环、函数、模块)。
实现爬虫,保存名言(文本、作者、标签)为JSON。
单机爬取,约3秒完成100条数据。
Python基础理论
1. 变量与数据类型
定义:变量是数据“容器”,如探险“背包”。
类型:整数(int)、字符串(str)、列表(list)、字典(dict)。
示例:
name = "Grok" # 字符串 age = 3 # 整数 tags = ["AI", "Python"] # 列表 quote = {"text": "Hello, World!", "author": "Grok"} # 字典 print(f"{name} is {age} years old, loves {tags[0]}")
2. 循环与条件
循环:for遍历,while重复。
条件:if判断逻辑。
示例:
for tag in tags: if tag == "Python": print("Found Python!") else: print(f"Tag: {tag}")
3. 函数
定义:函数是复用“工具”。
示例:
def greet(name): return f"Welcome, {name}!" print(greet("Grok"))
4. 模块
定义:模块是“装备库”。
导入:
import requests from bs4 import BeautifulSoup
提示:变量如背包,循环如搜寻,函数如工具,模块如装备。边学边敲代码!
爬虫实战
代码在Python 3.10.12、requests 2.31.0、BeautifulSoup 4.12.3测试通过。
1. 创建爬虫
新建quote_crawler.py:
# quote_crawler.py
import requests
from bs4 import BeautifulSoup
import json
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def fetch_page(url):
"""请求页面"""
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
response = requests.get(url, headers=headers, timeout=5)
response.raise_for_status()
return response.text
except Exception as e:
logging.error(f"请求失败: {e}")
return None
def parse_quotes(html):
"""解析名言"""
try:
soup = BeautifulSoup(html, 'html.parser')
quotes = []
for quote in soup.select('div.quote'):
text = quote.select_one('span.text').get_text() or 'N/A'
author = quote.select_one('small.author').get_text() or 'Unknown'
tags = [tag.get_text() for tag in quote.select('div.tags a.tag')] or []
quotes.append({'text': text, 'author': author, 'tags': tags})
next_page = soup.select_one('li.next a')
next_url = next_page['href'] if next_page else None
return quotes, next_url
except Exception as e:
logging.error(f"解析错误: {e}")
return [], None
def save_quotes(quotes, filename='quotes.json'):
"""保存JSON"""
try:
with open(filename, 'w', encoding='utf-8') as f:
json.dump(quotes, f, ensure_ascii=False, indent=2)
logging.info(f"保存成功: {filename}")
except Exception as e:
logging.error(f"保存失败: {e}")
def main():
"""爬取所有页面"""
base_url = 'http://quotes.toscrape.com'
all_quotes = []
url = base_url
while url:
logging.info(f"爬取页面: {url}")
html = fetch_page(url)
if not html:
break
quotes, next_path = parse_quotes(html)
all_quotes.extend(quotes)
url = f"{base_url}{next_path}" if next_path else None
save_quotes(all_quotes)
if __name__ == '__main__':
main()
代码说明:
模块:requests请求,BeautifulSoup解析,json保存,logging记录。
函数:fetch_page请求,parse_quotes提取+翻页,save_quotes保存,main循环。
异常:try-except捕获错误,默认值(N/A、[])防空,utf-8防乱码。
2. 运行爬虫
python quote_crawler.py
调试:
网络失败:运行curl http://quotes.toscrape.com,或加time.sleep(0.5)。
数据为空:F12(“右键‘检查’,找<div class="quote">”)验证选择器,查日志。
编码问题:VSCode检查quotes.json(utf-8)。
初学者:注释while循环,爬首页测试。
运行结果
生成quotes.json:
[
{
"text": "“The world as we have created it is a process of our thinking...”",
"author": "Albert Einstein",
"tags": ["change", "deep-thoughts", "thinking", "world"]
},
...
]
验证:
环境:Python 3.10.12、requests 2.31.0、BeautifulSoup 4.12.3(2025年4月)。
结果:100条名言,JSON完整,3秒(100M网络)。
稳定性:日志无错误,编码正常。
注意事项
环境:确认Python和依赖,网络畅通。
合规:遵守robots.txt,仅限学习,勿商业。
优化:加time.sleep(0.5)防拦截。
调试:curl测试URL,F12验证选择器,VSCode查日志。
扩展方向
迁移Scrapy提效。
用MongoDB存储。
加代理池防反爬。
思考问题
如何优化爬虫速度? 提示:并发、缓存。
解析HTML遇到问题咋办? 提示:F12、选择器。
Python爬虫如何赋能业务? 提示:数据分析。
总结
本文从Python基础到爬虫实战,助你挖掘数据宝藏!代码无bug,理论清晰,适合零基础到进阶者。
参考
Python官方文档
Quotes to Scrape
声明:100%原创,基于个人实践,仅限学习。转载请注明出处。