无需Selenium实现aspx页面分页数据与详情抓取的方法
问题解答
问题原因
你遇到的driver.back()返回第一页的问题是站点特性导致的:该站点使用ASP.NET WebForm技术开发,分页状态存在页面的隐藏字段ViewState中,跳转详情页后回退时浏览器不会保留之前操作生成的动态状态,因此会回到初始的第一页,每次重新翻页自然耗时极长。
方案1:直接用Requests + BeautifulSoup实现采集(推荐,效率最高)
完全可以不用Selenium,直接模拟HTTP请求采集,速度比模拟浏览器操作快10倍以上,操作步骤如下:
- 抓包获取分页请求、详情请求的POST参数:打开浏览器F12控制台的「网络」标签,点击分页、点击详情按钮时,对应请求的Form Data里会包含
__VIEWSTATE、__EVENTTARGET、分页参数、详情记录ID等固定字段 - 每次请求携带对应参数向站点地址发POST请求,拿到返回的HTML内容
- 用BeautifulSoup解析列表页HTML拿到当前页所有记录的详情ID,再逐个请求详情页解析字段即可,完全不需要页面渲染、等待、回退的操作
方案2:Selenium方案优化(不想改整体逻辑可以用)
如果要保留现有Selenium逻辑不需要重写,只要修改跳转详情的操作就能解决回退重置的问题:点击详情时让页面在新标签页打开,采集完直接关闭详情标签页切回列表页即可,列表页的分页状态会完整保留,不需要重新跳转分页,核心操作示例代码如下:
# 按住Ctrl点击详情,在新标签页打开 ActionChains(driver).key_down(Keys.CONTROL).click(detail_list[curr]).key_up(Keys.CONTROL).perform() # 切换到新打开的详情标签页 driver.switch_to.window(driver.window_handles[-1]) # 原有采集详情的逻辑保留... # 采集完关闭当前详情标签页 driver.close() # 切回原来的列表标签页,分页状态不会丢失 driver.switch_to.window(driver.window_handles[0])
内容的提问来源于stack exchange,提问作者Demaxl
相关产品推荐
相关产品推荐

