5月 06

scrapy 学习笔记 一

  很多python开发都在用scrapy框架开发抓取,我也算学习一下。虽然笔记序号为一,但是能不能坚持下去还不知道,写着看吧。官方网址:http://scrapy.org/。官方接受scrapy是纯python做的高效的web抓取框架,网络爬虫,后提取相关页面的数据。scrapy可以用于数据挖掘、监控和自动化测试等工作。据说google的大部分爬虫也是用python写的,但是不知道是否用了这个框架。可以肯定的是,这个框架能做很多事、很大,我只会用到很简单一部分。我做笔记是为自己学习记录,既不系统也不全面,建议大家到官方下载pdf的文档,进行学习,我也是通过pdf文档学习,并使用其中的例子修改为自己的形成笔记。为了不引起争议,直接用自己的站进行抓取学习。
  开始学习了,linux的环境,是CentOS5,windows的环境是win7,python都是2.6,因为scrapy支持2.6、2.7,不支持3.X。直接使用easy_install安装,但是windows上安装的是0.14.3,linux上安装的0.12,官方网站上最新的开发版本是0.15。不知道为什么差距这么大。为了方便学习直接手动下载0.15,安装到linux上。

tar zxf Scrapy-X.X.X.tar.gz
cd Scrapy-X.X.X
python setup.py install

  在linux上安装有警告,关于ssl的,如下

Running pyOpenSSL-0.13/setup.py -q bdist_egg –dist-dir /tmp/easy_install-rx8P0H/pyOpenSSL-0.13/egg-dist-tmp-g7Da22
warning: no previously-included files matching ‘*.pyc’ found anywhere in distribution
OpenSSL/ssl/connection.c: In function ‘ssl_Connection_set_context’:
OpenSSL/ssl/connection.c:289: 警告:隐式声明函数 ‘SSL_set_SSL_CTX’
OpenSSL/ssl/connection.c: In function ‘ssl_Connection_get_servername’:
OpenSSL/ssl/connection.c:313: 错误:‘TLSEXT_NAMETYPE_host_name’ 未声明 (在此函数内第一次使用)
OpenSSL/ssl/connection.c:313: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其
OpenSSL/ssl/connection.c:313: 错误:所在的函数内只报告一次。)
OpenSSL/ssl/connection.c:320: 警告:隐式声明函数 ‘SSL_get_servername’
OpenSSL/ssl/connection.c:320: 警告:赋值时将整数赋给指针,未作类型转换
OpenSSL/ssl/connection.c: In function ‘ssl_Connection_set_tlsext_host_name’:
OpenSSL/ssl/connection.c:346: 警告:隐式声明函数 ‘SSL_set_tlsext_host_name’
error: Setup script exited with error: command ‘gcc’ failed with exit status 1

  直接下载pyopenssl后安装,
http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-0.12.tar.gz

  再执行 easy_install -U scrapy,安装成功。
  在windows上除了安装pyopenssl还要w3lib、Twisted,但是处理比较简单,直接easy_install安装,如:C:\Python26\Scripts>easy_install.exe pyopenssl。
  环境搭建完成,毕竟使用的linux服务器,所以还是在linux上学习。开始创建一个抓取项目,项目名为scrapytest.
>scrapy startproject simonzhang
创建项目完毕,目录树如下,:

simonzhang
│  scrapy.cfg               # 整个目录的配置
│
└─simonzhang                # 项目模块,代码都放在这
    │  items.py             # 项目的items文件,相当于格式化抓取的内容,以字典形式返回
    │  pipelines.py         # 项目的pipelines,管理通道,主要是对抓取网页后的数据清洗、验证和入库
    │  settings.py          # 项目的设置文件,
    │  __init__.py
    │
    └─spiders             # 这个目录放的是蜘蛛文件,
            __init__.py

  进入simonzhang目录,编辑simonzhang/items.py

from scrapy.item import Item, Field

class ScrapytestItem(Item):
    # define the fields for your item here like:
    # name = Field()
    title =  Field()
    link = Field()
    desc = Field()
    pass

  编写第一个蜘蛛simonzhang/spiders/frist_simonzhang.py

from   scrapy.spider      import   BaseSpider 

class   DmozSpider (BaseSpider): 
      name  =  "simonzhang_net"     # 蜘蛛的名字,一个项目下每个蜘蛛名字必须是唯一的
      allowed_domains = ["simonzhang.net"] 
      start_urls = ["http://www.simonzhang.net/"]  #下载列表,注意域名后面需要一个“/”因为稍后会用于截取文件名

      def  parse (self,response):   # 抓取和保存的方法
           filename    =  response.url.split("/")[2] 
           open (filename, 'wb').write(response .body)

  进入simonzhang/simonzhang/spiders目录运行下面命令:
scrapy crawl simonzhang_net
  运行完毕,看到目录下已经有一个www.simonzhang.net的文件,打开文件可以看到是抓取为首页的文件。

scrapy 学习笔记 二
http://www.simonzhang.net/?p=1112

4月 25

学习 python 编写规范 pep8 的问题笔记

  在学习过程中有如下问题,做个记录。
  以前没有注意的问题
1)
一行列数 : PEP 8 规定为 79 列,这个太苛刻了,如果要拼接url一般都会超。
一个函数 : 不要超过 30 行代码, 即可显示在一个屏幕类,可以不使用垂直游标即可看到整个函数。
一个类 : 不要超过 200 行代码,不要有超过 10 个方法。
一个模块 : 不要超过 500 行。

2)不要在一句import中多个库
不推荐
import os, sys

推荐
import os
import sys

  在整理自己代码的时候记录的问题。

错误记录:W292 no newline at end of file
处理:打个回车有新的一空行即可(新行不要有空格)。

错误记录:E302 expected 2 blank lines, found 1
处理:上面只有一行空白,但是需要两个空白行

错误记录:E231 missing whitespace after ‘,’
翻译:“,”后要有空格
举例:
错误 print(“%s %s %s %s %s %s” % (A,B,D,E,K,L))
正确 print(“%s %s %s %s %s %s” % (A, B, D, E, K, L))

错误记录:E225 missing whitespace around operator
翻译:
举例:
错误 print(“%s %s %s %s %s %s”%(A, B, D, E, K, L))
正确 rint(“%s %s %s %s %s %s”% (A, B, D, E, K, L))

错误记录:E225 missing whitespace around operator
举例:
错误 f=open(“D:\\test.txt”, “ab”)
正确 f = open(“D:\\test.txt”, “ab”)

参考:
http://www.elias.cn/Python/PythonStyleGuide

4月 23

python 代码规范 pep8

  学习了很久的python,基本都是功能是想,没有遵循过代码规范。当前想成正规军,所以学习一下代码规范。直接学习pep8规范。规范文档下载位置。
http://www.python.org/dev/peps/pep-0008/

  网上也有不少中文的简要代码规范,可以参考。个人也没有细看,准备实践中学习,所以使工具来辅助检查,检查工具下载位置。直接用easy_install安装比较方便。
http://pypi.python.org/pypi/pep8/

  用之前的彩票代码试试,很多毛病呀,如下图

  平时都用eclipse,所以还是装配置在eclipse上比较方便。当前eclipse已经支持了python,直接配置pep8。

  打开eclipse开始配置,Window->Preferences->PyDev->Editor->Code Analysis,打开pep8.py 的标签页选择waring,如下图。

  重启eclipse后看到有很多的叹号,把鼠标放上去能看到问题。开始慢慢学习了。

演示脚本位置:http://www.simonzhang.net/?p=976

4月 19

python开头不可见字符的处理

  今天要处理一个由程序生成的文本文件,但是开头总有乱码。通过查看文件使用utf-8编码。直接用二进制打印。

for i in open("file.txt","rb"):
    print i 

  得到的乱码是“\xef\xbb\xbf”,处理方法很简单,直接截掉就可以了。

#### \xef\xbb\xbf
if i[:3] == "\xEF\xBB\xBF" :
      i = i[3:]

  但是为什么会出现这个问题,到网上查了一下,是utf-8编码的BOM(Byte Order Mark)。UTF-8 BOM又叫UTF-8 签名,BOM对UFT-8没有用,主要为了支持UTF-16,UTF-32才加上。BOM就是方便编辑器识别。所以直接删掉也没有问题。

参考:
http://www.cnblogs.com/DDark/archive/2011/11/28/2266085.html

4月 17

python 使用资源不断收集中

安装使用:
easy_install安装升级工具,根据自己需要版本获取。有了这个很多东西都不需要了。
http://pypi.python.org/pypi/setuptools#downloads
wget -q http://peak.telecommunity.com/dist/ez_setup.py

开发环境搭建:
eclipse 环境集成安装
http://pydev.org/updates

开发框架:
py2exe
http://starship.python.net/crew/theller/py2e

windows下的摄像头获取
http://videocapture.sourceforge.net/

python转C并编译
http://cython.org/

学习:
watchdog
watchdog 用来监控文件系统事件的Python API和shell实用工具。

pattern
Pattern Web数据挖掘模块。可用于数据挖掘、自然语言处理、机器学习和网络分析

django-sentry
实时Django的异常记录,Django的异常记录到数据库处理程序。

excel操作
http://www.python-excel.org/