MechanicalGroup的StatefulBrowser在while True循环中似乎无法正确刷新

2024-10-05 14:31:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用python抓取一个特定的网站(在本例中是一个论坛),将最近的帖子内容复制/粘贴到其他地方。为此,我的代码如下所示(不是完整的代码,对找到的url还进行了一些其他操作):

import mechanicalsoup as msp
import time

browser=msp.StatefulBrowser()
sleeptime=30
while True:
    Forum_url="url of the forum"
    browser.open(Forum_url)
    soup=browser.get_current_page()

    parent_of_time_element_of_threads=soup.find_all('div',{'class':'ipsDataItem_meta ipsType_reset ipsType_light ipsType_blendLinks'})
    list_of_all_dates=[] #date of each thread on the page
    for i in parent_of_time_element_of_threads:
        time_element_of_thread=i.findChild('time',recursive=True)['datetime']
        date=time_element_of_thread.strip('Z')
        list_of_all_dates.append(date)
    arg_of_most_recent_thread=np.array(list_of_all_dates,dtype='datetime64').argmax()
    url=parent_of_time_element_of_threads[arg_of_most_recent_thread].parent.find('a')['href']
    time.sleep(sleeptime)

在这一点上,我应该有最新线程的url,它通常应该每30秒刷新一次,以获得新的最新帖子的url,我可以用它进行其他操作。这项技术运行良好,但有一个问题

它确实能够在页面上获取最新的帖子,但是当新帖子出现时,最新的帖子实际出现在soup元素中需要5分钟的时间,无论页面通过browser.open刷新的频率如何

如果我自己通过浏览器进入论坛页面并强制刷新页面,例如,我会在0:00看到帖子a是最新的,然后在0:45出现帖子B。我希望程序中的url会在刷新发生时的1:00发生更改,但脚本仍然会将post A作为最新的返回,而post B将仅在5:30、6:00左右显示为最新的

就好像页面加载更改花费了整整5分钟,考虑到初始加载是以正常速度进行的,这很奇怪

我尝试在睡眠前添加一个soup.decompose(),以确保浏览器在下一次迭代中尝试论坛url时正确重置,但没有效果。我还尝试在每个循环中完全关闭StateFull浏览器,但没有任何区别。我还确保了日期查找逻辑是正确的,而且在我看来是正确的,只是post B没有出现在soup对象中

有解决办法吗


Tags: ofbrowserurltime页面elementallthread
1条回答
网友
1楼 · 发布于 2024-10-05 14:31:47

事实证明,问题不在于mechanicalsoup,而在于网站本身在重复使用browser.open(url)时没有刷新数据,而是在页面上使用一些菜单选项(排序选项)时,我成功地强制刷新了数据。最后,我使用selenium的chrome webdriver在菜单中导航,以执行触发强制刷新所需的操作

相关问题 更多 >