Веб-очистка нескольких страниц с BeautifulSoup - PullRequest
1 голос
/ 22 октября 2019

Я собрал всю необходимую информацию с первой страницы, но не знаю, как собрать информацию со всех страниц сайта. Я пытаюсь найти свое решение в других темах stackoverflow, но ничего не понял. Я буду очень признателен, если вы поможете мне с этим.

мой сайт для разбора: https://jaze.ru/forum/topic?id=50&page=1

источник:

from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup

# my_url and cutoff mod_security 
my_url = Request('http://jaze.ru/forum/topic?id=50&page=1', headers={'User-Agent': 'Mozilla/5.0'})
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
# html parsing
page_soup = soup(page_html, "html.parser")
# grabs each name of player
containers = page_soup.findAll("div", {"class":"top-area"})


for container in containers:
    playerName = container.div.a.text.strip()
    print("BattlePass PlayerName: " + playerName)

source2

from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup

# start page
i = 1
while True:
    link = 'https://jaze.ru/forum/topic?id=50&page='+str(i)
    my_url = Request(
        link,
        headers={'User-Agent': 'Mozilla/5.0'}
    )
    i += 1  # increment page no for next run
    uClient = uReq(my_url)
    if uClient.url != link:
        break
    page_html = uClient.read()
    # Check if there was a redirect
    uClient.close()
    # html parsing
    page_soup = soup(page_html, "html.parser")
    # grabs each name of player
    containers = page_soup.findAll("div", {"class": "top-area"})

    # save all info to csv file
    filename = "BattlePassNicknames.csv"
    f = open(filename, "w", encoding="utf-8")

    headers1 = "Member of JAZE Battle Pass 2019\n"

    f.write(headers1)

    for container in containers:
        playerName = container.div.a.text.strip()
        print("BattlePass PlayerName: " + playerName)

        f.write(playerName + "\n")

    f.close()

1 Ответ

0 голосов
/ 22 октября 2019

Веб-сайт перенаправляет вас на другую страницу, если параметр запроса page больше последней доступной страницы, вы можете использовать его для увеличения page до тех пор, пока вы не будете перенаправлены. Это применимо, если вы уже знаете тему id (в данном случае 50).

from urllib.request import urlopen as uReq
from urllib.request import Request
from bs4 import BeautifulSoup as soup

# start page
i = 1
while True:
    link = 'https://jaze.ru/forum/topic?id=50&page='+str(i)
    my_url = Request(
        link,
        headers={'User-Agent': 'Mozilla/5.0'}
    )
    i += 1  # increment page no for next run
    uClient = uReq(my_url)
    if uClient.url != link:
        break
    page_html = uClient.read()
    # Check if there was a redirect
    uClient.close()
    # html parsing
    page_soup = soup(page_html, "html.parser")
    # grabs each name of player
    containers = page_soup.findAll("div", {"class": "top-area"})

    for container in containers:
        playerName = container.div.a.text.strip()
        print("BattlePass PlayerName: " + playerName)

Вывод

BattlePass PlayerName: VANTY3
BattlePass PlayerName: VANTY3
BattlePass PlayerName: KK#キング
BattlePass PlayerName: memories
BattlePass PlayerName: Waffel
BattlePass PlayerName: CynoBap
...
BattlePass PlayerName: Switchback

Если вы также хотите попробовать эту тему со случайной темой id s, тогда вам нужно обработать urllib.error.HTTPError где-то в вашем коде, чтобы иметь дело со всеми 404-ми и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...