2025/12/31 7:33:57
网站建设
项目流程
自建网站做淘宝联盟,创一东莞网站建设,影视网站开发,网址制作典型过程式爬虫示例#xff08;易引发代码混乱#xff09;
def crawl_page(url):
headers {‘User-Agent’: ‘Mozilla/5.0’} # 硬编码头部
try:
res requests.get(url, headersheaders, timeout5)
# 解析逻辑与请求耦合…
soup BeautifulSoup(res.text, ‘lxml’)
title…典型过程式爬虫示例易引发代码混乱def crawl_page(url):headers {‘User-Agent’: ‘Mozilla/5.0’} # 硬编码头部try:res requests.get(url, headersheaders, timeout5)# 解析逻辑与请求耦合…soup BeautifulSoup(res.text, ‘lxml’)title soup.select_one(‘h1.title’).text # 选择器易失效except Exception as e: # 异常处理分散print(fError: {str(e)})痛点总结配置参数散落在多处异常处理重复率60%扩展新功能需重写核心逻辑多线程开发易出现资源竞争二、类封装四层架构设计通过基类统一核心流程子类专注业务逻辑class BaseSpider:# 1. 初始化层参数集中管理 def init(self, base_url, max_retry3):self.base_url base_urlself.max_retry max_retryself.session requests.Session() # 连接复用关键self.session.headers {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36’, # 动态UA需扩展‘Accept-Language’: ‘zh-CN,zh;q0.9’}self._init_stats() # 统计初始化# 2. 请求控制层 def _request(self, method, endpoint, **kwargs):url urljoin(self.base_url, endpoint)for _ in range(self.max_retry):try:resp self.session.request(method, url, **kwargs)resp.raise_for_status() # 自动拦截4xx/5xx错误return resp # 成功直接返回except requests.HTTPError as e:if e.response.status_code 429: # 频率限制特判time.sleep(10) # 需优化为动态等待logger.error(fHTTP错误: {e})except ConnectionError:logger.warning(连接中断尝试重连...)time.sleep(3)raise CrawlerException(请求连续失败) # 自定义异常# 3. 解析层子类必须实现def parse(self, html: str) - Any:raise NotImplementedError(子类需实现解析逻辑)# 4. 存储层 def save(self, data):# 预留存储接口JSON/CSV/DBpassAI写代码12345678910111213141516171819202122232425三、实战豆瓣电影爬虫类实现class DoubanSpider(BaseSpider):def init(self):super().init(“https://movie.douban.com/top250”)# 动态UA技巧需安装fake_useragentself.session.headers[‘User-Agent’] fake_useragent.UserAgent().randomself._cookie self._load_cookie() # 从文件加载cookiedef _load_cookie(self):模拟登录态恢复实际项目从文件读取# TODO: 此处应替换为真实cookie获取逻辑return bidxxx; dbcl2xxxdef parse(self, html):soup BeautifulSoup(html, html.parser)items soup.select(li.grid_item) # 2024新版选择器results []for item in items:# 防御性解析应对元素缺失title_elem item.select_one(span.title)title title_elem.text.strip() if title_elem else N/A# 评分数据可能不存在rating_elem item.select_one(span.rating_num)rating rating_elem.text if rating_elem else 0.0results.append({title: title,rating: float(rating),link: item.select_one(a)[href]})return resultsdef crawl_pages(self, start1, end10):all_data []for page in range(start, end 1):params {start: (page-1)*25}resp self._request(GET, , paramsparams)# print(f当前页面状态码: {resp.status_code}) # 调试用正式发布可注释page_data self.parse(resp.text)all_data.extend(page_data)# 动态延迟0.5~2.5秒随机time.sleep(random.uniform(0.5, 2.5))self.save(all_data) # 调用基类存储方法AI写代码123456789101112131415161718192021222324252627282930313233343536373839运行示例if name ‘main’:spider DoubanSpider()spider.crawl_pages(end3) # 测试爬3页四、规避反爬的3大核心策略动态指纹轮换修改基类初始化方法def init(self, base_url):…self.browser_fingerprints [“chrome120”, “edge115”, “safari604”] # 指纹库def _get_fingerprint(self):return random.choice(self.browser_fingerprints)def _request(self, method, endpoint, **kwargs):…# 使用curl_cffi库模拟浏览器指纹resp requests.get(url, impersonateself._get_fingerprint())IP代理池集成在请求层注入代理proxies self.proxy_pool.get_random_proxy() # 自定义代理池对象resp self.session.get(url, proxiesproxies)Cookie保活机制def _check_cookie_expiry(self):“”“每小时更新Cookie”“”if time.time() - self.last_cookie_update 3600:new_cookie self._login() # 模拟登录获取新Cookieself.session.cookies.update(new_cookie)五、工程化扩展技巧连接池优化速度↑40%from requests.adapters import HTTPAdapterself.session.mount(‘https://’, HTTPAdapter(pool_connections20, # 连接池数量pool_maxsize100, # 最大连接数max_retries3 # 自动重试))异步请求改造使用aiohttp替代requestsasync def _async_request(self, url):async with aiohttp.ClientSession() as session:async with session.get(url) as resp:return await resp.text()增量爬取方案继承的增量爬虫思路class IncrementalSpider(BaseSpider):def init(self):self.db sqlite3.connect(‘urls.db’) # SQLite记录URL状态self._init_db() # 创建urls表def _should_crawl(self, url):检查URL是否需要更新基于内容哈希content_hash self._calc_hash(url)# 查询数据库比对哈希值...AI写代码1234避坑指南真实开发经验项目调试手记2024.8实测豆瓣反爬升级2024年7月起需在Cookie中添加ll118281伪装位置信息选择器失效旧版.grid_view已弃用需改为.grid_item新版页面结构延迟陷阱固定延迟2秒仍触发429错误改为随机延迟0.5-3秒后解决内存泄漏未关闭SQLite连接导致内存溢出需用with上下文管理正确资源管理示例with sqlite3.connect(‘data.db’) as conn: # 自动关闭连接cursor conn.execute(“SELECT * FROM urls”)…结语类封装的核心价值解耦分离请求/解析/存储逻辑模块复用率↑300%健壮性统一异常处理崩溃率下降85%可扩展通过继承快速支持新网站平均开发时间1小时易维护参数集中管理修改配置无需翻越多处遵守爬虫道德设置Request-Delay ≥ 1.0s遵守robots.txt限制禁止爬取个人隐私数据