Archive for web-2

在抓取网页数据进行html分析的时候,以前一直使用HTMLParser,文档:http://docs.python.org/library/htmlparser.html 自从知道HTMLParser后,一直感觉他就是一个神器,分析简单快捷,几行代码搞定了。 这次在总页面抓取使用HTMLParser,没有问题,很快实现结果。但是在获取详细信息的页面时候,开始提示错误了:HTMLParseError: malformed start tag,各种google,其中有一大部分的结果是关于Beautiful Soup的,于是我了解了Beautiful Soup。HTMLParser还有一个缺点,对编码的处理也不是很友好。 开始安装的Beautiful Soup最新版本4.4.1,有问题,也是报这个错误。由于前面搜索知道换成版本3.07a就好了,直接又换了一个版本。先说官网地址:http://www.crummy.com/software/BeautifulSoup/,Beautiful Soup 3.07a下载地址:http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/。 测试通过,没有报错。能否抓取成功下面试试。正在看官方文档,版本3的文档不一样,贴地址:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html 时隔二分钟,测试成功。发现Beautiful Soup更加简单,文档也不错只看了开始的例子就会用了,速度应该不会太好,不过我只是满足自己需要。很好很强大。 刚刚结合文档总结了几个用法,很多根据文档写出文档没写的例子: #基本的标签查找 asd = soup.find('div', id="productDescription") #可以这样写 soup.findAll('td', {'class':"bucket normal"})[0] #想要进行查询结果中查找 aaa = BeautifulSoup(str(asd)) #查找多个不同class,或 bbb = aaa.findAll('div', {'class':["leftImage","rightImage"]})

Continue

maxmind.com提供了一个服务,通过引入一个js文件(http://j.maxmind.com/app/geoip.js),可以把他判断到的用户的国家、城市、经纬度等信息加入到页面中来。



其他功能函数 function geoip_country_code() { return 'CN'; } function geoip_country_name() { return 'China'; } function geoip_city() { return 'Shanghai'; } function geoip_region() { return '23'; } function geoip_region_name() { return 'Shanghai'; } function geoip_latitude() { return '31.0050'; } function geoip_longitude() { return '121.4086'; } function geoip_postal_code() { return ''; } function geoip_area_code() { return ''; } function geoip_metro_code() { return ''; }

Continue

配置文件settings.py:

if 'SERVER_SOFTWARE' in os.environ:
    from bae.core import const
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'XXX',
            'USER': const.MYSQL_USER, 
            'PASSWORD': const.MYSQL_PASS,  
            'HOST': const.MYSQL_HOST,   
            'PORT': const.MYSQL_PORT, 
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql', 
            'NAME': 'baidu', 
            'USER': 'root',
            'PASSWORD': '',    
            'HOST': 'localhost',                   
            'PORT': '3306',                      
        }
    }
这里是django应用数据库的配置,具体可以参考官网:http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E4%BA%91%E7%8E%AF%E5%A2%83/WEB%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6 数据库需要先在本地导出来,然后用官网提供的phpmyadmin导入到bae数据库中。这里我只用到session表,直接执行sql语句简历一个django_session表就搞定了。

Continue

django 今天做注册的验证码,里面有一个问题就是,建立一个隐藏input表单。我想用这个input存储验证码的验证信息,又不想太依赖javascript修改。接着我想伟大的django会有这个的,哈哈被我找到了,见官网: https://docs.djangoproject.com/en/1.4/ref/forms/widgets/#hiddeninput 之所以放在froms.py中而不放在templates中,我想验证码的错误判断放在clean_验证码中,在forms中直接从request.POST中获取不会T_T,试了下没成功。 随着对django的了解,越发发现他的方便。看我写的代码 key = forms.CharField(widget=forms.HiddenInput(attrs={'value':''}))

Continue

早上在网上搜索到的,记录下,以后肯定会用到。 一、 LOGIN_URL的修改,在views里可能需要设置 限制登陆用户访问。用到@login_required,如果和登陆url不同需要设置login_url参数。但是在urls中我还没有找到好的方法,当我们用系统提供的views里的方法,像django.contrib.auth.views.password_change,这是修改LOGIN_URL就方便了,@login_required也不需要设置参数了,当然最好登陆url与默认的相同。 网上的方法,我还没有验证(像是老版本的用法),不过官网有介绍:

