запросы bs4 не дают результатов от страниц

#beautifulsoup #python-requests #python-3.5

#beautifulsoup #python-запросы #python-3.5

Вопрос:

Вот код, который может получать информацию изhttps://www.gabar.org/membersearchresults.cfm

но не могут из https://www.gabar.org/membersearchresults.cfm?start=1amp;id=70FFBD1B-9C8E-9913-79DBB8B989DED6C1

 from bs4 import BeautifulSoup
import requests
import traceback


links_to_visit = []
navigation_links = []  # for testing next button

base_url = 'https://www.gabar.org'


def make_soup(link):
    r = requests.get(link)
    soup = BeautifulSoup(r.content, 'html.parser')
    return soup


def all_results(url):
    global links_to_visit
    global navigation_links
    soup = make_soup(url)
    print(soup)
    div = soup.find('div', {'class': 'cs_control'})
    links = div.find_all('a')
    print(links)
    for link in links:
        try:
            if link.text == 'Next':  # prev, next, new search
                navigation_links.append(link)
                print('got it')
            elif not '/MemberSearchDetail.cfm?ID=' in link.get('href'):
                pass  # I dont need that link
            else:
                links_to_visit.append(link)
        except:
            traceback.print_exc()
    print(len(links_to_visit))
    print(links_to_visit)
    #print(links_to_visit[-1].get('href'))


def start():
    flag = 1
    page = 1
    while page < 60716:
        flag = 0
        if navigation_links[-1].text == 'Next':
            flag = 1
            next_link = navigation_links[-1]
            #print(next_link.get('href'))
        page  = 25
        print(base_url   next_link.get('href'))
        all_results(base_url   next_link.get('href'))
        print('page is:', page)

if __name__ == '__main__':
    all_results('https://www.gabar.org/membersearchresults.cfm')
    start()
  

Что мне нужно понять или сделать, если я хочу получить полный результат?

Ответ №1:

Что вам нужно понять, так это то, что существует нечто большее, чем URL-адрес HTTP-запроса. В этом случае результат поиска доступен только для сеанса, который выполнил поиск, и, следовательно, может быть просмотрен по страницам только в том случае, если вы являетесь «владельцем» этого сеанса. Большинство веб-сайтов идентифицируют сеанс с помощью сеансовых файлов cookie, которые вам нужно отправить вместе с вашим HTTP-запросом.

Это может быть огромной проблемой, но, к счастью, pythons requests позаботится обо всем этом за вас с requests.session . Вместо использования requests.get(url) вы инициализируете сеанс session=requests.session() , а затем используете этот сеанс в последующих запросах session.get(url) . Это автоматически сохранит файлы cookie для вас и во многих отношениях будет вести себя так же, как в реальном браузере.

Вы можете прочитать больше о том, как работает requests.session здесь.

И последнее, но не менее важное, ваш исправленный код =)

 from bs4 import BeautifulSoup
import requests
import traceback


links_to_visit = []
navigation_links = []  # for testing next button
# we initialize the session here
session = requests.session()

base_url = 'https://www.gabar.org'


def make_soup(link):
    # r = requests.get(link)
    # we use the session here in order to preserve cookies across requests
    r = session.get(link)
    soup = BeautifulSoup(r.content, 'html.parser')
    return soup


def all_results(url):
    # globals are almost never needed or recommended and certainly not here.
    # you can just leave this out
    # global links_to_visit
    # global navigation_links
    soup = make_soup(url)
    print(soup)
    div = soup.find('div', {'class': 'cs_control'})
    links = div.find_all('a')
    print(links)
    for link in links:
        try:
            if link.text == 'Next':  # prev, next, new search
                navigation_links.append(link)
                print('got it')
            elif not '/MemberSearchDetail.cfm?ID=' in link.get('href'):
                pass  # I dont need that link
            else:
                links_to_visit.append(link)
        except:
            traceback.print_exc()
    print(len(links_to_visit))
    print(links_to_visit)
    #print(links_to_visit[-1].get('href'))


def start():
    flag = 1
    page = 1
    while page < 60716:
        flag = 0
        if navigation_links[-1].text == 'Next':
            flag = 1
            next_link = navigation_links[-1]
            #print(next_link.get('href'))
        page  = 25
        print(base_url   next_link.get('href'))
        all_results(base_url   next_link.get('href'))
        print('page is:', page)

if __name__ == '__main__':
    all_results('https://www.gabar.org/membersearchresults.cfm')
    start()