从这篇文章开始不打算再花费大量精力去写程序本身的知识,毕竟是各类书籍上有的内容。其余主要需要学习的是内置函数的使用,和一些模块的使用方式,尤其是pycurl, re, threading这些需要慢慢熟悉起来。

若在学习中有不解的地方,在文章评论中可以提出,如果有空会尽力帮忙解答。

程序需求

对于稍大的一个网站,往往会有许多关键词需要每隔一个周期监控它们的排名,以分析SEO效果的好坏,及判断百度Google的动向等等。

有一个关键在于数据的收集全自动与否的问题。若经常用Google Analytics分析数据的话应该会感觉到,数据分析的需求是多种多样的,只有事先已经有了完善的各个维度的数据以后,才能随着最初的想法进行分析,而不会为数据的匮乏所局限。像Google Analytics这样出色的工具完全自动的将这些数据收集了起来,才给SEO对于流量的多样化分析打下了基础。同样的,如果想分析的时候更自由的话,就需要记录尽多种类的历史数据,如果这些作为每日工作,那将耗时非常长,所以自动化的收集就体现出了其重要性。

现有的监控排名主要解决方案是使用商业软件Rank Tracker,但它也有些不是很理想的地方。比如对于几乎所有既有软件都存在的问题,功能不灵活。另外它最大的弊端之一在于它一定要找个具有图形界面的系统运行(因为它是Java实现的,有多操作系统版本,所以不一定是Windows)。

对于DIY的Python脚本,在Linux系统里面可以将其放到crontab中(系统级计划任务),全自动的定时运行收集原始数据。然后在需要的时候,再用另外的脚本来处理原始数据,进行各个维度的分析。所需的一般情况下为:Linux系统的低配置VPS一台,总共不超过100行的Python代码(Windows也能实现这些,但相对比较麻烦)。

然后再来分析更具体的需求。此处我总结了一些原则:

1. 除非数据量大到会对硬盘带来压力(比如每日数G的日志的分析等),不然把能想到的尽多的数据都记录下来。因为分析的需求是多变的,数据若全面即可有备无患。

2. 同上,除非数据量极大,不然务必把历史数据全部保存下来。在大数据量的时候,也需要按实际情况保存一定时间区间的数据(打个比方,前3年每月保存一副本,当年每周保存一副本)。历史数据的对比在很多时候的意义非常大。

3. 当数据非常单一的时候,使用txt按行保存;当数据比较简单的时候,使用csv按行列储存;当数据比较复杂的时候,可以考虑使用MongoDB等key-value型NoSQL储存;再复杂的时候,使用MySQL之类的关系性数据库储存。但这些不是绝对的,还是要看实际情况而定。

对于目前的需求,因为是要监控关键词排名趋势,所以一般最多监控几千个关键词就够了。或许网站比较大,想了解数十万的关键词的排名,但对于了解排名趋势的情况下,没必要全部查询,随机选取其中一小部分作为样本就可以了。

因为最多几千个关键词,所以最好每天记录一次它们的排名数据(保证稳定的情况下,对于单IP,Google每天可以查询5000+词,百度则可以查询数万的词)。而且数据本身,主要为关键词、排名、着陆页URL这几项,文件体积很小,所以每天都保存一份数据。

数据的储存方式上,此时一般建议选择csv。它和Excel表格(xls)在数据的储存方式上是一模一样的。

代码实现

这些代码需要以下运行环境:

Linux操作系统

Python的第三方模块pycurl

Python下载网页的最简单方式是:

import urllib2

print urllib2.urlopen('http://***.com/').read()

但urllib2模块本身功能虽然还行,却仍离pycurl模块有较大距离。且在做稍微复杂一些的操作时,pycurl模块使用起来比urllib2模块方便很多。pycurl是必须要熟练运用的模块之一,但也因为它上手可能会让人有点头疼,这里我自己写了一个模块,以此即可方便的使用它:

from pycurl import *

import StringIO, time, random

def curl(url, retry=False, delay=1, **kwargs):

'''Basic usage: curl(';), will download the url.

If set `retry` to True, when network error, it will retry automatically.

`delay` set the seconds to delay between every retry.

**kwargs can be curl params. For example:

curl(url, FOLLOWLOCATION=False, USERAGENT='Firefox')

'''

