Как я могу получить данные с веб-сайта с помощью BeautifulSoup и запросов? - PullRequest
0 голосов
/ 18 июня 2020

Я новичок в парсинге веб-страниц, и мне нужна помощь в решении этой проблемы. Веб-сайт allrecipes.com - это веб-сайт, на котором вы можете найти рецепты на основе поиска, который в данном случае представляет собой 'p ie':

ссылка на html файл: 'view-source : https://www.allrecipes.com/search/results/?wt=pie&sort=re '(щелкните правой кнопкой мыши-> просмотреть исходный код страницы)

Я хочу создать программу, которая принимает ввод, выполняет поиск по всем рецептам и возвращает список с кортежами первые пять рецептов с такими данными, как время приготовления, выход порции, ингредиенты и т. д. Это моя программа на данный момент:

import requests
from bs4 import BeautifulSoup

def searchdata():
    inp=input('what recipe would you like to search')
    url ='http://www.allrecipes.com/search/results/?wt='+str(inp)+'&sort=re'
    r=requests.get(url)
    soup = BeautifulSoup(r.text, 'html.parser')
    links=[]

    #fill in code for finding top 3 or five links


    for i in range(3)
        a = requests.get(links[i])
        soupa = BeautifulSoup(a.text, 'html.parser')

        #fill in code to find name, ingrediants, time, and serving size with data from soupa



        names=[]
        time=[]
        servings=[]
        ratings=[]
        ingrediants=[]





searchdata()

Да, я знаю, мой код очень беспорядочный, но что я должен заполнить в двух областях заполнения кода? Спасибо

1 Ответ

0 голосов
/ 21 июня 2020

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

import requests
from time import sleep
from bs4 import BeautifulSoup


class Scraper:
    links = []
    names = []

    def get_url(self, url):
        url = requests.get(url)
        self.soup = BeautifulSoup(url.content, 'html.parser')

    def print_info(self, name):
        self.get_url(f'https://www.allrecipes.com/search/results/?wt={name}&sort=re')
        if self.soup.find('span', class_='subtext').text.strip()[0] == '0':
            print(f'No recipes found for {name}')
            return
        results = self.soup.find('section', id='fixedGridSection')
        articles = results.find_all('article')
        texts = []
        for article in articles:
            txt = article.find('h3', class_='fixed-recipe-card__h3')
            if txt:
                if len(texts) < 5:
                    texts.append(txt)
                else:
                    break
        self.links = [txt.a['href'] for txt in texts]
        self.names = [txt.a.span.text for txt in texts]
        self.get_data()

    def get_data(self):
        for i, link in enumerate(self.links):
            self.get_url(link)
            print('-' * 4 + self.names[i] + '-' * 4)
            info_names = [div.text.strip() for div in self.soup.find_all(
                'div', class_='recipe-meta-item-header')]
            ingredient_spans = self.soup.find_all('span', class_='ingredients-item-name')
            ingredients = [span.text.strip() for span in ingredient_spans]
            for i, div in enumerate(self.soup.find_all('div', class_='recipe-meta-item-body')):
                print(info_names[i].capitalize(), div.text.strip())
            print()
            print('Ingredients'.center(len(ingredients[0]), ' '))
            print('\n'.join(ingredients))
            print()
            print('*' * 50, end='\n\n')


chrome = Scraper()
chrome.print_info(input('What recipe would you like to search: '))
...