Как пропустить 500 Внутренняя ошибка сервера и продолжить Webscraping с помощью BeautifulSoup? - PullRequest
0 голосов
/ 30 мая 2019

Я делаю Webscraping с использованием Python BeautifulSoup.

Получение ошибки «Ошибка HTTP 500: внутренняя ошибка сервера».

Ниже приведен мой код

import requests
from bs4 import BeautifulSoup
import pdb
from urllib.request import urlopen
import csv
from urllib.error import HTTPError

for IPRD_ID in range(1,10):
   url = 'https://ipr.etsi.org/IPRDetails.aspx?IPRD_ID={}&IPRD_TYPE_ID=2&MODE=2'.format(IPRD_ID)
   page = urlopen(url)
   soup = BeautifulSoup(page, "lxml")
   table = soup.findAll('table', style="width:100%")
   try:
      for tr in table:
          a = (tr.get_text())
   except:
      print('exe')

Как мы уже видели, я использую функцию range, которая запускается с 1 по 10. Я проверял код шаг за шагом. На IPRD_ID=3 ошибке сервера страницы нет данных. Так что ее создание500 Internal Error введите описание изображения здесь

Как мы не видели данных, так что его ошибка введите описание изображения здесь

Ошибка HTTP 500: ВнутренняяОшибка сервера. Мы видели одну IPRD_ID=3, которая имеет ошибку. Если я задаю больший диапазон от 1 до 100, возможно, будет больше страниц с ошибками. Итак, мне нужна помощь, как пропустить эти страницы и перейти к webscraping

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Попробуйте перехватить код ошибки и продолжить, если обнаружится ошибка

for IPRD_ID in range(1,10):
    url = 'https://ipr.etsi.org/IPRDetails.aspx?IPRD_ID={}&IPRD_TYPE_ID=2&MODE=2'.format(IPRD_ID)
    try:
        page = urlopen(url)
        soup = BeautifulSoup(page, "lxml")
        table = soup.findAll('table', style="width:100%")
        for tr in table:
            a = (tr.get_text())

    except  HTTPError, err:
        if err.code == 500:
            print ("Internal server error 500")
        else:
            print ("Some other error. Error code: ", err.code)
1 голос
/ 30 мая 2019

В вашем случае urlopen(URL) повышает urllib.error.HTTPError исключение. Вы можете перехватить это исключение напрямую или более универсальное исключение, например class Exception(BaseException): pass. Кроме того, вы можете сделать задержку между HTTP запросами (это крайне рекомендуется в вашем случае), как в моем коде ...

import time
import requests
from bs4 import BeautifulSoup
import pdb
import urllib
from urllib.request import urlopen
import csv
from urllib.error import HTTPError

for IPRD_ID in range(1,10):
    url = 'https://ipr.etsi.org/IPRDetails.aspx?IPRD_ID={}&IPRD_TYPE_ID=2&MODE=2'.format(IPRD_ID)
    try:
        page = urlopen(url)
    except urllib.error.HTTPError as exc:
        print('Something went wrong.')
        time.sleep(10) # wait 10 seconds and then make http request again
        continue
    else:
        print('if client get http response, start parsing.')
        soup = BeautifulSoup(page, "lxml")
        table = soup.findAll('table', style="width:100%")
        try:
            for tr in table:
                a = tr.get_text()
        except Exception as exc:
            print('Something went wrong during parsing !!!')
        finally:
            time.sleep(5) # wait 5 seconds if success, and then make HTTP request.

Надеюсь, это поможет вам.

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