useragent_list = [

'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',

'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)',

'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)',

'Opera/9.20 (Windows NT 6.0; U; en)',

'Mozilla/4.0 (compatible; MSIE 5.0; Windows NT 5.1; .NET CLR 1.1.4322)',

'Opera/9.00 (Windows NT 5.1; U; en)',

'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.50',

'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 8.0',

'Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]',

'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1',

]

size = len(useragent_list)

useragent = useragent_list[random.randint(0, size-1)]

s = StringIO.StringIO()

c = Curl()

c.setopt(NOSIGNAL, True)

c.setopt(FOLLOWLOCATION, True)

c.setopt(MAXREDIRS, 5)

c.setopt(TIMEOUT, 120)

for key in kwargs:

c.setopt(locals()[key], kwargs[key])

c.setopt(URL, url)

c.setopt(WRITEFUNCTION, s.write)

if ‘USERAGENT’ not in kwargs:

c.setopt(USERAGENT, useragent)

if ‘REFERER’ not in kwargs:

c.setopt(REFERER, url)

while 1:

try:

c.perform()

break

except:

if retry:

time.sleep(delay)

else:

return False

return s.getvalue()

对于简单的采集里面需要用到的下载功能,已经被整合在了这个模块之中。如User-agent轮换、自动301/302跳转等、使用当前URL作为REFERER的有些取巧的方法等。这个模块的代码可以日后再慢慢理解,现在只要知道它的用法即可。

首先到放置Python脚本的目录,将前面一段代码保存为curl.py,然后在同一目录下创建一个新文件,输入以下测试代码:

# -*- coding:utf-8 -*-

import curl

