Python循环爬取分页数据时HTML写入被覆盖的问题求助
解决HTML文件被覆盖的问题
你遇到的核心问题有两个:一是每次循环都会重新初始化lines列表,导致只保留最后一页的数据;二是文件写入操作放在了循环内部,每次用'w'模式打开文件都会直接覆盖之前的内容。
下面是修复后的代码,我标注了关键修改点:
from selenium.common.exceptions import NoSuchElementException # 导入你需要的其他模块(比如webdriver、time等) # 修改1:把lines初始化移到循环外面,用来累积所有页面的数据行 lines = [] while True: time.sleep(10) golds = driver.find_elements_by_css_selector(".widgetContainer #widgetContent > div.singleCell") print("found %d golds" % len(golds)) template = """\ <tr class="border"> <td class="image"><img src="{0}"></td> <td class="title"><a href="{1}" target="_new">{2}</a></td> <td class="price">{3}</td> </tr>""" for gold in golds: goldInfo = {} goldInfo['title'] = gold.find_element_by_css_selector('#dealTitle > span').text goldInfo['link'] = gold.find_element_by_css_selector('#dealTitle').get_attribute('href') goldInfo['image'] = gold.find_element_by_css_selector('#dealImage img').get_attribute('src') try: goldInfo['price'] = gold.find_element_by_css_selector('.priceBlock > span').text except NoSuchElementException: goldInfo['price'] = 'No price display' line = template.format(goldInfo['image'], goldInfo['link'], goldInfo['title'], goldInfo['price']) lines.append(line) # 追加新页面的数据行,而非重新创建列表 try: # 点击下一页按钮 driver.find_element_by_link_text("Next→").click() except NoSuchElementException: print("没有更多页面了,退出循环") break time.sleep(10) # 修改2:把HTML生成和文件写入移到循环结束后,一次性写入所有数据 html = """\ <html> <body> <table> <tr class='headers'> <td class='image'></td> <td class='title'>Product</td> <td class='price'>Price / Deal</td> </tr> </table> <table class='data'> {0} </table> </body> </html>\ """ # 修改3:用with语句管理文件,自动关闭,避免手动关闭可能出现的遗漏 with open('./result.html', 'w', encoding='utf-8') as f: f.write(html.format('\n'.join(lines))) driver.quit() # 记得关闭浏览器实例
关键修改说明:
- 累积数据行:将
lines = []放在while True循环外部,确保每一页爬取到的数据都会追加到同一个列表中,不会丢失之前页面的内容。 - 统一写入文件:把生成完整HTML和写入文件的操作移到循环结束后,这样所有页面的数据都收集完成后,才会生成一次完整的HTML文件,彻底避免覆盖问题。
- 安全的文件操作:使用
with open(...)语句,它会在代码块执行完毕后自动关闭文件,比手动调用f.close()更可靠。
另外给个小优化建议:可以用WebDriverWait替代固定的time.sleep来等待元素加载,让代码更高效,示例如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待元素加载完成,最多等10秒 golds = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".widgetContainer #widgetContent > div.singleCell")) )
内容的提问来源于stack exchange,提问作者Bronson77
相关产品推荐
相关产品推荐

