尝试使用Python 3.3抓取数据时出现Http错误405

时间:2016-12-14 16:16:19

标签: python-3.x web-scraping urllib http-status-code-405

我想从网站上抓取数据;但是我一直收到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。 谢谢!

2 个答案:

答案 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()