【问题标题】:Python web scraping, skip url if errorPython网页抓取,如果错误则跳过网址
【发布时间】:2014-08-15 01:29:07
【问题描述】:

我正在尝试抓取一个站点(大约 7000 个链接,全部在一个列表中),并且由于我的方法,这需要很长时间,我想我可以接受(因为这意味着不被发现)。但是,如果我在尝试检索页面时遇到任何错误,我可以跳过它吗?现在,如果出现错误,代码会中断并给我一堆错误消息。这是我的代码:

Collection 是列表和结果文件的列表。基本上,我正在尝试使用get_url_data()(我有一个之前的问题要感谢)运行一个循环,而我的所有网址都在urllist 中。我有一个叫做HTTPError 的东西,但它似乎并不能处理所有的错误,因此这篇文章。在相关的支线任务中,获得无法处理的 url 列表也很好,但这不是我主要关心的问题(但如果有人能告诉我如何处理会很酷)。

Collection=[]
def get_url_data(url):

    try:
        r = requests.get(url, timeout=10)
        r.raise_for_status()

    except HTTPError:
        return None

    site = bs4.BeautifulSoup(r.text)
    groups=site.select('div.filters')
    word=url.split("/")[-1]

    B=[]
    for x in groups:
        B.append(word)
        T=[a.get_text() for a in x.select('div.blahblah [class=txt]')]
        A1=[a.get_text() for a in site.select('div.blah [class=txt]')]
        if len(T)==1 and len(A1)>0 and T[0]=='verb' and A1[0]!='as in':
            B.append(T)
            B.append([a.get_text() for a in x.select('div.blahblah [class=ttl]')])
            B.append([a.get_text() for a in x.select('div.blah [class=text]')])
            Collection.append(B)
        B=[]

for url in urllist:
    get_url_data(url)

我认为主要的错误代码是这个,它触发了其他的因为有一堆以During handling of the above exception, another exception occurred开头的错误。

Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\requests\packages\urllib3\connectionpool.py", line 319, in _make_request
    httplib_response = conn.getresponse(buffering=True)
TypeError: getresponse() got an unexpected keyword argument 'buffering'

【问题讨论】:

  • 您通常会遇到什么样的错误?它们都与网络抓取有关还是来自其他东西?错误在哪里被抛出?如果您只是扩展您的 try except 块,您可能可以解决问题
  • @Dannnno 我会粘贴错误代码,但它有点长。我会发布我认为主要的内容。
  • 如果你看一下,你会发现只有TypeError,而不是HTTPError。如果您扩展您的 except 块(例如 except Exception),您应该能够捕获所有这些(尽管这通常不是很好的做法)
  • @Dannnno 谢谢,那么最佳做法是什么?另外,这部分代码不是我写的,那么return None 是什么意思呢?它是停止一切,还是只是跳过?如果它正在跳过,我可以以某种方式存储导致跳过的网址吗?似乎如果我收到 HTTPError,它仍在运行其余代码,即使这没有任何好处?
  • 最佳实践是明确捕获您预期会发生的每个异常,以便仍然注意到任何意外情况 (except HTTPError, TypeError)。 return None 将值 None 返回到调用函数的位置 - 超过该点时不会评估函数。如果您想获取有问题的 url,则必须将 return 语句更改为 return url 之类的内容,或者您​​必须更改 for 循环中的逻辑

标签: python error-handling web-scraping python-requests


【解决方案1】:

你可以让你的 try-catch 块看起来像这样,

try:
    r = requests.get(url, timeout=10)
    r.raise_for_status()

except Exception:
    return

Exception 类将处理所有错误和异常。

如果您想获得异常消息,您可以在except 块中打印此消息。然后在引发异常之前先实例化异常。

except Exception as e:
    print(e.message)
    return

【讨论】:

  • 谢谢,@Dannno 也这么说,但我喜欢你添加选项以查看错误消息的方式。当它打印消息时,它会退出程序还是继续?
  • 不,不会的。它将在控制台中打印错误消息,程序将继续。您也可以将其写入日志文件。
  • @salmanwahed 有没有直接将其写入日志文件的方法?
  • 当然。看看这个:Logging to a file
猜你喜欢
  • 2020-02-16
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多