print curl.curl(';) #这样即下载了一个网页

#以下是比较保险的下载方式,因为各种原因,就算总体很稳定的网站也偶尔会出现网页暂时无法打开的情况

#当网页下载出错时,如果retry为True,则会不断重试,直到下载完网页

#delay则指定了几次重试之间的时间间隔,以秒为单位

print curl.curl(';, retry=True, delay=1)

#以下用到了一些Curl的参数,详细说明可见:

print curl.curl(';, FOLLOWLOCATION=False, COOKIE='mycookie')#p#副标题#e#

这个模块会在以后几乎每个脚本里面都用到,所以这些基础用法务必牢记。接下来是监控网站关键词排名的正式代码:

cron.py

# -*- coding:utf-8 -*-

#加载模块,此处大致按功能划分行,是为了能够更方便理解代码

import sys, os, random, time, datetime

import urllib, re

import curl

#sys.argv是系统参数,1:3切片意味着读取参数2,3,分别赋值给两个变量

site, file_keyword = sys.argv[1:3]

keywords = [] #先将keywords声明初始为列表型变量

#迭代文件,每次读取一行文字

for line in open(file_keyword):

line = line.rstrip() #将行尾的空白字符去掉,一般行尾会有换行符等

if line:#判断该行是否是空白行,也可更标准的写作if len(line)!=0:

keywords.append(line) #将读取到的文字加入到keywords列表中

#获取UTC时间,之所以使用UTC时间是为了避免时区问题带来的未知麻烦

#北京时间是UTC+8,如该日UTC时间01:00相当于北京时间09:00

now = datetime.datetime.utcnow()

#将UTC时间格式化,变成如1970-01-01的格式

date = datetime.datetime.strftime(now, '%Y-%m-%d')

#尝试创建文件夹,如果文件夹已创建则跳过

try:

os.mkdir('/home/rank/')

except:

pass

#打开输出数据的文件,以当日的日期命名它

f = open('/home/rank/%s.csv' % date, 'w')

for keyword in keywords:

#因为关键词可能是非ASCII字符集的,所以需要编码

encoded_keyword = urllib.quote_plus(keyword)

#下载SERP并提取链接

url = '; % encoded_keyword

#下载SERP,如果出现验证码即延时10分钟并重试

while 1:

html = curl.curl(url, retry=True, delay=60)

if '

python关键词排名_全自动监控网站关键词排名(Python实现)相关推荐

  1. python阿里巴巴排名_全自动监控网页关键词排名(Python实现)

    在运行之前,先要把关键词按行分隔,保存成txt文件,并在运行参数中让脚本去读取它.每次运行之后,会在/home/rank/文件夹下,创建一个类似1970-01-01.csv这样文件名的文件,保存着当日 ...

  2. python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)

    本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...

  3. 查询关键词排名php源码,网站关键词百度排名在线查询工具曝光!!!

    说到网站流量,像浏览量(PV).访客数(UV).IP数等都是一些关键性的参考指标,而影响这些指标数据最关键的一点是:你网站的关键词在各大搜索引擎搜索结果中的排名以及对应的展现和点击量数据! 如何查看你 ...

  4. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  5. 网站刷关键词_如何提升网站关键词及长尾词的排名 - 百度排名提升软件

    原出处:超级排名系统 原文链接:如何提升网站关键词及长尾词的排名? - 超级排名系统 现在百度的更新几乎每天都在更新,目的是防止别人用软件刷排名和流量,但很多软件仍在不断的模拟用户点击站点.如果你知道 ...

  6. 如何进行网站主题模型优化_如何进行网站关键词优化

    一.选择关键词 新站网站域名的权重本身不高,不适合做热门关键词.对于如何进行关键词优化这个问题,我们该选热门还是冷门关键词呢?下面我就如何进行关键词优化来提如下四个意见: 1:如何进行关键词优化,我们 ...

  7. python宣传图片_宣传图片制作网站

    [宣传图片制作网站为您提供免费seo诊断咨询]独家seo优化建议.如需合作右侧联系客服,承接各类合作. 宣传图片制作网站优化服务介绍 1.行业及竞争对手研究 2.关键词分析研究 3.网站现状详细诊断 ...

  8. seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_企业新网站如何优化快速出排名?...

    企业新网站如何优化快速出排名? 关键词seo网站优化排名技巧,企业新网站如何优化快速出排名,新站想要获取排名需要做好词库规划布局,做好文章内容优化,编写用户需求文章,做好更新和提交URL给百度站长,稳 ...

  9. 旅游网站的主页代码_影响外贸网站seo排名的因素有哪些?

    影响外贸网站排名因素有很多,网上资料基本所提到的是文章质量和死链等等,并没有将问题解释的完全.本期我们深度为大家解析一个网站排名受制于哪些原因,又该用什么方法解决? 苏州seo 1.网站空间服务器 网 ...

最新文章

  1. 监管大屏系统_高速公路监管系统大屏可视化
  2. 团购市场分析:赶集网 团购数据处理过程【笔记】
  3. 来了,「年度最强技术答辩」看这里
  4. oracle解除死锁
  5. redis学习笔记——(1)
  6. C语言编程规范 clean code
  7. 压力校准仪器开发之日--2017-10-31
  8. [转载] 跟着吴恩达学机器学习(Machine Learning) on Coursera 第一天
  9. 从零开始学python必看,最强“Python编程三剑客(pdf)”,你值得拥有!
  10. 自己怎么压缩js文件?
  11. 两军对垒问题及个人的思考
  12. 瘦手臂最快最有效的方法
  13. 茅侃侃 | 生亦何哀,死亦何苦
  14. 看这篇就够了!能源企业数字化升级,推动绿色低碳发展
  15. element tab如何居中_如何用思维导图提高工作效率
  16. 【奥斯卡理财星体系 第三章】丨你适合追求什么样的收益率
  17. 【转】如何在网上查找免费电子书
  18. 百度地图获取地区/省市县json地图区域数据
  19. 利用清华镜像快速安装Python第三方库
  20. One、that、it 做代词的区别

热门文章

  1. CMDB建设补充:教你用django+drf 怎么去生成漂亮的API文档
  2. 光纤中的多种光学模式芯径_「涨知识」你想知道的光纤常识都在这里了,看不看随你...
  3. CSS3背景(background-size、background-origin、background-clip)圆角
  4. c/c++回车不换行
  5. 菜鸟教程JVM优化,看一篇就够了!
  6. HTML嵌套注释、多行注释、多级注释,提高生产力
  7. a pubhub service
  8. js和es6高频面试题总结
  9. 【每日蓝桥】17、一三年省赛Java组真题“带分数”
  10. C语言之Error C2018: unknown character '0x60'