之前一直用博客,然鹅现在用RSS的伙伴越来越少了,公众号这种主动推送机制对读者和作者都很好用,所以欢迎大家关注我的微信公众号:IT漫步。主要分享自己折腾的各类技术和一些观点。扫码关注:

公众号二维码


昨天的这个时候我开始着手做的,今天的这时候我终于完工了。相比于国内的百度、搜狗网盟,谷歌的Adsense的收入明显要高得多。但是国外站不好维护。我把关键的几个文件都传到Github了,因为抽风所以我在国内的oschina建了一个镜像:

http://git.oschina.net/cheneyveron/WebsiteGroup

https://github.com/cheneyveron/WebsiteGroup

一、批量建立网站

因为是外文站,所以域名都是类似于en.itmanbu.com的二级域名,所以略微修改一下以后新建网站的脚本在vhost.sh(因为有400多行所以不方便贴,github和oschina都放了一份),只需要拉到最下面,修改domain1数组和n的值就行了:

Add_Vhost() {
 i=1
 n=21
 domain1[0]="kor.itmanbu.com"
 domain1[1]="fra.itmanbu.com"
 domain1[2]="spa.itmanbu.com"
 domain1[3]="th.itmanbu.com"
 domain1[4]="ara.itmanbu.com"
 domain1[5]="ru.itmanbu.com"
 domain1[6]="pt.itmanbu.com"
 domain1[7]="de.itmanbu.com"
 domain1[8]="it.itmanbu.com"
 domain1[9]="el.itmanbu.com"
 domain1[10]="nl.itmanbu.com"
 domain1[11]="pl.itmanbu.com"
 domain1[12]="bul.itmanbu.com"
 domain1[13]="est.itmanbu.com"
 domain1[14]="dan.itmanbu.com"
 domain1[15]="fin.itmanbu.com"
 domain1[16]="cs.itmanbu.com"
 domain1[17]="rom.itmanbu.com"
 domain1[18]="slo.itmanbu.com"
 domain1[19]="swe.itmanbu.com"
 domain1[20]="hu.itmanbu.com"
 for idx in ${!domain1[@]} ; do
 echo
 domain=${domain1[$idx]}
 echo "adding $domain"
 Choose_env
 Input_Add_domain
 Nginx_anti_hotlinking
 Nginx_rewrite
 Create_nginx_php-fpm_hhvm_conf
 done
}

这个bash脚本我是直接改的Oneinstack中的vhost.sh,修改过的这个脚本一执行就会直接建立从en.itmanbu.com到hu.itmanbu.com这23个虚拟主机、绑定好域名、伪静态模式wordpress、有防盗链、无日志、无ssl。

二、安装wordpress

因为要安装不同语言版的wordpress所以我手动到官方找的各个语言版。

小提示

到谷歌搜索“wordpress 那个语言的语言名称”就能找到对应的wordpress版本,比如“wordpress česky”就能找到捷克语版wordpress

然后执行下面的语句解压文件和移动目录

