You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分urllib2/BeautifulSoup请求为小请求包及汽车专利ID爬取问询

拆分urllib2/BeautifulSoup请求为更小的请求包的解决方案

嘿,我来帮你把这个批量请求拆成更可控的小请求包!这样不仅能降低被目标网站限制的风险,代码也会更易维护和调试。

核心思路

我们可以把原来的大循环拆成独立的单次请求单元,每个单元只负责请求单页数据、解析内容,同时加上请求间隔和异常处理,让每个请求都是轻量化的小数据包,避免一次性发起大量请求导致的问题。

完整代码实现

import urllib2
from bs4 import BeautifulSoup
import re
import time
from urllib2 import HTTPError, URLError

search_term = 'automobile'
patent_list = []

def fetch_patent_page(page_num):
    """封装单次页面请求的函数,返回解析后的soup对象"""
    url = f'https://www.lens.org/lens/search?q={search_term}&sat=P&l=en&st=true&p={page_num}&n=100'
    try:
        # 添加请求延迟,避免频繁触发反爬
        time.sleep(1)
        page = urllib2.urlopen(url)
        return BeautifulSoup(page, 'html.parser')
    except (HTTPError, URLError) as e:
        print(f"请求第{page_num+1}页失败: {str(e)}")
        return None

def extract_patent_ids(soup):
    """从soup对象中提取专利ID的函数"""
    if not soup:
        return []
    # 这里需要根据Lens网站实际页面结构调整规则
    # 示例:假设专利ID在包含'patent/'的链接href中
    patent_ids = []
    for aref in soup.find_all('a', href=re.compile(r'patent/(\w+)')):
        match = re.search(r'patent/(\w+)', aref['href'])
        if match:
            patent_ids.append(match.group(1))
    return patent_ids

# 逐个处理每一页的小请求
for page_num in range(100):
    print(f"正在处理第{page_num+1}页...")
    soup = fetch_patent_page(page_num)
    current_ids = extract_patent_ids(soup)
    patent_list.extend(current_ids)

print(f"共收集到{len(patent_list)}个专利ID")

关键改进点说明

  • 拆分请求单元:把请求页面和解析内容拆成两个独立函数,每个请求都是单独的小数据包,便于单独调试和修改逻辑。
  • 添加请求控制:加入time.sleep(1)让请求间隔1秒,降低被目标网站拦截的概率;同时捕获请求异常,不会因为某一页失败导致整个程序崩溃。
  • 职责清晰划分:请求、解析、收集三个环节完全分离,代码可读性和可维护性大大提升。

注意事项

你需要根据Lens网站实际的HTML结构,调整extract_patent_ids函数中查找专利ID的规则(比如标签的class、href的正则表达式),确保能正确提取到目标专利ID。

内容的提问来源于stack exchange,提问作者Slowat_Kela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:21:12