2016-12-19 3 views
1

Я использую Python 3 и я пытаюсь просто загрузить содержимое веб-сайта следующим образом:Web Зачистка с Python: красивый суп: BS4: <h1>Ошибка 200 OK</h1>

# IMPORTS -------------------------------------------------------------------- 
import urllib.request 
from bs4 import BeautifulSoup as bs 

# CLASS DESC ----------------------------------------------------------------- 
class Parser: 

    # CONSTRUCTOR 
    def __init__(self, url): 
     self.soup = bs(urllib.request.urlopen(url).read(), "lxml") 

    # METHODS 
    def getMetaData(self): 

     print(self.soup.prettify()[0:1000]) 

# MAIN FUNCTION -------------------------------------------------------------- 
if __name__ == "__main__": 

    webSite = Parser("http://www.donnamoderna.com") 
    webSite.getMetaData() 

, для которого я набираюсь следующий результат:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
    <head> 
     <title> 
      200 OK 
     </title> 
    </head> 
    <body> 
     <h1> 
      Error 200 OK 
     </h1> 
     <p> 
      OK 
     </p> 
     <h3> 
      Guru Meditation: 
     </h3> 
     <p> 
      XID: 1815743332 
     </p> 
     <hr/> 
     <p> 
      Varnish cache server 
     </p> 
    </body> 
</html> 

и я не понимаю, почему это происходит. Это не прокси-сервер; Я пробовал использовать:

curl "http://www.donnamoderna.com" 

и он отлично работает. Я также пробовал код на другом сайте, например https://www.google.com, и он работает отлично. Разве протокол http не безопасен (т. Е. Http s)? Должен ли я что-то изменить в своем коде? Благодарю.

+1

Сервер не нравится ваш запрос. Возможно, попробуйте настроить заголовок user-agent. – pguardiario

ответ

1

Таким образом, выясняется, что проблема заключалась в том, что сервер читал мой запрос как запрос a-not-a-browser, поэтому он лишил его доступа к запрошенному контенту. Я был в состоянии решить эту проблему с помощью requestsLIB и изменения запроса-х header, чтобы «запутать" сервер (маскировка моего запроса как тот, который приходит из браузера) следующим образом:

import requests 

# CONSTRUCTOR 
def __init__(self, url): 

    # Necessary to make the server think that we are a browser 
    headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/41.0.2227.1 Safari/537.36'} 

    # Make request 
    r = requests.get(url, headers=headers) 

    # Create soup object 
    self.soup = bs(r.content, 'html.parser')