Как можно преодолеть ограничение с парсингом только первой страницы списка IP-адресов игровых серверов с сайта https://cs-ms-monitoring.ru/all-servers/? Хочу записать все IP-адреса в файл на компьютере. Вот ссылка на мой текущий код: https://pastebin.com/Dq8ArMMK.
Одной из причин некорректной работы кода может быть то, что он парсит только первую страницу списка IP-адресов. Для того чтобы преодолеть это ограничение, можно использовать библиотеку requests для получения содержимого нескольких страниц сайта, а затем парсить IP-адреса со всех страниц.
Вот как можно модифицировать код:
```python
import requests
from bs4 import BeautifulSoup
base_url = "https://cs-ms-monitoring.ru/all-servers/?"
page = 1
while True:
url = base_url + "page=" + str(page)
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
ips = soup.find_all("span", class_="shortIP")
if not ips:
break
with open("ips.txt", "a") as file:
for ip in ips:
file.write(ip.text + "\n")
page += 1
```
Этот код будет парсить IP-адреса со всех страниц списка и записывать их в файл "ips.txt" на компьютере.
<blockquote>парсит только первую страницу</blockquote> Наверное, не первую, а последнюю? У вас на каждую итерацию <code class="python">while</code> массив найденных элементов затирается и используется потом только данные последней страницы. <br/> <br/> Отступы у <code class="python">for i in root:</code> нужно поправить - эта логика должна выполняться внутри цикла <code class="python">while</code> . <br/> А <code class="python">tage = []</code> нужно из цикла, наоборот, вынести. Ну а лучше вообще эту переменную убрать и писать в файл прямо внутри <code class="python">while</code> .
<blockquote>Знаю, что быдло код, просьба не критиковать , так как я только учась! :)</blockquote> <br/> А как Вы научитесь, если Вас не будут критиковать? <br/> <blockquote>Почему не парсит остальные страницы?</blockquote> <br/> Вас не смущает, что root находится в другой области видимости? <br/> <pre><code class="python">while cout_page < 8:
# ...
root = soup.findAll('span',{'class':'label label-default'})
for i in root:
tage.append(i.text)</code></pre> <br/> Вот так работает: <br/> <pre><code class="python">import requests
from bs4 import BeautifulSoup
start_page = 1
last_pages = 8
tags = []
for page in range(start_page, last_pages + 1):
url = f"https://cs-ms-monitoring.ru/all-servers/page/{page}/"
res = requests.get(url)
if res.status_code == 200:
soup = BeautifulSoup(res.text, "lxml")
root = soup.find_all('span', {'class': 'label label-default'})
tags.extend([tag.text for tag in root])
else:
print(f"Ошибка на странице {page}")
with open("base.txt", "w") as file:
for tag in tags:
file.write(tag + "\n")</code></pre> <br/>