网页爬虫分页异常:爬取结果数量与预期不符问题排查
问题分析与修复方案
核心问题点
- 分页范围错误:你写的
range(6,11)只遍历第6到10页(共5页),不是预期的1-10页,直接少了一半的页面来源。 - 房源链接提取不全:
case = soup.find_all('table', class_='list')返回的是整个列表的容器table,循环这个容器后只调用fix.find('a')——这只会拿到该table里的第一个房源链接,而非所有房源。 - 详情页数据重复写入:
aa = soup.find_all('div', class_='box')会返回多个box元素,循环时每次都用aa[0].text判断,还重复添加同一个URL和Təmiri值,最后drop_duplicates删掉重复项,导致有效数据进一步减少。 - IO操作效率低下:每次循环都生成DataFrame并写入Excel,既拖慢速度也没必要。
修复后的代码
import requests from bs4 import BeautifulSoup as bs import pandas as pd # 基础分页URL URL = 'https://yeniemlak.az/elan/axtar?emlak=1&elan_nov=1&seher%5B%5D=0&metro%5B%5D=0&qiymet=&qiymet2=&mertebe=&mertebe2=&otaq=&otaq2=&sahe_m=&sahe_m2=&sahe_s=&sahe_s2=&page=' base_url = 'https://yeniemlak.az/' urla = [] featuress = [] # 遍历1-10页,对应range(1,11) for page in range(1, 11): # 请求列表页 list_response = requests.get(URL + str(page)) list_soup = bs(list_response.text, 'html.parser') # 获取列表页中所有房源的链接(直接定位table.list内的所有a标签) house_links = list_soup.select('table.list a') for link in house_links: # 拼接完整详情页URL detail_url = base_url + link['href'] # 请求详情页 detail_response = requests.get(detail_url) detail_soup = bs(detail_response.text, 'html.parser') # 获取详情页的box内容,取第一个即可(仅需判断是否包含Təmirli) box_content = detail_soup.find('div', class_='box').text # 判断维修状态 temiri = 1 if 'Təmirli' in box_content else 0 # 添加数据到列表 urla.append(detail_url) featuress.append(temiri) # 所有数据收集完成后,生成DataFrame并去重、保存 df = pd.DataFrame({'URL': urla, 'Təmiri': featuress}) df = df.drop_duplicates() df.to_excel('yeniemlak_data.xlsx', index=False)
关键优化说明
- 修正分页范围:改用
range(1,11)遍历1到10页,覆盖预期的所有页面。 - 正确提取所有房源链接:使用
select('table.list a')直接拿到列表页内所有房源的a标签,确保不遗漏任何房源。 - 避免重复写入详情页数据:仅获取详情页的第一个box元素进行判断,无需循环所有box,减少无效重复数据。
- 优化IO操作:仅在所有数据收集完成后,一次性生成DataFrame并写入Excel,提升运行效率。
内容的提问来源于stack exchange,提问作者Rasim Dilbani
相关产品推荐
相关产品推荐

