Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

主题贴获取问题 #239

Closed
Misaka19327 opened this issue Nov 16, 2024 · 19 comments
Closed

主题贴获取问题 #239

Misaka19327 opened this issue Nov 16, 2024 · 19 comments
Labels
bug Something isn't working

Comments

@Misaka19327
Copy link

我是最近才开始用贴吧的,以前确实对它没什么了解。我想要获取一个吧里所有的主题贴进行筛选,写的代码是这样的(还没到筛的那一步):

async def main():
    async with tb.Client(BDUSS) as client:
        target_forum = await client.get_forum("xx吧")
        tab_map = await client.get_tab_map(target_forum.fid)

        sum_data = {}
        page = 1
        have_next_page = True
        while have_next_page:
            threads = await client.get_threads(target_forum.fid, pn=page)
            print(page)
            print(len(threads.objs))
            if threads.has_more:
                have_next_page = True
            else:
                have_next_page = False
            for thread in threads.objs:
                sum_data[thread.title] = thread.fid
            page += 1

我看运行结果上拿到的是不到5000个主题贴,但是电脑版网页上写的这个吧一共有1.8w个主题贴,我不太确定这两个说的是不是一个东西?

@n0099
Copy link

n0099 commented Nov 16, 2024

#124regression

@Misaka19327
Copy link
Author

#124 的[regression]

看到了 但是有点没看懂(?)也就是说5k个主题帖这个是正常的 是百度后端加的限制么

@Misaka19327
Copy link
Author

umm 不太确定是不是一样的情况 我这边这个吧是能在电脑网页端看到360页 大概1.8w个主题帖 调接口的时候也有确认过 page 从0循环到500 从180多之后objs就全都是0了 也没返回page为1的内容 而且是该说如果是一个情况的话 这限制给的也太小了(?)

@n0099
Copy link

n0099 commented Nov 16, 2024

不太确定这两个说的是不是一个东西

就是说5k个主题帖这个是正常的

是百度后端加的限制么

都是人为限制

在电脑网页端看到360页 大概1.8w个主题帖

丶那个[尾页]按钮后的url中的?pnquerystring值是不是18000左右的50(网页端默认rn)倍数?

page 从0循环

pn不是 https://en.wikipedia.org/wiki/Zero-based_numbering

也没返回page为1的内容

超过pn上限应该是回到第一页

可能自23年5月 #124 以来贴吧后端带pm又在暗改加速倒车回到了19年4月b吧事件之后(当时是20k->10k,现在您说5k

@Misaka19327
Copy link
Author

尾页按钮的 url 能看到pn=18000

@lumina37
Copy link
Owner

最近官方那边加了个限制,第一页最多获取13个主题帖,如果还是用rn=30的话第一页和第二页之间会出现空泡,所以现在的临时解决方案是把rn设成13。估计原本的rn=30是可以全覆盖的,现在就不行了

@lumina37 lumina37 added the bug Something isn't working label Nov 17, 2024
@Misaka19327
Copy link
Author

现在的限制好像是在页数上做的 我试了rn=13 30 100 最后都在pn=173之后就没法再获取了 能获取的就分别是2k 5k和17k左右的帖子

@Misaka19327
Copy link
Author

我这里暂时没有问题了 感谢上面两位的解答

@n0099
Copy link

n0099 commented Nov 17, 2024

最近官方那边加了个限制,第一页最多获取13个主题帖

所以你们最近在光速适配 #238 5684c08 dog194/TiebaManager@8dbe25a 而我暂且蒙古

@n0099
Copy link

n0099 commented Nov 17, 2024

我试了rn=13 30 100 最后都在pn=173之后就没法再获取了 能获取的就分别是2k 5k和17k左右的帖子

那继续加rn>100呢?

现在的限制好像是在页数上做的

以前是rn*pn
pn=173这个数有什么特别的?
您试过别的不同目录的吧也都这样吗?

@Misaka19327
Copy link
Author

async def main():
    async with (tb.Client(BDUSS) as client):
        target_forum = await client.get_forum("xx吧")
        page = 1
        thread_num = 0
        while True:
            threads = await client.get_threads(target_forum.fid, pn=page, rn=120)
            thread_num += len(threads.objs)
            print(f"Fetched page {page}, {len(threads.objs)} threads, sum {thread_num} threads")
            page += 1
            if page > 200:
                break

asyncio.run(main())

代码如上,rn大于120的时候,能够获得的还是100个thread。
image
image

换成漫画吧之后,至少两百页内没有问题,都能正常获得。这吧本身就有20多w个主题贴。

找了个小吧试了一下,此花亭奇谭吧,主题贴共有1097个,这回是从page=12开始就获取不到数据。
19df6bb1f4a1dde5e98d7f5dc90d86b
0bd322b6486b3296b8c5841d06a912e
2398ca0825fe9c29c4630cf6c16de49

我感觉应该是贴吧按已经有的主题贴算的page,然后直接限制这个page之后都没法获取数据?

@Misaka19327
Copy link
Author

另外确实是没有discussion区,所以我就直接在这问了 。

while has_more:
    posts = await client.get_posts(thread.tid, only_thread_author=True, pn=page)
    has_more = posts.has_more
    for post in posts.objs:
        text_count += len(post.text)
    page += 1

这部分代码会报这个"<2024-11-18 00:54:56.008> [WARN] [get_posts] list assignment index out of range. args=(9086187007,) kwargs={'only_thread_author': True, 'pn': 1}",一开始我以为是因为这个帖lz就没发回复楼,后来发现不对,不能连着一百多个主题贴lz都不发回复楼的吧,所以不太明白这是因为什么?

@lumina37
Copy link
Owner

另外确实是没有discussion区,所以我就直接在这问了 。

while has_more:
    posts = await client.get_posts(thread.tid, only_thread_author=True, pn=page)
    has_more = posts.has_more
    for post in posts.objs:
        text_count += len(post.text)
    page += 1

这部分代码会报这个"<2024-11-18 00:54:56.008> [WARN] [get_posts] list assignment index out of range. args=(9086187007,) kwargs={'only_thread_author': True, 'pn': 1}",一开始我以为是因为这个帖lz就没发回复楼,后来发现不对,不能连着一百多个主题贴lz都不发回复楼的吧,所以不太明白这是因为什么?

我这用同样的参数复现不出来,你用的是master分支吗

@Misaka19327
Copy link
Author

是吧?我用的就是直接 pip install 的,pip list 看了一下版本也和最新的 release 一样来着

不过这个接口是不是有限制,我现在再试的时候只有一开始的十来个帖子可以这么统计,之后的帖子就还是报这个错,再重新运行的时候所有的帖子都报这个错。

@lumina37
Copy link
Owner

难道是频率太高了,一般这个报错是后端没返回发帖用户信息导致的

@Misaka19327
Copy link
Author

明白了 那我随机sleep一下再看看

@Misaka19327
Copy link
Author

我在每次get_posts之前都sleep(randint(1, 7)),结果还是会被限制,只能放弃了。感谢作者解答

@n0099
Copy link

n0099 commented Nov 20, 2024

主题贴共有1097个,这回是从page=12开始就获取不到数据

贴吧按已经有的主题贴算的page,然后直接限制这个page之后都没法获取数据?

那它司马,如果是在LLM带革命背景之下反爬虫(而百度本身就是国内爪巴和allinai前头子)也应该是限制爬大型吧而非小型吧

另外确实是没有discussion区,所以我就直接在这问了 。

不相关的建议另外开issue

n0099 added a commit to n0099/open-tbm that referenced this issue Dec 8, 2024
@n0099
Copy link

n0099 commented Dec 14, 2024

#243 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants