【问题标题】:Python 3.3, Beautiful Soup 4, 503 and ReiterationPython 3.3, Beautiful Soup 4, 503 和 Reiteration
【发布时间】:2013-11-14 11:46:51
【问题描述】:

在我的项目中,我发现了两个问题:

  1. 8/10 次我收到HTTP Error 503: Service Temporarily Unavailable
  2. 我是否正确地执行了重复?

我需要寻找一个名为 class="torType" 的类,然后只获取链接 URL,我有它的工作方式,但我做得对吗?

#import urllib.request
#from bs4 import BeautifulSoup
WebUrl = 'http://kickasstorrents.come.in/tv/'

def RetrieveWebData(MyUrl):
     try:
         opener = urllib.request.build_opener()
         opener.addheaders =[('User-agent','Mozilla/5.0')]
         url = (MyUrl)
         page = opener.open(url).read()
         return page
    except OSError as e:
        print("An error occurred reading the webpage ",e)


def FilterWebData(RawData):
    try:
        soup = BeautifulSoup(RawData)
        TorData = soup.find_all("a", {"class" : "torType"})
        soup = BeautifulSoup(str(TorData))
        for link in soup.find_all('a'):
            RecentTors = link.get('href')
        return RecentTors

    except OSError as e:
        print("An error occurred during filtering",e)


RawPage = RetrieveWebData(WebUrl)
RecentTorrentLinks = FilterWebData(RawPage)


print(RecentTorrentLinks)

【问题讨论】:

    标签: python web beautifulsoup


    【解决方案1】:

    您看到的 503 错误可能是由于服务器速率限制您,请减少访问服务器的频率。

    循环不正确;直接循环 TorData 对象。您也可以将搜索限制为仅具有 href 属性的那些 a 链接:

    soup = BeautifulSoup(RawData)
    TorData = soup.find_all("a", {"class" : "torType", 'href': True})
    return [link['href'] for link in TorData]
    

    【讨论】:

    • 酷,谢谢,我会去尝试一下 Loop,看看它是如何挂在一起的,嗯,对服务器的影响不大,我只是偶尔手动运行该脚本,而我我正在尝试创建它并对其进行测试。奇怪的是,我运行它,503 失败,我在它工作后立即再次运行它。
    • 那么服务器只是一般超载了。
    • 嘿 Martijn ,你和 Paulo 在帮助我方面都是正确的,我将把正确的答案授予 Paulo Freitas 虽然如果你不介意,你的回答是正确的(把它存储起来,所以我可以理解其他条目)并感谢您的帮助,但是 Paulo 添加了捕获 e.code 的代码,并且该解决方案类似于 mycode(不如您的优雅),但我了解它做得更好(初学者: /) ,不确定 lmxl 是关于什么的。哈哈,把它们都标记为正确会很好:)
    • 恭喜你达到15分,你现在也可以对帖子投票了!
    【解决方案2】:

    您遇到的间歇性 HTTP 503 错误与给定 URL 上的高负载有关。

    您可能希望将其添加到 RetrieveWebData()except 块中:

        if e.code == 503:
            return RetrieveWebData(MyUrl)
    

    当它由于某种原因失败时,该函数将再次递归调用自身,直到它没有收到 HTTP 503 错误。

    此外,这条FilterWebData() 行是错误的:

            RecentTors = link.get('href')
    

    每次迭代都会覆盖 RecentTors 变量。你真的很想做这样的事情:

        RecentTors = []
        for link in soup.find_all('a'):
            RecentTors += [link.get('href')]
        return RecentTors
    

    我建议您使用最快的lxml 模块来利用 XPath:

    def FilterWebData(RawData):
        try:
            TorData = []
    
            for RecentTor in etree.HTML(RawData).xpath("//a[contains(@class, 'torType')]"):
                TorData += [RecentTor.attrib['href']]
    
            return TorData
        except OSError as e:
            print("An error occurred during filtering",e)
    

    就是这样!

    【讨论】:

    • 谢谢,lmxl 是beautifulsoup 的一部分,抱歉只是个初学者。在我正在查看的特定页面上,速度将是一个问题,它只检索大约 10 个项目。 ?谢谢:)
    • @DeadZero 不,lxml 是另一个使用 HTML/XML 解析并支持 XPath 的模块。您可以在此处获得更多信息:lxml.de 我认为在此页面中速度对您来说不是问题,但总体而言,lxml 往往更快并且具有支持 XPath 的优势,在某些情况下会很多更容易实现你想要的任何东西。 :)
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 2018-04-22
    相关资源
    最近更新 更多