21 March 2014

原文地址

Requests 是一个奇妙的 Python 库, 也是我这些天用得最舒服的几个库之一. 我每天都用它主要是因为我的 爬虫 .

在你的爬虫项目中, 你可能会用到一些很简便的函数, 而且你可能刚刚复制了这些函数并把你的 response 对象作为参数传给它们. 我们可以做得更好 .

我将会演示怎样给 Response 类增加一些简单的方法, 这样你可以在你自己的项目中用你自己的方法来使用这个技巧.

我们从定义一个 Response 类开始, 这个类有几个简单的方法. 最重要的方法是 doc() . 它”获得”解析过的 HTML 语法树, 这样我们其他的方法就不用在每次调用的时候都重新解析一遍 HTML.

 import requests from lxml import html import inspect  class Response(object):     def doc(self):         if not hasattr(self, '_doc'):             self._doc = html.fromstring(self.text)         return self._doc      def links(self):         return self.doc().xpath('//a/@href')      def images(self, filter_extensions=['jpg', 'jpeg', 'gif', 'png']):         return [link for link in self.doc().xpath('//img/@src') if link.endswith(tuple(filter_extensions))]      def title(self):         title = self.doc().xpath('//title/text()')         if len(title):             return title[0].strip()         else:             return None 

现在, 我们需要用我们新定义的类来修补 requests.Response 类. 我们将使用来自 inspect 模块 的 getmember() 函数, 并把 ismethod() 作为参数.

 for method_name, method in inspect.getmembers(Response, inspect.ismethod):       setattr(requests.models.Response, method_name, method.im_func) 

这样就完成啦. 现在你可以对任何 reponse 对象使用这些简便的函数, 看下面这个例子:

 r = requests.get('http://imgur.com/') print r.title() print r.images(filter_extensions=['png']) 

现在我们继续, 把你的 response 对象变得向你想要的一样强大吧. 如果你对其他的爬虫技巧有兴趣, 可以看下我的 python web scraping resource .

翻译完毕下面是自己的瞎说

第一次看到 inspect 模块的用法.

原文很短英文也不难所以推荐直接读原文, 之所以翻译了一下是觉得这文章确实很有意思~