酷代码 AI
菜单
全部AI  /  AI写代码神器
服务商

import requests from bs4 import BeautifulSoup import csv import time import random def get_anjuke_rental(page): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'Referer': 'https://km.anjuke.com/', 'Cookie': 'aQQ_ajkguid=DAD5FF6F-F8C7-3A74-D6D3-DDBD83A22773; ajk-appVersion=; fzq_h=c460b2e3f6fa0423cdfde83f31cc1ca7_1738734512582_d8af942581ce43adab63aaa3da34c3dc_1782055253; id58

代码问题分析 1. 反爬机制检测不全面:仅通过和响应文本进行简单的反爬检测,可能不够全面。 ```python if "验证" in soup.title.text or "安全验证" in response.text: print("触发反爬机制!") return ``` 2. 请求失败处理不完善:在请求失败时没有重试机制,可能导致数据丢失。 ```python if response.status_code != 200: print(f'第 {page} 页请求失败,状态码:{response.status_code}') return ``` 3. 异常处理不充分:在解析房源信息时,如果某个字段缺失或格式不对,程序会直接跳过该房源,没有详细记录错误信息。 ```python except Exception as e: print(f'第 {page} 页第 {index + 1} 个房源解析失败: {str(e)}') ``` 4. 硬编码的Headers和Cookies:这些信息可能会过期或失效,导致爬虫无法正常工作。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/Safari/537.36', 'Referer': 'https://km.anjuke.com/', 'Cookie': 'aQQ_ajkguid=DAD5FF6F-F8C7-3A74-D6D3-DDBD83A22773; ajk-appVersion=; fzq_h=c460b2e3f6fa0423cdfde83f31cc1ca7_1738734512582_d8af942581ce43adab63aaa3da34c3dc_1782055253; id58=CkwA6mei+7ohVG2DnYupAg==; ...' } ``` 5. 缺少CSV文件初始化:`writer`对象未定义,导致写入CSV文件时报错。 ```python writer.writerow([title, price, area, layout, orientation, region, tags]) ``` 代码优化方向 1. 增强反爬机制检测:增加更多的反爬检测条件,如检查页面中是否包含特定的反爬元素。 2. 添加请求失败重试机制:使用循环和延时来处理请求失败的情况。 3. 改进异常处理:详细记录每个房源解析失败的原因,并继续处理下一个房源。 4. 动态获取Headers和Cookies:通过模拟登录或其他方式动态获取有效的Headers和Cookies。 5. 初始化CSV文件:在使用`writer`之前先初始化CSV文件。 优化后的代码 ```python import requests from bs4 import BeautifulSoup import csv import time import random def get_anjuke_rental(page): # 动态获取Headers和Cookies(示例) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/Safari/537.36', 'Referer': 'https://km.anjuke.com/', 'Cookie': 'aQQ_ajkguid=DAD5FF6F-F8C7-3A74-D6D3-DDBD83A22773; aQ...' } url = f'https://km.zu.anjuke.com/fangyuan/p{page}/?kw=' # 注意分页参数 max_retries = 3 for attempt in range(max_retries): try: print(f'正在请求第 {page} 页:{url}') response = requests.get(url, headers=headers, timeout=15) response.encoding = 'utf-8' if response.status_code != 200: print(f'第 {page} 页请求失败,状态码:{response.status_code}') continue soup = BeautifulSoup(response.text, 'lxml') # 检测反爬机制 if "验证" in soup.title.text or "安全验证" in response.text or soup.find('div', class_='verify-container'): print("触发反爬机制!") return house_list = soup.find_all('div', class_='zu-itemmod clearfix') for index, house in enumerate(house_list): try: # title_tag = house.find('b', class_='strongbox') title = title_tag.text.strip() if title_tag else '' # 价格(直接提取<strong>内容) price_tag = house.find('strong', class_='price') price = price_tag.text.strip().replace('元/月', '') if price_tag else '' # 区域信息(清理多余字符) address_tag = house.find('address', class_='details-item tag') if address_tag: for a_tag in address_tag.find_all('a'): a_tag.decompose() region = address_tag.get_text(strip=True) \ .replace('\xa0', '') \ .replace(' ', '') \ .strip('-') else: region = '' # 面积、户型、朝向(从bot-tag提取) bot_tag = house.find('p', class_='details-item tag') details = [span.text.strip() for span in bot_tag.find_all('span', class_='cls-common')] if bot_tag else [] area = layout = orientation = '' for detail in details: if '㎡' in detail: area = detail.replace('㎡', '').strip() elif '室' in detail and '厅' in detail: layout = detail elif '朝' in detail: orientation = detail # 标签信息(直接使用details内容) tags = '|'.join(details) writer.writerow([title, price, area, layout, orientation, region, tags]) except Exception as e: print(f'第 {page} 页第 {index + 1} 个房源解析失败: {str(e)}') break # 如果成功请求并解析,跳出重试循环 except Exception as e: print(f'第 {page} 页请求失败,尝试次数 {attempt + 1}/{max_retries}: {str(e)}') time.sleep(random.uniform(1, 3)) # 随机等待一段时间再重试 continue # 初始化CSV文件 with open('anjuke_rentals.csv', mode='w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Title', 'Price', 'Area', 'Layout', 'Orientation', 'Region', 'Tags']) # 调用函数获取数据(示例) for page in range(1, 10): # 假设抓取前10页的数据 get_anjuke_rental(page) ``` 解释说明 1. 增强反爬机制检测:增加了对特定反爬元素的检测,确保爬虫能够识别出反爬机制。 2. 添加请求失败重试机制:使用循环和延时来处理请求失败的情况,最多重试三次。 3. 改进异常处理:详细记录每个房源解析失败的原因,并继续处理下一个房源。 4. 动态获取Headers和Cookies:示例中简化了Headers和Cookies的获取过程,实际项目中可以通过模拟登录或其他方式动态获取。 5. 初始化CSV文件:在使用`writer`之前先初始化CSV文件,确保数据能够正确写入。 [2025-02-07 14:32:11 | AI写代码神器 | 1989点数解答]

热门AI查看更多
“AI写代码神器”擅长各种语言编程、解释代码、注解补充。 在这里填写你的问题。如:写出java冒泡排序算法。
一个入口掌握所有。 在这输入任何问题,或者要AI输出的内容。
将阿拉伯数字转为人明币大写,如:数字1000转换为壹仟。
AI生成爆文标题,能够快速创作出极具吸引力的标题,促使短视频、自媒体文章的点击率与阅读量迅猛攀升。 此处填写一个原始标题,如:一般人怎样打理自身的社交圈?
AI生成新闻评论。 在这里填入新闻内容。
AI生成内容摘要。 在此处填入需要生成摘要的内容,还可以输入4000字。
AI生成主持词,擅长团建、年会、婚礼、节日等场合的主持词编写。 在这里填入主持场景,如:运动会
AI快速生成周报、月报、日报、年终总结等各类总结报告。 在这里简单输入工作目标、指标、成果,没有任何格式或特殊需求。如:计划年销售业绩1000万,实际完成800万。
输入一个字,显示以这个字开头的歇后语
输入一个字,显示以这个字开头的成语
极速在线生成证件照
极速更换证件照红、蓝、白底色
实用工具查看更多
阿里云99元2核2G服务器/年,199元2核4G服务器随心买。
今日油价 [生活类]
全国各省油价,实时更新。
图片互转base64 [开发类]
将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页、编辑器中。 这对于一些小的图片是极为方便的,因为你不需要再去寻找一个保存图片的地方。
时间转换器 [开发类]
时间戳转换器,时间、毫秒、秒、倒计时查看
录入名字、电话、邮箱、个人介绍信息,生成二维码,可通过此码扫码添加微信联系人
数独游戏 [娱乐类]
数独(Sudoku)是经典的9x9数字逻辑谜题。在有81个小格的九宫格内,玩家依据初始数字推理填入1 - 9的数字,要保证每行、每列以及每个3x3宫格中的数字都不重复。这款在线数独游戏有多难度可选,没有头绪时,可以点开答案看一下哦^_^
经典推箱子 [娱乐类]
基于H5的经典推箱子小游戏,锻炼玩家的眼力和反应力,非常不错
AI摸鱼五子棋 [娱乐类]
基于H5的五子棋人机对练,锻炼玩家的眼力和反应力,非常不错
相关提问