文章目录
一、环境准备(5分钟搞定)
工欲善其事必先利其器!咱们先用conda创建专属环境:
conda create -n spider_env python=3.8
conda activate spider_env
pip install requests beautifulsoup4 pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
(小贴士)新手常见坑:
- 网络问题导致安装失败 → 切换清华镜像源
- 包版本冲突 → 使用虚拟环境
- 忘记激活环境 → 注意命令行前的(spider_env)
二、第一个爬虫实战(超简单版)
2.1 基础版代码
import requests
from bs4 import BeautifulSoup
url = 'https://movie.douban.com/top250'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = []
for item in soup.select('.item'):
title = item.select_one('.title').text
rating = item.select_one('.rating_num').text
movies.append({'电影名称': title, '评分': rating})
print(movies[:5]) # 打印前五部电影
2.2 代码解剖(新人必看)
- User-Agent伪装:让服务器以为你是浏览器访问(重要的事情说三遍)
- CSS选择器:比XPath更直观的定位方式
- select_one():精准定位单个元素
- 列表推导式:Pythonic的优雅写法
(避坑指南)新手常见报错:
- 403 Forbidden → 检查headers是否完整
- NoneType错误 → 确认CSS选择器是否正确
- 编码问题 → 添加response.encoding=‘utf-8’
三、突破反爬机制(实战精华)
3.1 伪装大法
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.douban.com/',
'Cookie': '你的实际cookie' # 用浏览器登录后获取
}
3.2 请求频率控制
import random
import time
for page in range(0, 250, 25):
url = f'https://movie.douban.com/top250?start={page}'
time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
# 发送请求代码...
3.3 代理IP使用
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://10.10.1.10:1080',
}
response = requests.get(url, headers=headers, proxies=proxies)
(重要提示)免费代理陷阱:
- 可用率不足30%
- 响应速度慢
- 存在安全隐患
建议新手使用付费代理服务(如快代理、站大爷)
四、数据存储(多种姿势)
4.1 CSV存储
import pandas as pd
df = pd.DataFrame(movies)
df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')
4.2 MySQL存储
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', db='spider')
cursor = conn.cursor()
sql = '''CREATE TABLE IF NOT EXISTS movies(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
rating FLOAT)
'''
cursor.execute(sql)
for movie in movies:
cursor.execute("INSERT INTO movies(title, rating) VALUES (%s, %s)",
(movie['电影名称'], movie['评分']))
conn.commit()
五、进阶技巧(高手必备)
5.1 异步爬虫
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, url)
# 解析代码...
asyncio.run(main())
5.2 Selenium动态渲染
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 无界面模式
driver = webdriver.Chrome(options=options)
driver.get(url)
page_source = driver.page_source
六、法律与伦理(超级重要!!!)
- 遵守robots.txt协议(豆瓣的robots.txt明确禁止爬取)
- 控制请求频率(别把人家服务器搞崩了)
- 不爬取敏感数据(用户隐私、付费内容等)
- 用于学习研究目的(商业用途需要授权)
(血泪教训)真实案例警示:
- 某大学生因爬取学校系统数据被处分
- 某公司爬取竞争对手数据被起诉
- 某爬虫程序导致目标网站瘫痪被索赔
七、下一步学习路线
- Scrapy框架 → 构建工程化爬虫
- 验证码识别 → 突破登录限制
- 分布式爬虫 → 提升采集效率
- 反反爬策略 → 指纹伪装、行为模拟
(学习资源推荐)
- 官方文档(Requests/Scrapy)
- 《Python网络数据采集》
- Scrapy中文文档(https://scrapy-chs.readthedocs.io)
最后送大家一句话:爬虫虽好,可不要贪杯哦!技术是把双刃剑,用对了能开山劈石,用错了…(你懂的)