Мой красивый скребок для супа не работает как положено - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь получить список ингредиентов со следующей веб-страницы:

https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/

Итак, первым ингредиентом, который я хочу вытащить, будет ацетилированный ланолин, а последним - октил пальмитат.

Глядя на источник страницы для этого URL, я узнаю, что шаблон для списка ингредиентов выглядит следующим образом:

<td valign="top" width="33%">Acetylated Lanolin <sup>5</sup></td>

Итак, я написал некоторый код для извлечения списка, и он дает мне нулевые результаты. Ниже приведен код.

import requests
r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/')
from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')

results = soup.find_all('td', attrs={'valign':'top'})

Когда я пытаюсь len(results), это дает мне ноль.

Что я делаю не так? Почему я не могу вытащить список, как задумано? Я новичок в веб-скребках.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Ваш запрос супа запрещен.

Следовательно, вы не можете сканировать его. Кажется, сайт блокирует выскабливание.

print(soup)

<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr/><center>nginx</center>
</body>
</html>
0 голосов
/ 03 мая 2018

Ваш веб-код работает правильно. Однако ваш запрос не сработал. Если вы проверите код состояния вашего запроса, вы увидите, что вы получите статус 403.

r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/')
print(r.status_code) # 403

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

headers = {
    'User-Agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) '
                   'AppleWebKit/537.36 (KHTML, like Gecko) '
                   'Chrome/56.0.2924.76 Safari/537.36')
}

r = requests.get('https://skinsalvationsf.com/2012/08/updated-comedogenic-ingredients-list/', headers=headers)

from bs4 import BeautifulSoup
soup = BeautifulSoup(r.text, 'html.parser')
results = soup.find_all('td', attrs={'valign':'top'})
print(len(results))
...