mechanicalsoup 的 StatefulBrowser 似乎没有在 while True 循环中正确刷新
mechanicalsoup's StatefulBrowser does not seem to refresh correctly in a while True loop
我使用 python 将特定网站(在本例中为论坛)抓取到 copy/paste 最新 post 的内容到其他地方。为此,我的代码看起来像这样(不是完整代码,找到的 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 秒刷新一次以获得新的最新 post 的 url我用它做一些其他操作。该技术运行良好,但有一个问题。
它确实设法在页面上获取最新的 post,但是当出现新的 post 时,它需要 5 分钟才能显示最新的 post实际上出现在 soup 元素中,无论页面通过 browser.open
刷新的频率如何
如果我自己通过浏览器进入论坛页面并强制刷新页面,例如,我会看到 post A 是最新的 0:00,然后 post B 将出现在 0:45。我希望在刷新时看到程序中的 url 在 1:00 发生变化,但脚本仍然是 returns post A 作为最新的,并且 post B 只会出现在 5:30、6:00.
左右最近的
页面加载更改好像花了整整 5 分钟,考虑到初始加载以正常速度发生,这很奇怪
我尝试在睡眠前添加一个 soup.decompose() 以尝试确保浏览器在接下来的迭代中尝试论坛 url 时正确重置,但无济于事。我还尝试在每个循环中完全关闭 StateFull 浏览器,但这没有任何区别。我还确保日期查找逻辑是合理的,它看起来对我来说是正确的,只是 post B 没有出现在 soup 对象中
有解决办法吗?
事实证明,问题不在于 mechanicalsoup,而在于网站本身在简单地重复使用 browser.open(url) 时没有刷新数据,而是在使用一些菜单时页面上的选项(排序选项),我设法强制刷新数据。我最终使用 selenium 的 chrome webdriver 在菜单中导航以执行触发强制刷新所需的操作。
我使用 python 将特定网站(在本例中为论坛)抓取到 copy/paste 最新 post 的内容到其他地方。为此,我的代码看起来像这样(不是完整代码,找到的 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 秒刷新一次以获得新的最新 post 的 url我用它做一些其他操作。该技术运行良好,但有一个问题。
它确实设法在页面上获取最新的 post,但是当出现新的 post 时,它需要 5 分钟才能显示最新的 post实际上出现在 soup 元素中,无论页面通过 browser.open
刷新的频率如何如果我自己通过浏览器进入论坛页面并强制刷新页面,例如,我会看到 post A 是最新的 0:00,然后 post B 将出现在 0:45。我希望在刷新时看到程序中的 url 在 1:00 发生变化,但脚本仍然是 returns post A 作为最新的,并且 post B 只会出现在 5:30、6:00.
左右最近的页面加载更改好像花了整整 5 分钟,考虑到初始加载以正常速度发生,这很奇怪
我尝试在睡眠前添加一个 soup.decompose() 以尝试确保浏览器在接下来的迭代中尝试论坛 url 时正确重置,但无济于事。我还尝试在每个循环中完全关闭 StateFull 浏览器,但这没有任何区别。我还确保日期查找逻辑是合理的,它看起来对我来说是正确的,只是 post B 没有出现在 soup 对象中
有解决办法吗?
事实证明,问题不在于 mechanicalsoup,而在于网站本身在简单地重复使用 browser.open(url) 时没有刷新数据,而是在使用一些菜单时页面上的选项(排序选项),我设法强制刷新数据。我最终使用 selenium 的 chrome webdriver 在菜单中导航以执行触发强制刷新所需的操作。