Python web-scraping перейти на следующую страницу - PullRequest
0 голосов
/ 09 октября 2018

Код просто печатает одни и те же адреса электронной почты снова и снова и не переходит на следующую страницу.Кто-нибудь видит ошибку в моем коде?

import requests
from bs4 import BeautifulSoup as soup
def get_emails(_links:list):
for i in range(len(_links)):
 new_d = soup(requests.get(_links[i]).text, 'html.parser').find_all('a', {'class':'my_modal_open'})
 if new_d:
   yield new_d[-1]['title']

start=20
while True:
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start=20').text, 'html.parser')

results = [i['href'] for i in d.find_all('a')][52:-9]
results = [link for link in results if link.startswith('http://')]
print(list(get_emails(results)))

next_page=d.find('div', {'class': 'paging'}, 'weiter')

if next_page:

    d=next_page.get('href')
    start+=20
else:
    break

Когда вы нажимаете кнопку "weiter" (следующая страница), изменение названия изменяется с "... start = 20" на "start = 40".Это происходит за 20 секунд, потому что на каждый сайт приходится 20 результатов.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Предполагая, что next_page возвращает что-либо, проблема в том, что вы пытаетесь сделать одно и то же дважды дважды, но ни одно из них не выполняется должным образом:

1.) Вы пытаетесь указать dна следующую страницу, и все же в начале цикла вы снова назначаете d на начальную страницу.

2.) Вы пытаетесь назначить start+=20 для следующей страницы, но вы 'не ссылаясь на start в какой-либо части вашего кода.

Таким образом, у вас есть два способа решения этой проблемы:

1.) Переместите назначение d за пределы цикла иудалите объект start в целом:

# start=20
# You don't need start because it's not being used at all

# move the initial d assignment outside the loop
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start=20').text, 'html.parser')
while True:
    # rest of your code

if next_page:

    d=next_page.get('href')
    # start+=20
    # Again, you don't need the start any more.
else:
    break

2.) Нет необходимости переназначать d, просто укажите start в вашем URL в начале цикла и удалите присвоение d вif next_page:

start=20
while True:
d = soup(requests.get('http://www.schulliste.eu/type/gymnasien/?bundesland=&start={page_id}'.format(page_id=start).text, 'html.parser')

# rest of your code

if next_page:

    # d=next_page.get('href')
    # this d assignment is redundant as it will get reassigned in the loop.  Start is your key.
    start+=20
else:
    break
0 голосов
/ 09 октября 2018

Проблема с URL, который вы запрашиваете.Один и тот же URL-адрес запрашивается каждый раз, потому что вы не обновляете URL-адрес при начальном вычислении.Попробуйте изменить URL следующим образом:

'http://www.schulliste.eu/type/gymnasien/?bundesland=&start={}'.format(start)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...