Как сделать соскоб со страницы с BeautifulSoup - PullRequest
2 голосов
/ 13 июня 2019

Заданный вопрос очень прост, но для меня это не работает, и я не знаю!

Я хочу почистить рейтинг пива с этой страницы https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone с BeautifulSoup, но он не работает.

Это мой код:

import requests
import bs4
from bs4 import BeautifulSoup



url = 'https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone'

test_html = requests.get(url).text

soup = BeautifulSoup(test_html, "lxml")

rating = soup.findAll("span", class_="ratingValue")

rating

Когда я заканчиваю, это не работает, но если я делаю то же самое с другой страницей, это работа ... Я не знаю. Кто-то может мне помочь? Результат рейтинга - 4,58

Спасибо всем!

Ответы [ 5 ]

2 голосов
/ 13 июня 2019

Если вы напечатаете test_html, вы обнаружите, что получили 403 запрещенных ответа.

Вы должны добавить заголовок (как минимум, user-agent:)) к вашему GET-запросу.

import requests
from bs4 import BeautifulSoup


headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
}

url = 'https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone'

test_html = requests.get(url, headers=headers).text

soup = BeautifulSoup(test_html, 'html5lib')

rating = soup.find('span', {'itemprop': 'ratingValue'})

print(rating.text)

# 4.58
0 голосов
/ 13 июня 2019
    import requests
    from bs4 import BeautifulSoup


    headers = {
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
 AppleWebKit/537.36 
   (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'
   }

 url = 'https://www.brewersfriend.com/homebrew/recipe/view/16367/southerntier-pumking 
clone'

test_html = requests.get(url, headers=headers).text

soup = BeautifulSoup(test_html, 'html5lib')

rating = soup.find('span', {'itemprop': 'ratingValue'})

 print(rating.text)
0 голосов
/ 13 июня 2019

Страница, на которую вы запрашиваете ответ, запрещена как 403, так что вы можете не получить сообщение об ошибке, но вы получите пустой результат как [].Чтобы избежать этой ситуации, мы добавляем пользовательский агент, и этот код даст вам желаемый результат.

import urllib.request
from bs4 import BeautifulSoup

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7'

url = "https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone"
headers={'User-Agent':user_agent} 

request=urllib.request.Request(url,None,headers) #The assembled request
response = urllib.request.urlopen(request)
soup = BeautifulSoup(response, "lxml")

rating = soup.find('span', {'itemprop':'ratingValue'})

rating.text
0 голосов
/ 13 июня 2019

Причина получения запрещенного кода состояния (ошибка HTTP 403), означающая, что сервер не выполнит ваш запрос, несмотря на понимание ответа.Вы обязательно получите эту ошибку, если попытаетесь очистить многие более популярные веб-сайты, которые будут иметь функции безопасности для предотвращения ботов.Поэтому вам нужно замаскировать ваш запрос!

  1. Для этого вам нужно использовать Headers.
  2. Также вам необходимо исправить атрибут тега, данные которого выпытаясь получить то есть itemprop
  3. использовать lxml в качестве строителя деревьев или любого другого по вашему выбору

    import requests
    from bs4 import BeautifulSoup
    
    
    url = 'https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone'
    
    # Add this 
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
    
    test_html = requests.get(url, headers=headers).text      
    
    soup = BeautifulSoup(test_html, 'lxml')
    
    rating = soup.find('span', {'itemprop':'ratingValue'})
    
    print(rating.text)
    
0 голосов
/ 13 июня 2019

Вы сталкиваетесь с этой ошибкой, потому что некоторые сайты не могут быть очищены красивым супом.Таким образом, для сайтов такого типа вы должны использовать selenium enter image description here

  • . Загрузите последнюю версию драйвера Chrome по этой ссылке в соответствии с вашей операционной системой * 1009.*
  • установить драйвер селена с помощью этой команды "pip install selenium"
# import required modules 
import selenium
from selenium import webdriver
from bs4 import BeautifulSoup
import time, os

curren_dir  = os.getcwd()
print(curren_dir)

# concatinate web driver with your current dir && if you are using window change "/" to '\' .

# make sure , you placed chromedriver in current directory 
driver = webdriver.Chrome(curren_dir+'/chromedriver')
# driver.get open url on your browser 
driver.get('https://www.brewersfriend.com/homebrew/recipe/view/16367/southern-tier-pumking-clone')
time.sleep(1)

# it fetch data html data from driver
super_html = driver.page_source

# now convert raw data with 'html.parser'

soup=BeautifulSoup(super_html,"html.parser")
rating = soup.findAll("span",itemprop="ratingValue")
rating[0].text
...