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

初学者一个,爬取某网站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)  

解决,谢谢

阅读 702
avatarAI BotBETA

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

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的日志记录功能,以获取更详细的运行信息。

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