Python中使用requests和bs4循环爬取网站子页面需要注意什么?

可能是我没配对环境,反正 scrapy 现在用不了,就只能写正常脚本爬,除了加 time.sleep 还有啥注意事项啊,没用过几次 requests 库...


Python中使用requests和bs4循环爬取网站子页面需要注意什么?
4 回复

换 UA ,有条件就换 IP ,最好把不是必要的 BS4 解析移出去,比如最终需要的那个页面先别做结构化解析,保留 html 就好。另外注意列表页的互斥,尽量在爬列表页的时候保证列表的内容也没什么重复最好。


主要就两点:控制请求间隔处理异常中断

核心代码结构应该是这样的:

import requests
from bs4 import BeautifulSoup
import time
from urllib.parse import urljoin

base_url = "https://example.com/list"
headers = {'User-Agent': 'Mozilla/5.0'}

try:
    resp = requests.get(base_url, headers=headers, timeout=10)
    resp.raise_for_status()
    
    soup = BeautifulSoup(resp.text, 'html.parser')
    links = soup.select('.article-link')  # 根据实际CSS选择器调整
    
    for link in links:
        detail_url = urljoin(base_url, link['href'])
        
        try:
            # 关键点1:每个子页面请求前暂停
            time.sleep(1)  # 至少1秒间隔,避免被封
            
            detail_resp = requests.get(detail_url, headers=headers, timeout=10)
            detail_resp.raise_for_status()
            
            detail_soup = BeautifulSoup(detail_resp.text, 'html.parser')
            # 提取你需要的数据...
            
        except requests.RequestException as e:
            print(f"请求失败 {detail_url}: {e}")
            continue  # 关键点2:单个页面失败不影响整体循环
            
except Exception as e:
    print(f"主流程错误: {e}")

简单总结:记得加time.sleep()和try-catch。

配置 scrapy 环境, linux 比 windows 简单些。

soup 解析,一般可以一行写完,用列表推导式

回到顶部