拆分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
相关产品推荐
相关产品推荐

