> 技术文档 > Python爬虫入门:从零开始抓取网页数据

Python爬虫入门:从零开始抓取网页数据

本文将介绍Python爬虫的核心概念和实现方法,通过一个完整的项目案例(抓取豆瓣电影Top250数据),带你掌握爬虫开发的核心技能。


一、爬虫的核心价值
  1. 数据采集:获取公开网页信息(商品价格、新闻、影评等)

  2. 自动化处理:定期监控网站内容变化

  3. 数据分析基础:为数据科学提供原始材料

  4. 行业应用:搜索引擎索引、价格监控、舆情分析

⚠️ 重要原则:遵守robots.txt协议,限制请求频率(>1秒/次),不抓取敏感数据


二、准备工作

安装必备库:

bash

pip install requests beautifulsoup4 pandas

三、完整爬虫项目:豆瓣电影Top250

python

import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport timeimport randomdef scrape_douban_top250(): # 配置请求头和参数 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\', \'Accept-Language\': \'zh-CN,zh;q=0.9\' } base_url = \"https://movie.douban.com/top250?start={}\" movies = [] # 遍历10页数据 for page in range(0, 250, 25): url = base_url.format(page) try: response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() # 检查HTTP错误 soup = BeautifulSoup(response.text, \'html.parser\') # 解析电影条目 items = soup.select(\'.item\') for item in items: title = item.select_one(\'.title\').text.strip() rating = item.select_one(\'.rating_num\').text.strip() info = item.select_one(\'.bd p\').text.strip().split(\'\\n\')[0] quote_tag = item.select_one(\'.quote\') quote = quote_tag.text.strip() if quote_tag else \"无\" movies.append({  \'排名\': len(movies) + 1,  \'标题\': title,  \'评分\': rating,  \'信息\': info,  \'经典台词\': quote }) # 随机延迟防止被封IP time.sleep(random.uniform(1.0, 2.5)) print(f\"已抓取第{page//25 + 1}页数据\")  except Exception as e: print(f\"第{page//25 + 1}页抓取出错: {str(e)}\") # 保存数据到CSV df = pd.DataFrame(movies) df.to_csv(\'douban_top250.csv\', index=False, encoding=\'utf_8_sig\') print(\"数据已保存到 douban_top250.csv\") return df# 执行爬虫if __name__ == \"__main__\": movie_data = scrape_douban_top250() print(f\"成功抓取{len(movie_data)}部电影数据\") print(movie_data.head(3)) # 预览前3条数据

四、技术要点解析
  1. 请求伪装

    • User-Agent模拟浏览器访问

    • 随机延迟避免触发反爬机制

  2. 精准数据提取

    python

    # CSS选择器定位元素item.select_one(\'.title\').text.strip()
  3. 错误处理

    python

    try: response.raise_for_status()except Exception as e: print(f\"出错: {str(e)}\")
  4. 数据存储

    • 使用Pandas保存结构化数据

    • CSV文件保证数据通用性


五、进阶技巧
  1. 动态页面处理:使用Selenium处理JavaScript渲染

  2. API逆向工程:直接调用网站数据接口

  3. 分布式爬虫:Scrapy-Redis架构实现

  4. 验证码破解:OCR识别或第三方打码平台


六、法律与道德边界
  1. ✅ 允许:公开数据、无访问限制内容

  2. ❌ 禁止:

    • 绕过付费墙抓取内容

    • 抓取用户隐私数据

    • 对网站造成流量压力(每秒请求>3次)

    • 违反网站robots.txt规定

提示:商业级爬虫需考虑IP代理池、验证码识别、User-Agent轮换等高级技术


七、运行结果示例

text

排名 | 标题  | 评分 | 信息 | 经典台词-------------------------------------------------------------------1 | 肖申克的救赎 | 9.7 | 导演: 弗兰克·德拉邦特... | 希望让人自由2 | 霸王别姬 | 9.6 | 导演: 陈凯歌... | 不疯魔不成活3 | 阿甘正传 | 9.5 | 导演: 罗伯特·泽米吉斯... | 生活就像一盒巧克力...

通过这个项目,你可以掌握爬虫开发全流程。实际应用中请根据目标网站结构调整解析逻辑,并始终遵循合法合规原则。