Web Scraping with Python: beautiful soup: bs4: <h1> Error 200 OK </h1>
Web Scraping with Python: beautiful soup: bs4: <h1> Error 200 OK </h1>
我正在使用 Python 3
,我正在尝试简单地下载如下网站的内容:
# 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
协议不安全(即 https)?我应该更改代码中的某些内容吗?谢谢。
所以事实证明,问题是服务器正在读取我的请求作为 a-not-a-browser 请求,因此拒绝它访问请求的内容。我能够通过使用 requests
lib 并更改请求的 header
来解决问题,以便“"confuse" 服务器(屏蔽我的来自浏览器的请求)如下:
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')
我正在使用 Python 3
,我正在尝试简单地下载如下网站的内容:
# 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
协议不安全(即 https)?我应该更改代码中的某些内容吗?谢谢。
所以事实证明,问题是服务器正在读取我的请求作为 a-not-a-browser 请求,因此拒绝它访问请求的内容。我能够通过使用 requests
lib 并更改请求的 header
来解决问题,以便“"confuse" 服务器(屏蔽我的来自浏览器的请求)如下:
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')