0

我使用 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,我用它来做一些其他操作。该技术效果很好,但有一个问题。

它确实设法在页面上获取最新帖子,但是当出现新帖子时,无论页面通过浏览器刷新的频率如何,都需要 5 分钟才能真正出现在汤元素中。打开

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

页面加载更改好像花了整整 5 分钟,考虑到初始加载以正常速度发生,这很奇怪

我尝试在睡眠之前添加一个 soup.decompose() 以尝试确保浏览器在以下迭代中尝试论坛 url 时正确重置,但无济于事。我还尝试在每个循环中完全关闭 StateFull 浏览器,但这没有任何区别。我还确保日期查找逻辑是合理的,并且对我来说看起来是正确的,只是帖子 B 没有出现在汤对象中

有解决方案吗?

4

1 回答 1

0

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

于 2020-05-22T23:28:40.497 回答