#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()