4pda основан на ip.board, все загружается без танцев с бубном, только осторожно, без авторизации получаются другие страницы чуть в ином формате. Вот пример кода на основе
simple_html_dom:
<?php
include('simple_html_dom.php');
// ссылка на первую страницу темы
define('START_URL','https://4pda.to/forum/index.php?showtopic=1084129');
// количество страниц &st= из ссылки » в навигаторе по страницам
define('PAGES_CNT',580);
@mkdir('data');
for($i=0;$i<=PAGES_CNT;$i+=20)
{
// формируем url
$url=START_URL.($i==0?'':'&st='.$i);
// имя кеш файла чтобы не загружать повторно
$cache_fn='data/'.md5(START_URL).'.'.$i.'.html';
if(!file_exists($cache_fn))
{
// Загружаем страницу
$data=file_get_contents($url);
// сохраняем страницу в кеше
file_put_contents($cache_fn,$data);
// пауза между запросами к серверу для защиты его от ddos
sleep(1);
} else
{
// читаем из кеша
$data=file_get_contents($cache_fn);
}
$html=str_get_html($data);
$num=0;
foreach($html->find('div[class]:not([class=""]') as $post)
{ // перебираем посты в теме
// пропускаем первый пост темы, он дублируется на каждой странице
if($num++==0) continue;
// выводим пост на экран
$post_html=$post->find('div.post_body',0)->text();
echo $post_html.PHP_EOL;
}
// вставляем разделитель между постами
echo '<hr/>'.PHP_EOL;
$html->clear();
}
?>
вернет на экран посты указанные в START_URL, мне лень было вычислять конец треда автоматически, бери количество постов вручную из навигатора постов.
Страницы можешь вручную указать
for($i=0;$i<=PAGES_CNT;$i+=20)
вместо 0 - начальный (с шагом 20) и PAGES_CNT конечный пост.
Вместо текстового представления
$post_html=$post->find('div.post_body',0)->text();
можешь сложнее структуру сообщения анализировать, выявляя цитирования и к примеру исключая их из текста (они занимают большую часть всего, дублируя многократно информацию).
Конкретно этот пример не влезет в контекстное окно бесплатного claude - это 70к токенов. Поэтому дели на куски.