Web Scraping с использованием Python иногда извлекает результат, иногда нет - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь почистить страницы Reddit для видео. Я использую Python и красивый суп, чтобы сделать работу. Следующий код иногда возвращает результат, а иногда нет, когда я перезапускаю код. Я не уверен, где я ошибаюсь. Может кто-нибудь помочь? Я новичок в Python, поэтому, пожалуйста, потерпите меня.

import requests
from bs4 import BeautifulSoup


page = requests.get('https://www.reddit.com/r/FortNiteBR/comments/afjbbp/just_trying_to_revive_my_buddy_and_then_he_got/')

soup = BeautifulSoup(page.text, 'html.parser')

source_tags = soup.find_all('source')

print(source_tags)

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Я попробовал приведенный ниже код, и он работает для меня при каждом запросе, добавлено время ожидания 30 сек.

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.reddit.com/r/FortNiteBR/comments/afjbbp/just_trying_to_revive_my_buddy_and_then_he_got/', timeout=30)
if page.status_code == 200:
    soup = BeautifulSoup(page.text, 'lxml')
    source_tags = soup.find_all('source')
    print(source_tags)
else:
    print(page.status_code, page)
0 голосов
/ 14 января 2019

если вы наберете print (page) после вашего page = requests.get('https:/.........'), вы увидите, что вы получите <Response [200]>

Но если вы снова запустите его быстро, вы получите <Response [429]>

«Код состояния ответа HTTP 429 Too Many Requests указывает, что пользователь отправил слишком много запросов за определенный промежуток времени (« ограничение скорости »).» Источник здесь

В добавок, если вы посмотрите на источник HTML, вы увидите:

<h1>whoa there, pardner!</h1>
<p>we're sorry, but you appear to be a bot and we've seen too many requests
from you lately. we enforce a hard speed limit on requests that appear to come
from bots to prevent abuse.</p>
<p>if you are not a bot but are spoofing one via your browser's user agent
string: please change your user agent string to avoid seeing this message
again.</p>
<p>please wait 6 second(s) and try again.</p>
<p>as a reminder to developers, we recommend that clients make no
    more than <a href="http://github.com/reddit/reddit/wiki/API">one
    request every two seconds</a> to avoid seeing this message.</p>

Чтобы добавить заголовки и избежать 429, добавьте:

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"}

page = requests.get('https://www.reddit.com/r/FortNiteBR/comments/afjbbp/just_trying_to_revive_my_buddy_and_then_he_got/', headers=headers)

Полный код:

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/70.0.3538.110 Safari/537.36"}

page = requests.get('https://www.reddit.com/r/FortNiteBR/comments/afjbbp/just_trying_to_revive_my_buddy_and_then_he_got/', headers=headers)
print (page)

soup = BeautifulSoup(page.text, 'html.parser')

source_tags = soup.find_all('source')

print(source_tags)

Вывод:

<Response [200]>
[<source src="https://v.redd.it/et9so1j0z6a21/HLSPlaylist.m3u8" type="application/vnd.apple.mpegURL"/>]

и не было проблем с многократным повторным запуском после ожидания секунды или 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...