Почему reddit возвращает ошибку 502 при доступе к странице с помощью beautifulsoup4 - PullRequest
0 голосов
/ 18 января 2020

Я написал небольшой скрипт для проверки имени пользователя на популярных сайтах, таких как Facebook, Instagram и т. Д. c. Вот код.

import requests
from termcolor import colored, cprint 
from time import sleep
from bs4 import BeautifulSoup

status_code_html = 'https://en.wikipedia.org/wiki/List_of_HTTP_status_codes'
uname = input("Enter the username: ")
width = 10

websites = {
    'Facebook': 'https://www.facebook.com/',
    'Twitter': 'https://twitter.com/',
    'Instagram': 'https://www.instagram.com/',
    'Youtube': 'https://www.youtube.com/user/',
    'Reddit': 'https://www.reddit.com/user/'
}

for site, url in websites.items():

    try:
        response = requests.get(url+uname)
        page = requests.get(status_code_html)
        soup = BeautifulSoup(page.content, 'html.parser')
        tag = soup.find(id=response.status_code)
        status = tag.find_parent('dt').text
        response.raise_for_status()

    except:
        print(site.rjust(width), '   :', 'Fail'.ljust(width), '(Status:', status, ')')

    else:
        print(site.rjust(width), '   :', 'Success'.ljust(width), '(Status:', status, ')')

Вывод вышеуказанного кода:

Enter the username: ********
Facebook    : Success    (Status: 200 OK )
   Twitter    : Success    (Status: 200 OK )
 Instagram    : Success    (Status: 200 OK )
   Youtube    : Success    (Status: 200 OK )
    Reddit    : Fail       (Status: 502 Bad Gateway )

Этот код работает для всех веб-сайтов, кроме reddit.com. request.get () возвращает страницу с ошибкой 502 Может кто-нибудь помочь решить эту проблему?

1 Ответ

1 голос
/ 18 января 2020

Добавление пользовательского агента в параметр заголовков должно исправить это:

import requests
from termcolor import colored, cprint 
from time import sleep
from bs4 import BeautifulSoup

status_code_html = 'https://en.wikipedia.org/wiki/List_of_HTTP_status_codes'
uname = input("Enter the username: ")
width = 10

headers = {'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36'}

websites = {
    'Facebook': 'https://www.facebook.com/',
    'Twitter': 'https://twitter.com/',
    'Instagram': 'https://www.instagram.com/',
    'Youtube': 'https://www.youtube.com/user/',
    'Reddit': 'https://www.reddit.com/user/'
}

for site, url in websites.items():

    try:
        response = requests.get(url+uname, headers=headers)
        page = requests.get(status_code_html)
        soup = BeautifulSoup(page.content, 'html.parser')
        tag = soup.find(id=response.status_code)
        status = tag.find_parent('dt').text
        response.raise_for_status()

    except:
        print(site.rjust(width), '   :', 'Fail'.ljust(width), '(Status:', status, ')')

    else:
        print(site.rjust(width), '   :', 'Success'.ljust(width), '(Status:', status, ')')
...