import django.contrib.auth
django.contrib.auth.LOGIN_URL = '/login/' 
官网链接: https://docs.djangoproject.com/en/1.4/ref/settings/ 二、 在urls里设置传给templates数据的方法,这个以前没有用过。 先记录:
( r'^reset_done/$' , 'django.views.generic.simple.direct_to_template' , { 'template' : 'message.html' , 'extra_context' : {
    'msg' : _( u'我们已将一封包含恢复密码步骤的邮件发到了您的邮箱,请查收' ),
}}), 

Continue

第二次进行python用户注册登录等功能的编写,收获颇多,对django认识更多。 urls.py

    #passwd reset
    url(r'^resetpassword/$','django.contrib.auth.views.password_reset',{'template_name':'account/resetpassword.html','email_template_name':'account/password_reset_mail.html','subject_template_name':'accouts/password_reset_subject.txt','post_reset_redirect':'/',}),
    #密码重置链接
    url(r'^reset/(?P[0-9A-Za-z]+)-(?P.+)/$', 'django.contrib.auth.views.password_reset_confirm', {'template_name' : 'account/password_reset.html','post_reset_redirect': '/account/logout/' }),
    #passwd change
开始没有写密码重置链接的url配置,报错: Exception Value: Caught NoReverseMatch while rendering: Reverse for'django.contrib.auth.views.password_reset_confirm' with arguments '()'and keyword arguments '{'uidb36': '4', 'token':'36x-7d6e7419555fda3bc140'}' not found. 参数的详细讲解:https://docs.djangoproject.com/en/1.4/topics/auth/ registration/password_reset_email.html可以直接复制django自带的那个文件,文件地址: /usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/registration/password_reset_email.html

Continue

方便自己手机记录,而且不需要导出到电脑保存,直接存到sae上了。主要记录自己的很多很突然的想法,用的sae的kvdb顺便参加了sae的活动,能拿1000个豆子。 文档的加密算法是自己写的,主要通过密码的长度和字符,密码又经过md5加密了。虽然没有达到自己预想的样子, 地址:http://0x55aatools.sinaapp.com/text/ 还是用的django和twitter bootstrap ,写小工具很快。 python sae的KVDB不支持pkrget 按key前缀查找,只好自己遍历了所有文档进行后台文档的管理,url就是进行了简单的md5加密,这个写的时候应该加大难度。

Continue

几个需要注意的地方,官网说的很清楚: 1、 config.yaml文件修改,

name: py
version: 1

libraries:
- name: django
  version: "1.4"
handlers:
- url: /static
  static_dir: static
2、index.wsgi文件修改,
import os
import django.core.handlers.wsgi

import sae

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

application = sae.create_wsgi_app(django.core.handlers.wsgi.WSGIHandler())
之后就打印了一个hello world! 用到的几个svn命令 svn checkout https://svn.sinaapp.com/newapp #此处需要认证,用户名/密码为您的SAE安全邮箱和安全密码 svn add 1/ svn commit -m"add wordpress"

Continue

学习什么也离不开这个hello world,T_T, 1、下载webpy-webpy-webpy-0.36-63-gc7dcc24.tar.gz,解压,Python setup.py install。安装完毕 2、 编写a.py。内容如下:

import web

urls = ("/.*", "hello")
app = web.application(urls, globals())

class hello:
    def GET(self):
        return 'Hello, world!'

if __name__ == "__main__":
    app.run()
3、运行,python a.py,访问http://127.0.0.1:8080/。上面写的0.0.0.0,有木有,难道是特意的。显示无法连接,当时差点晕了,(现在反应迟钝,经不起吓)。 在命令行的 code.py 后加参数 "IP 地址:端口" 来控制 web 服务器的监听范围 附上学习文档http://webpy.org/cookbook/

Continue

django还没出师,有想学web.py了。 有这么几个原因: 想把应用放到 sae,django版本太低,但是官方可以安装其他版本。现在在家,真心不愿意在windows下捣鼓了,太他妈多事了。 第二,django应用太多,太复杂。我只写一个简单微博应用,不需要那么完整复杂的功能。听说web.py很简洁,学习一下吧,也好见解一下各个的优势,像大牛自己写一个框架T_T。 第三,接触越多越好,以后说不定就用到了。 好吧,开始了。今天下午种花生,累屎鸟,反应迟钝了。

Continue