2.页面抓取
想要抓取一个页面,调用代码如下:
text = tools.get_url(url, proxy)
需要传入一个URL地址和代理服务器信息。具体的处理代码是在plugins/tools.py文件中。
def get_url(url, proxy=None):
c = pycurl.Curl()
c.setopt(pycurl.URL, url)
import StringIO
b = StringIO.StringIO()
c.setopt(pycurl.WRITEFUNCTION, b.write)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.setopt(pycurl.CONNECTTIMEOUT, 30)
c.setopt(pycurl.TIMEOUT, 300)
if not proxy:
proxy_host = urllib.getproxies().get('http', '')
if proxy_host:
proxy = {'host':proxy_host}
if proxy:
c.setopt(pycurl.PROXY, proxy['host'])
if proxy.get('user', ''):
c.setopt(pycurl.PROXYUSERPWD, '%s:%s' % (proxy['user'], proxy['password']))
c.perform()
return b.getvalue()
这里使用了pycurl库,因为它是cURL(http://curl.haxx.se/)库的一个Python封装。而cURL是使用C语言编写的,运行稳定,速度快,功能强。上述代码可以完成对某个地址的页面抓取,同时支持代理服务器的设置,成功后将返回抓取后的HTML页面内容。
3. 网站定制
因为每个网站的目录代码和内容代码不完全相同,因此需要能够根据网站进行定制。本工具提供了相应的扩展框架。
首先是定义统一的调用接口,则每个定制模块需要提供3个函数:
parse_title(text, proxy=None)
parse_index(text, proxy=None)
parse_page(title, text, proxy=None)
它们将对传入的页面文本进行分析,分别得到标题、目录和正文。其中前两个将对目录页面进行分析,最后一个将对正文页面进行分析。
然后是对定制模块进行配置。
在plugins/__init__.py中,对支持的网站地址与模块名进行了配置,如:
#coding=utf-8
modname = {
'book.sina.com.cn':('booksina',
'新浪读书', 'http://book.sina.com.cn'),
'cmfu.com':('cmfu', '起点中文网', 'http://www.cmfu.com'),
}
def get_mod(domain):
return modname.get(domain, (None, None, None))[0]
|