先看第一个案例:抓取静态网页的新闻标题。
(开篇配图:一个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%的反爬虫机制。
(总结前配图:三个案例的对比表格,展示静态网页、动态加载、登录场景的优缺点,标注"选对方法比写代码更重要")
总结一下,你可以立刻用的三个点
`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辅助创作,仅供参考。