cd ce.itmanbu.com
wget https://cs.wordpress.org/wordpress-4.3.1-cs_CZ.zip
unzip wordp*
mv ./wordpress/* ./
rm -rf ./wordpress

接下来打开ce.itmanbu.com安装就行。

什么?我要的自动化安装呢?

其实可以安装好一个以后复制数据库、写一个shell脚本复制文件、改mysql地址的。然而,我懒,而且预期工作量也不小。。。

三、Python爬虫采集并分离信息

因为我想采集的糗事百科禁止采集,所以得加一个伪装的浏览器头部信息(User-agent)才行,文件是testhttp.py,下面的内容最好别直接复制粘贴,毕竟空格不好办。

因为正规的网站往往源码很规范,所以用re.findall来分离的时候就比较好办,不过我还是查阅了正则表达式30分钟入门以后才搞定(.*)的意思。因为.是代表非换行符的任意字符所以在它的前后如果网页源码里有换行就不行,得用n来排除才行。*代表重复零次或更多次,组合起来就代表提取出任意非换行字符的组合。

#/usr/bin/env python
#coding=utf8
import urllib2
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#得到html的源码
def gethtml(url1):
 #伪装浏览器头部
 headers = {
 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
 }
 req = urllib2.Request(
 url = url1,
 headers = headers
 )
 html = urllib2.urlopen(req).read()
 return html
#得到目标url源码
code1 = gethtml('http://www.qiushibaike.com/8hr/page/1')
#提取内容
content1 = re.findall('<div class="content">nn(.*)n<!--',code1)
#追加的方式记录采集来的内容
f = open('contents.txt','a+')
#读取txt中的内容
exist = f.read()
for i in content1
 if i not in exist1:
 open('contents.txt','a+').write(i+'n')
 print i
 else:
 print i+'Already in!'
f.close()

四、调用百度翻译的API翻译文章

百度翻译官方的python demo的结果是返回了一串json数据,为了处理那些json数据我又探索了两个小时才搞定。主要是

  1. response = httpClient.getresponse().read()得到的是纯json数据(Plain Json)
  2. data = json.loads(readres)纯json数据通过loads方法以后得到python的json格式
  3. python的json格式输出才是正常的文字,纯json输出的是Unicode码
  4. 一般情况下并不需要dumps方法

以下是testtrans.py的内容:

#/usr/bin/env python
#coding=utf8
import httplib
import md5
import urllib
import random
import urllib2
import re
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

#得到html的源码
def gethtml(url1):
 #伪装浏览器头部
 headers = {
 'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
 }
 req = urllib2.Request(
 url = url1,
 headers = headers
 )
 html = urllib2.urlopen(req).read()
 return html
#得到目标url源码
code1 = gethtml('http://www.qiushibaike.com/8hr/page/1')
#提取内容
content1 = re.findall('<div class="content">nn(.*)n<!--',code1)
#追加的方式记录采集来的内容
f = open('contents.txt','a+')
#读取txt中的内容
exist = f.read()
for i in content1:
 #如果不在就追加新的内容
 #open('contents.txt','a+').write(i+'n')
 contentdec1 = i
 #百度翻译api
 appid = '20151113000005349'
 secretKey = 'osubCEzlGjzvw8qdQc41'
 httpClient = None
 myurl = '/api/trans/vip/translate'
 fromLang = 'auto'
 toLang = 'jp'
 salt = random.randint(32768, 65536)
 q = contentdec1
 sign = appid+q+str(salt)+secretKey
 m1 = md5.new()
 m1.update(sign)
 sign = m1.hexdigest()
 print q
 myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
 try:
 httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
 httpClient.request('GET', myurl)
 #response是HTTPResponse对象
 response = httpClient.getresponse()
 readres = response.read();
 data = json.loads(readres)
 trans_result = data['trans_result']
 dst = trans_result[0]['dst']+'<p>From:<em><a href="http://www.qiushibaike.com">糗事百科 – 超搞笑的原创糗事分享社区</a></em></p>'
 print dst[:20]
 #data_string = json.dumps(dst,ensure_ascii=False)
 #print data_string[:20]
 except Exception, e:
 print e
 finally:
 if httpClient:
 httpClient.close()
 print 'posts updates'
f.close()

什么?你觉得你看到了一个api和secret?那是百度官方演示的api,咱们超出每月200万字的翻译可是要扣费的哦,所以随便祸害吧它:)

五、调用wordpress_xmlrpc直接发布到wordpress

参考了itseo

wordpress_xmlrpc官网:http://python-wordpress-xmlrpc.readthedocs.org/en/latest/

打开以后下载、解压,执行setup.py就能安装上python的这个扩展

然后使用

from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost

就能调用。注意WordPressPost对象的几个属性

  • content是文章内容,字符串,里面的</br>等标签会自动解析
  • post_status是文章状态,字符串,publish代表已发布,draft代表草稿箱,默认draft
  • title是标题,字符串

testpost.py内容:

#coding:utf-8
import urllib2
import re
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import NewPost
#链接WordPress,输入xmlrpc链接,后台账号密码
wp = Client('http://example.com/xmlrpc.php','username','password')
post = WordPressPost()
post.content = 'a test post</br>哈哈哈'
post.post_status = 'publish'
#发送到WordPress
wp.call(NewPost(post))
print 'posts updates'

六、整合并设置定时任务

做好上面的实验,直接整合就很简单了,整合后的文件为collect.py,为了减轻服务器的压力我设定了每次发文章前等待3秒钟,即time.sleep(3),还做了一些小优化,见collect.py。

至于定时任务,输入crontab  -e就会用vim编辑器打开定时任务的配置文件,每一行是一个任务,具体的请参考万能的度娘,下面是一条命令

0 2,4,6,8,10,12,14,16,18,20,22 * * * /usr/bin/python /root/py/collect.py

0分 每日2,4,6,8,10,12,14,16,18,20,22时 每周 每月 每年 用/usr/bin/python 执行/root/py/collect.py

也就是每天的2,4,6,8,10,12,14,16,18,20,22时执行一下/root/py/collect.py,哈哈哈这个频率够高吧。