我想从网站上抓取数据;但是我一直收到HTTP:错误405:不允许。我做错了什么?
(我查看了文档,并尝试了他们的代码,仅使用我的url代替示例;我仍然有同样的错误。)
以下是代码:
import requests, urllib
from urllib.request import Request, urlopen
list_url= ["http://www.glassdoor.com/Reviews/WhiteWave-Reviews-E9768.htm"]
for url in list_url:
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
response=urllib.request.urlopen(req).read()
如果我跳过用户代理术语,我会收到HTTP错误403:禁止。
过去,我使用以下方法成功地从其他网站上删除了数据:
for url in list_url:
raw_html = urllib.request.urlopen(url).read()
soup=None
soup = BeautifulSoup(raw_html,"lxml")
理想情况下,我想保留一个类似的结构,即将获取的url的内容传递给BeautifulSoup。 谢谢!
答案 0 :(得分:1)
你得到的错误是“原谅我们的中断。关于你的浏览器的一些事情让我们认为你是一个机器人”。意味着不允许刮擦,他们的网页上有防刮片机。
尝试使用虚假浏览器。链接到如何使用虚假浏览器发出请求。 (How to use Python requests to fake a browser visit?)
func (adb *AppDB) UpdateTicket(t Ticket) (err error) {
var result ResultType
var nRows int
if result, err = adb.db.NamedExec(`UPDATE ticket SET detail=:detail, start_time=:start_time, end_time=:end_time, priority=:priority WHERE id=:id;`, &t); err != nil {
return
}
if nRows, err = result.RowsAffected(); err != nil {
return
}
if nRows == 0 {
err = fmt.Errorf("Ticket:%s does not exist for update", t)
}
return
}
我试过这个,我发现他们的页面是通过JS加载的。所以我想你可能想要使用无头浏览器(Selenium / PhantomJS)并刮掉渲染的html页面。希望它有所帮助。
答案 1 :(得分:0)
不确定问题的确切原因,但尝试使用此代码对我有用:
import http.client
connection = http.client.HTTPSConnection("www.glassdoor.com")
connection.request("GET", "/Reviews/WhiteWave-Reviews-E9768.htm")
res = connection.getresponse()
data = res.read()