2016-12-19 28 views
1

我使用Python 3,我想簡單地下載一個網站的內容如下:網頁抓取:美麗的湯: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

服務器不喜歡你的請求。也許嘗試設置用戶代理標題。 – pguardiario

回答

1

所以事實證明,問題是服務器正在讀我的請求,因爲非瀏覽器請求,因此拒絕訪問請求的內容。我能夠通過使用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')