Python爬虫入门实战:3个案例从零抓取网页数据

先看第一个案例:抓取静态网页的新闻标题。

(开篇配图:一个Python脚本在终端运行,输出抓取的新闻标题列表,背景是代码编辑器窗口)

案例1:抓取静态新闻页面

为什么先讲这个?因为80%的入门教程都栽在这里——教了一堆理论,结果读者连一个完整的页面都抓不下来。

python

这是最简单的爬虫,但很多人第一步就错了

import requests
from bs4 import BeautifulSoup

坑1:不加User-Agent,直接返回403

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

url = 'https://example-news-site.com' # 替换成你要爬的网站
response = requests.get(url, headers=headers, timeout=10)

坑2:不检查状态码,结果拿了个错误页面

if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
exit()

坑3:直接打印response.text发现乱码

正确做法:指定编码

response.encoding = 'utf-8'

so

<

p>up = BeautifulSoup(response.text, 'html.parser')

找到所有新闻标题(实际选择器得看网页结构)

titles = soup.select('h2.news-title a')

for title in titles[:10]: # 只取前10条
print(title.get_text(strip=True))
print(title['href'])
print('---')
`

运行这段代码,从3分钟手动复制变成了0.8秒自动抓取。这个设计真的反人类——为什么非要加User-Agent?因为服务器要识别是不是真人访问。

案例2:处理动态加载的数据

另一个坑:你看到页面上有数据,但用上面的代码死活抓不到。为什么?因为数据是JavaScript动态加载的。

(核心配图:浏览器开发者工具网络面板,展示XHR请求和JSON响应,标注"数据在这里")

我遇到一个案例:某个电商网站的商品列表,页面源码里只有个空的div,数据是通过AJAX请求获取的。官方文档这段文档不够清晰,说什么"异步加载",其实就是数据藏在另一个URL里。

`python
import requests
>import json

关键:打开浏览器开发者工具 -> Network -> XHR

刷新页面,找到那个返回数据的请求

api_url = 'https://example-api.com/products?page=1&limit=20'

headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://example.com/products', # 有些网站会检查来源
'X-Requested-With': 'XMLHttpRequest' # 模拟AJAX请求
}

response = requests.get(api_url, headers=headers)
data = response.json() # 直接解析JSON

数据就在这个JSON里

for product in data['data']['items']:
print(f"商品:{product['name']} - 价格:{product['price']}元")
# 注意:有些价格是字符串格式,需要转换
if float(product['price']) < 100: print(" >>> 低于100元,值得关注")
`

这里有个技巧:别傻傻地看页面,直接看网络请求。找到那个返回JSON的接口,比解析HTML简单10倍。

案例3:需要登录的网站怎么办?

还有个坑:有些数据需要登录才能看。比如论坛帖子、个人订单信息。这时候就要模拟登录。

`python
import requests
from bs4 import BeautifulSoup

先登录获取cookies

login_url = 'https://example.com/login'
data = {
'username': 'your_username',
'password': 'your_password',
'csrf_token': '' # 很多网站有这个防跨站攻击的token
}

第一步:先访问登录页面,获取csrf_token

session = requests.Session() # 用Session保持cookies
response = session.get(login_url)
soup = BeautifulSoup(response.text, 'html.parser')
csrf_token = soup.find('input', {'name': 'csrf_token'})['value']
data['csrf_token'] = csrf_token

第二步:提交登录

login_response = session.post(login_url, data=data, headers=headers)
if '登录成功' in login_response.text:
print("登录成功!")

第三步:访问需要登录的页面

profile_url = 'https://example.com/profile'
profile_response = session.get(profile_url)
print(profile_response.text) # 现在能看到个人数据了
`

注意:有些网站会验证IP、验证码、甚至手机验证。这时候就别硬爬了,考虑用Selenium自动化浏览器。

`python

如果上面的方法不行,试试Selenium

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome() # 需要安装chromedriver
driver.get('https://example.com/login')

手动输入登录信息(或者用代码填入)

username_input = driver.find_element(By.NAME, 'username')
username_input.send_keys('your_username')

password_input = driver.find_element(By.NAME, 'password')
password_input.send_keys('your_password')

点击登录按钮

login_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
login_button.click()

time.sleep(3) # 等待页面加载

现在可以抓取数据了

page_source = driver.page_source
driver.quit()
`

Selenium慢是慢了点(从0.8秒变成3-5秒),但能处理99%的反爬虫机制。

(总结前配图:三个案例的对比表格,展示静态网页、动态加载、登录场景的优缺点,标注"选对方法比写代码更重要")

总结一下,你可以立刻用的三个点

  • 先看网络请求:别急着写代码,打开开发者工具看Network,找到真正的数据来源。80%的爬虫问题都是"找错地方"。
  • Headers要完整:User-Agent是基本,Referer和Cookie经常被忽略。遇到403或429错误,先检查Headers。
  • 异常处理不能少:网络请求可能失败,页面结构可能变化。加try-except,加重试机制。
  • `python

    一个完整的异常处理模板

    def safe_request(url, retries=3):
    for i in range(retries):
    try:
    response = requests.get(url, headers=headers, timeout=10)
    response.raise_for_status() # 检查状态码
    return response
    except requests.exceptions.RequestException as e:
    print(f"第{i+1}次请求失败:{e}")
    if i == retries - 1:
    raise # 最后一次失败就抛出
    time.sleep(2 ** i) # 指数退避

    最后说一句:爬虫不是为了爬而爬,而是为了解决问题。别去爬那些有法律风险的网站(比如需要登录的付费内容、个人隐私数据),做个有底线的程序员。

    本文仅供参考,不构成医疗建议。

    本文由AI辅助创作,仅供参考。

    滚动至顶部