当前位置: 首页 > 知识库问答 >
问题:

python - 爬虫requests.get无限刷新加载,呈现卡死特征,如何处理?

祝昊东
2024-10-12

初学者一个,爬取某网站url
html=requests.get(url=url).text#,headers=headers,timeout=10
一直卡主不返回,加上headers timeout无效,代码改为

def ff_webdriver_html(url):
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get(url)    #请求和获取页面
    page_source = driver.page_source                #获得页面的源代码
    print(page_source)
    return page_source
    driver.close()
    driver.quit()
    return page_source
print(ff_webdriver_html(url))

原来并不是卡死,而是在加载完成后还在无限加载

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

data: {"rc":0,"rt":2,"svr":177617933,"lt":1,"full":1,"dlmkts":"","data":null}

如何在初次加载完成后立即返回不再重复加载,手动点击stop按钮即可返回,如何在初次加载完成后立即返回不再重复加载,手动点击stop按钮即可返回,如何在
driver.get(url) #请求和获取页面
之后模拟点击stop按钮,或者其它更好的处理,如果用requests.get(url=url)或DrissionPage可以解决就更好了

在`driver.get(url)之前加

    driver.set_page_load_timeout(5)  

解决,谢谢

共有1个答案

庾君博
2024-10-12

针对你遇到的问题,这里有几个可能的解决方案和考虑因素:

1. 使用Selenium WebDriver处理动态加载内容

由于requests.get方法无法处理JavaScript动态加载的内容,而你的页面似乎在加载完成后还有JavaScript脚本在不断地刷新或加载数据,因此使用Selenium是一个更合适的选择。然而,你的代码中driver.close()driver.quit()的调用位置不正确,导致这些调用在return之后执行,这是无效的。

修正后的代码

from selenium import webdriver

def ff_webdriver_html(url):
    driver = webdriver.Chrome()
    try:
        driver.get(url)  # 请求和获取页面
        # 等待页面初步加载完成,可以使用显式等待(Explicit Wait)来等待某个元素的出现
        # 这里只是示例,具体等待条件需根据实际页面元素调整
        # from selenium.webdriver.common.by import By
        # from selenium.webdriver.support.ui import WebDriverWait
        # from selenium.webdriver.support import expected_conditions as EC
        # WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "someElementId")))

        page_source = driver.page_source  # 获得页面的源代码
        print(page_source)
        return page_source
    finally:
        driver.quit()  # 确保在函数结束时关闭浏览器

# 使用函数
url = "你的目标URL"
print(ff_webdriver_html(url))

2. 阻止无限加载

如果页面在加载完成后还在不断地通过JavaScript请求数据,你可以尝试以下几种方法来阻止这种行为:

  • JavaScript执行阻止:在Selenium中获取页面源代码之前,可以通过执行JavaScript代码来停止或禁用页面上的某些脚本。
  • 网络请求拦截:使用Selenium的DevTools协议(通过selenium-wirebrowsermob-proxy等工具)来拦截和修改网络请求。
  • 页面元素交互:如果页面上有“停止加载”或类似的按钮,你可以使用Selenium来模拟点击这个按钮。

例如,如果你知道可以通过执行特定的JavaScript代码来停止加载,可以这样做:

driver.execute_script("你的JavaScript代码,用于停止加载")

3. 考虑使用其他工具或方法

  • PyPuppeteer:类似于Selenium,但基于Chrome的Puppeteer,可能更适合处理现代Web应用的动态内容。
  • 网络请求模拟:如果数据是通过API获取的,并且API是可访问的,那么直接调用API可能是一个更高效的解决方案。

4. 调试和日志

  • 浏览器开发者工具:使用Chrome或Firefox的开发者工具来观察网络请求和页面上的JavaScript活动,这有助于理解页面是如何工作的。
  • Selenium日志:启用Selenium的日志记录功能,以获取更详细的运行信息。

希望这些建议能帮助你解决问题!

 类似资料:
  • 本文向大家介绍Python无头爬虫下载文件的实现,包括了Python无头爬虫下载文件的实现的使用技巧和注意事项,需要的朋友参考一下 有些页面并不能直接用requests获取到内容,会动态执行一些js代码生成内容。这个文章主要是对付那些特殊页面的,比如必须要进行js调用才能下载的情况。 安装chrome 安装chromedriver 淘宝源(推荐)   感谢这篇博客 上述步骤可以选择适合自己的版本下

  • 本文向大家介绍PHP一个简单的无需刷新爬虫,包括了PHP一个简单的无需刷新爬虫的使用技巧和注意事项,需要的朋友参考一下 由于只是一个小示例,所以过程化简单写了,小菜随便参考,大神大可点解 接下的入表库当然就不写了,那些更小意思了~就此别过吧~ 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对呐喊教程的支持。如果你想了解更多相关内容请查看下面相

  • 问题内容: 这是一个非常基本的问题-但我无法通过在线搜索找到答案。 我正在使用python控制ArcGIS,并且有一个简单的python脚本,该脚本调用了一些预先编写的代码。 但是,当我对预写代码进行更改时,它似乎没有导致任何更改。我导入了此模块,并尝试刷新它,但是没有任何反应。 我什至将它调用的文件移到了另一个位置,脚本仍然可以正常工作。昨天我做的一件事是我将所有python文件都添加到sys路

  • 本文向大家介绍python实现爬虫下载美女图片,包括了python实现爬虫下载美女图片的使用技巧和注意事项,需要的朋友参考一下 本次爬取的贴吧是百度的美女吧,给广大男同胞们一些激励 在爬取之前需要在浏览器先登录百度贴吧的帐号,各位也可以在代码中使用post提交或者加入cookie 爬行地址:http://tieba.baidu.com/f?kw=%E7%BE%8E%E5%A5%B3&ie=utf-

  • 本文向大家介绍python爬虫刷访问量 2019 7月,包括了python爬虫刷访问量 2019 7月的使用技巧和注意事项,需要的朋友参考一下 看着自己少得可怜的访问量,突然有一个想用爬虫刷访问量的想法,主要也是抱着尝试的心态,学习学习。 其实市面上有一些软件可以代刷流量 比如 流量精灵,使用感确实比我们自己写的代码要好一些 第一版:网上借鉴了一下           以下代码运行在 python

  • 问题内容: 我正在尝试实现一些功能,即单击屏幕上的按钮将导致我的[QuerydataTable刷新(因为自创建dataTable以来服务器端数据源可能已更改)。 这是我所拥有的: 但是当我运行它时,它什么也没做。单击按钮时刷新dataTable的正确方法是什么?提前致谢! 问题答案: 您可以尝试以下方法: