
加油!大熊网!
搞过其他开发语言的童鞋使用python引包,引用类文件或者方法都会觉得有些别扭吧。反正我是这么觉得的。 比如你有目录文件,结构如下:首先项目下任何目录文件调用文件夹下面的文件,比如调用untils文件夹下面的os_utils.py,必须创建一个文件名为__init__.py的文件,即使是空文件。作用是声明该文件夹可以作为项目的目录使用。 现在根目录下的文件引用文件夹download下的html_downloader.py文件。正常的情况下使用: from download import html_downloader 但是top_data下的spider_start.py 调用文件夹下面的html_downloader.py文件,如果使用: from download import html_downloader 是不会报错的,但是执行if __name__ == "__main__" 主函数的话会报错:No module named XXX 网上解决该问题的方案很多,但是多少有效果。暂时我使用的方式是: import os #引入os import sys #引入sys o_path = os.getcwd() #获取项目的路径,这个路径是绝对路径,比如你的项目放在D盘根目录下,打印o_path的结果是D:\项目目录 sys.path.append(o_path) #将该目录添加到该文件夹下,把当前目录当成根目录使用 from download import html_downloader #然后可以跟根目录下的文件一样使用这样的方式引用但是此时根目录下的文件比如strat.py文件引用download目录下的html_downloader.py文件,就要改成下面这种方式: import download.html_downloader as downloader #不知道是为什么?没弄明白 这样的方式是目前唯一发现的可行的方案。也许有更好的方式,希望大神们在下面指教。 另外 使用 from .. import download.html_downloader的方式也会报错:E0402:Attempted relative import beyond top-level package,平常理解的..和.在python里都是不一样的。引包方式还是Java比较强大和人性化,不过毕竟python是解释型语言,需要更多的说明而不是写更多的代码。 最近在写一些东西用来方便自己,需要用到爬虫。也许你也用的到,也许也会碰到中文乱码问题。网络上的html大多使用utf-8编码,但是国内也有一些使用ISO-8859-1,gb2312,gbk等,遇到这种编码使用bytes(str, encoding=“gbk”) 由于GB18030>GBK>GB2312,转化GBK编码的页面使用gb18030比较可靠一些,在转str(btyes, encoding="utf-8),麻烦而且效果不好,只有小部分页面能够转化成功。 A没有使用转码的效果,B使用bytes和str转码后的效果,C是我这次使用的方法: 上代码:框框内就是使用的我认为可以通杀任何网站的乱码问题,除非是utf-8和GBK不能编码的网站,有的话加个elif分支即可。 response是响应数据,使用较多就response.content返回二进制格式的数据,写文件用的多,response.text返回html字符串格式,response.encoding = '编码格式',是指定响应数据使用什么编码格式。如果是ISO-8859-1,gb2312,gbk等格式,使用utf-8编码就会出现乱码。如果是utf-8编码格式的html使用gbk来编码也会成乱码,不过补全是乱码,有些能编正确,比如:
为什么要使用码云,点击这里解决了很多GitHub的痛处。对于我来说就是GitHub全英文,我只认识abc不是ABC,好难用。而且网络比国内站点慢很多。 注册码云账户就不说了。 第一步:首先本地初始化一个项目,执行git config 告诉git你是谁,这些信息会出现在你创建的提交中 git config --global user.name "你的名字或者昵称" git config --global user.email "你的邮箱"git bash生成公钥 ssh-keygen -t rsa -C "你的邮箱"一路点击回车即可,文件在C:\Users\Administrator\.ssh 下。可以将生成的公钥粘贴到码云-->个人配置-->公钥,这样使用ssh登录就不用用户名和密码了。 第二步:新建文件夹用作本地仓库 比如在D盘新建 gitspace作为本地仓库,使用bash进入该目录 cd D:/gitspace git init # 初始化git git remote add origin <你的远程仓库地址> #绑定远程仓库 #仓库地址格式:https://gitee.com/yourdir/yourproject.git或者git@gitee.com:yourdir/yourproject.git #这里的yourdir和yourproject是在码云里头新建项目时设置的 第三步:更新到远程仓库git add . #指定更新内容.表示所有的,加目录表示更新某个目录,加文件表示更新某个文件 git commit -m "注释" #git强烈要求提交添加注释 git push -u origin master #执行更新操作 更新前最好是执行git pull --rebase origin master 操作,让gitee与本地代码合并再执行push操作,避免冲突 查看远程仓库:git remote v 删除远程仓库:git remote rm origin <你的远程仓库地址> 踩坑一: push操作如果出现:fatal: Authentication failed for <你的远程仓库地址>,而且有不弹出对话框输入用户名和密码,那么可以使用: git config --system --unset credential.helper然后再push。 出现该错误的原因就是用户名和密码输入不正确。此处的用户名和密码比较坑,因为只有注册码云的时候填了用户名和密码,仓库并没有单独的密码,所以这里的用户名和密码就是git仓库的用户名和密码。而且密码使用特殊字符还不能成功,尽量使用数字和大小写字母组合密码,可以在码云个人设置那里修改密码。 填坑一: 用户名是你注册时候使用的邮箱,而不是别名。比如我在码云注册的用户名是marvin,中文名是马文,邮箱是xxx@xxx.com。这里git使用的是你的邮箱xxx@xxx.com而不是marvin或者马文。容易造成误解的地方是: 你安装成功后使用命令 ssh -T git@gitee.com的时候会提醒你:Welcome to gitee.com, 马文 而初始化项目的时候使用的git config --global user.name "marvin" 这里的配置跟生成公钥私钥有关 但是这两个都不是仓库的登录用户名。 踩坑二: 第一次创建a.git仓库,使用Demo项目,后面就把他删了git remote rm origin https://gitee.com/a/a.git 再重新再gitee后台创建一个叫a.git的仓库,使用code项目,code项目赋值到本地仓库,进行push:git push -u origin master 提示错误: ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://gitee.com/a/a.git' 连续的错误,头好大。学习一个新东西哪有不撞墙的,撞了东墙装西墙。学习新东西的正确打开方式,应该先看文档了解工作原理再动手实践。无奈自己是个急性子又沉不下心来看理论知识。直接百度就开始干。这不是个好习惯。 填坑二: 之前说了push操作前先pull,以免发生冲突。 git pull origin master, 又有新问题出现: From https://gitee.com/a/a * branch master -> FETCH_HEAD * [new branch] master -> origin/master fatal: refusing to merge unrelated histories 错误的大概意思是拒绝合并一个不想管的历史仓库,也就是说历史仓和新提交的本地仓库的项目并不相关,拒绝合并。虽然是错误,头大。但不得不说git管理代码的严谨性棒棒哒。因为之前仓库已经被删了(使用被删的仓库作为新的仓库,会有这个问题,应该是某些做记录的文件没有被删除),两个项目不同合并了也不会有什么问题,告知git忽略这个问题 git pull origin master --allow-unrelated-histories,执行后会进入vi状态,进行注释。再使用push操作,成功。两个问题一起解决。 然后就可以clone项目了。
本例安装postgresql-10.4-1-windows-x64 postgresql中文社区下载地址:http://www.postgres.cn/download/ postgresql官网下载地址:https://www.postgresql.org/download/ 由于网络问题,本例选用的下载地址:https://download.pchome.net/development/database/download-8864.html postgresql 10 安装时会默认安装pgadmin,所以不需要单独安装pgadmin postgresql安装完之后,以安装目录E:\Program Files\PostgreSQL\10为例 1、需要先设置环境变量,包括三项:data存放路径,lib以及bin目录 E:\Program Files\PostgreSQL\10\data;(data的安装目录是可选的,例子是放在安装目录的data文件夹) E:\Program Files\PostgreSQL\10\lib; E:\Program Files\PostgreSQL\10\bin; 2、初始化数据簇,使用initdb命令。 先进入data上一级目录(E:\Program Files\PostgreSQL\10)执行命令 initdb -U xx -W -D data ps: xx 是超级用户名,设置属于你自己的用户名,如不知道initdb命令可使用 initdb --help查看。 tips:如果直接使用initdb -U xx -W -D E:\Program Files\PostgreSQL\10\data进行初始化会提示错误“initdb:命令行参数太多” 执行完之后会提示: 此时data目录下会出现很多文件夹和文件: 3、不要急着启动,修改data目录下postgresql.conf配置,将前面的#去掉即可 listen_addresses = 'localhost' # what IP address(es) to listen on; port = 5432 # (change requires restart) superuser_reserved_connections = 3 # (change requires restart) 如需打开其他配置,可以根据自己的情况进行更改 data目录下还有一个名为pg_hba.conf的文件,pg10默认配置好的,使用默认即可,主要是添加许可权限。 # IPv4 local connections: host all all 127.0.0.1/32 trust 该配置的意思是信任host地址为127.0.0.1/32 的所有用户所有数据库访问,pgadmin中的主机名称和地址就只能是127.0.0.1而不能是localhost,如需使用localhost在下面添加host all all localhost trust,重启服务 4、启动服务 pg_ctl -D data -l logfile start 如果已经启动,没关系使用pg_ctl -D data -l logfile stop,然后在启动 5、使用服务进行启动, pg_ctl register -N PostgreSQL -D data 执行后服务中会出现服务名为PostgreSQL服务,如果已经启动服务 pg_ctl -D data -l logfile stop,然后点击服务启动,设置为自动,开机就会启动服务。如果遇到错误,请在当前目录下查找日志文件logfile,本例的日志文件所在目录E:\Program Files\PostgreSQL\10 6、使用pgadmin创建servers时,维护数据库必须是postgres,不是你创建的database,使用sql shell登录也是一样的。因为默认数据库是postgres。如果不填postgres会出现各种稀奇古怪的错误。比如:'utf8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
阿里云新购机器必须将实例加入安全组,否则外网是不能访问实例的。创建安全组后需要进行入网规则设置,也就是通过80端口,443端口等访问内网。 部署Django+Nginx+uwsgi ssh登录远程服务器,如果觉得实例名太长了可以改hostname。hostname yourname 然后su1、yum update 更新yum 这是可选项。 2、 yum install nginx 安装nginx前,安装gcc-c++,openssl,*prce*, zlib* 安装完之后whereis nginx查看一下安装位置。默认安装在/etc/nginx下 nginx默认监听80端口,访问服务器外网ip如果能出现如下界面说明安装并启动成功。 如果不能,则需要进行下面操作: /usr/sbin/nginx -c /etc/nginx/nginx.conf #指定nginx配置文件,如果不指定,会启动失败 /usr/sbin/nginx -s reload #这条命令不管nginx之前是否启动成功都将重启 再打开看应该就会出现上面的画面了。 设置开机自动启动:vi /etc/init.d/nginx 内容是:https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/ 然后进行权限修改:chmod a+x /etc/init.d/nginx, 使用chkconfig进行管理: chkconfig --add /etc/init.d/nginx chkconfig nginx on 可使用service nginx start 和 service nginx stop进行启动和关闭。 3、安装python 安装python之前先把数据库sqlite安装好,否则在安装mezzanine的时候数据库创建不了。 安装数据库,yum install sqlite-devel (目前已经更新到sqlite3版本了) 安装完后使用sqlite3 --version查看版本号。 wget https://www.python.org/ftp/python/3.6.5/ python版本,我下的是Python-3.6.5.tgz 安装python3, 系统默认安装了python2.7。下载完成后进行一下操作 解压 tar -zxvf Python-3.6.5.tgz 配置环境 ./configure --prefix=/usr/local/python3 安装 make & make install 进行软链 ln -s /usr/local/python3/bin/python /usr/bin/python 同时python3会安装pip的最新版本,ln -s /usr/local/python3/bin/pip3 /usr/bin/pip 注意:如果升级了python3,yum会出问题,因为yum是使用python做解析器的 vi /usr/bin/yum vi /usr/libexec/urlgrabber-ext-down 将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2"即可 真实环境中安装uwsgipip install uwsgi 4、安装虚拟环境 (1)pip install virtualenv (2)安装完之后软链一下ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv 然后执行virtualenv env35(虚拟环境名,自己随意取),软链的目的就是为了让virtualenv这个命令能简化执行,不软连的话可以执行/usr/local/python3/bin/virtualenv env35 (3)进入虚拟环境source env35/bin/activate (4)退出虚拟环境deactivate 5、在虚拟环境下安装Django和mezzanine (1)pip install mezzanine(mezzanine需要Django,所以直接安装mezzanine即可,Django会被自动安装上。) (2)创建mezzanine项目:mezzanine-project libpath (3)创建数据库 , python manage.py createdb,设置密码:xxxx (4)收集静态文件,python manage.py collectstatic (5)配置setting, vi libpath/settings.py,找到allow_host 添加外网ip (6)测试是否安装成功,python manage.py runserver 0.0.0.0:8000(阿里服务器实例添加到安全组,并添加规则允许8000端口被外网访问) 如果能出现下面的画面则安装成功。 6、安装协议模块 (1)虚拟环境中安装uwsgi, pip install uwsgi 安装后进行测试uwsgi --http :8000 --module libpath.wsgi 7、配置文件 最主要的三个文件: nginx.conf error_log /etc/nginx/logs/error.log; pid /etc/nginx/logs/nginx.pid; events { worker_connections 4096; } http{ # nginx需要连接的上游 upstream django { #server unix:///path/to/your/mysite/mysite.sock; # 使用unix套接字 server 127.0.0.1:8001; # 使用TCP端口请注释上一行,并取消本行注释,这里的端口指的是跑uwsgi的端口 } include /etc/nginx/mime.types; # nginx服务器配置 server { # 监听端口 listen 80; # 域名 server_name .yoursite.com; # 编码 charset utf-8; # 最大上传大小 client_max_body_size 75M; # Django 的media路径 location /media { alias /app/librepath/media; } # 静态文件路径 location /static { alias /app/librepath/static; } # 将动态请求转发到uwsgi跑的django程序 location / { uwsgi_pass django; include /app/uwsgi_params; # 从github上下载的uwsgi_params 文件路径 } } } uwsgi_params (nginx安装目录下就有现成的):mv /etc/nginx/uwsgi_params /app/uwsgi_params uwsgi.ini 创建webapp用户和组,如果不使用uid =webapp,默认使用root,会提示多行您使用root的警告。 groupadd webapp useradd -g webapp webapp [uwsgi] uid =webapp gid =webapp chdir =/app/librepath module =librepath.wsgi home =/app/env35 master =true processes =10 socket = :8001 chmod-socket = 666 vacuum =true enable-threads =true thunder-lock =true 文中使用的是socket端口通信,也可使用socket文件进行通信。设置nginx自启或者 /usr/sbin/nginx -c /etc/nginx/nginx.conf,/usr/sbin/nginx -s reload 启动uwsgi /usr/local/python/bin/uwsgi --ini /app/uwsgi.ini