中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

全自動監(jiān)控網站關鍵詞排名(Python實現)

2019-03-21    來源:semwatch.org

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

從這篇文章開始不打算再花費大量精力去寫程序本身的知識,畢竟是各類書籍上有的內容。其余主要需要學習的是內置函數的使用,和一些模塊的使用方式,尤其是pycurl,re,threading這些需要慢慢熟悉起來。

若在學習中有不解的地方,在文章評論中可以提出,如果有空會盡力幫忙解答。

程序需求

對于稍大的一個網站,往往會有許多關鍵詞需要每隔一個周期監(jiān)控它們的排名,以分析SEO效果的好壞,及判斷百度Google的動向等等。

有一個關鍵在于數據的收集全自動與否的問題。若經常用Google Analytics分析數據的話應該會感覺到,數據分析的需求是多種多樣的,只有事先已經有了完善的各個維度的數據以后,才能隨著最初的想法進行分析,而不會為數據的匱乏所局限。像Google Analytics這樣出色的工具完全自動的將這些數據收集了起來,才給SEO對于流量的多樣化分析打下了基礎。同樣的,如果想分析的時候更自由的話,就需要記錄盡多種類的歷史數據,如果這些作為每日工作,那將耗時非常長,所以自動化的收集就體現出了其重要性。

現有的監(jiān)控排名主要解決方案是使用商業(yè)軟件Rank Tracker,但它也有些不是很理想的地方。比如對于幾乎所有既有軟件都存在的問題,功能不靈活。另外它最大的弊端之一在于它一定要找個具有圖形界面的系統(tǒng)運行(因為它是Java實現的,有多操作系統(tǒng)版本,所以不一定是Windows)。

對于DIY的Python腳本,在Linux系統(tǒng)里面可以將其放到crontab中(系統(tǒng)級計劃任務),全自動的定時運行收集原始數據。然后在需要的時候,再用另外的腳本來處理原始數據,進行各個維度的分析。所需的一般情況下為:Linux系統(tǒng)的低配置VPS一臺,總共不超過100行的Python代碼(Windows也能實現這些,但相對比較麻煩)。

然后再來分析更具體的需求。此處我總結了一些原則:

1. 除非數據量大到會對硬盤帶來壓力(比如每日數G的日志的分析等),不然把能想到的盡多的數據都記錄下來。因為分析的需求是多變的,數據若全面即可有備無患。

2. 同上,除非數據量極大,不然務必把歷史數據全部保存下來。在大數據量的時候,也需要按實際情況保存一定時間區(qū)間的數據(打個比方,前3年每月保存一副本,當年每周保存一副本)。歷史數據的對比在很多時候的意義非常大。

3. 當數據非常單一的時候,使用txt按行保存;當數據比較簡單的時候,使用csv按行列儲存;當數據比較復雜的時候,可以考慮使用MongoDB等key-value型NoSQL儲存;再復雜的時候,使用MySQL之類的關系性數據庫儲存。但這些不是絕對的,還是要看實際情況而定。

對于目前的需求,因為是要監(jiān)控關鍵詞排名趨勢,所以一般最多監(jiān)控幾千個關鍵詞就夠了;蛟S網站比較大,想了解數十萬的關鍵詞的排名,但對于了解排名趨勢的情況下,沒必要全部查詢,隨機選取其中一小部分作為樣本就可以了。

因為最多幾千個關鍵詞,所以最好每天記錄一次它們的排名數據(保證穩(wěn)定的情況下,對于單IP,Google每天可以查詢5000+詞,百度則可以查詢數萬的詞)。而且數據本身,主要為關鍵詞、排名、著陸頁URL這幾項,文件體積很小,所以每天都保存一份數據。

數據的儲存方式上,此時一般建議選擇csv。它和Excel表格(xls)在數據的儲存方式上是一模一樣的。

代碼實現

這些代碼需要以下運行環(huán)境:

Linux操作系統(tǒng)

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('http://www.xxx.com/'), 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,然后在同一目錄下創(chuàng)建一個新文件,輸入以下測試代碼:

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

import curl

print curl.curl('http://g.cn/') #這樣即下載了一個網頁

#以下是比較保險的下載方式,因為各種原因,就算總體很穩(wěn)定的網站也偶爾會出現網頁暫時無法打開的情況

#當網頁下載出錯時,如果retry為True,則會不斷重試,直到下載完網頁

#delay則指定了幾次重試之間的時間間隔,以秒為單位

print curl.curl('http://g.cn/', retry=True, delay=1)

#以下用到了一些Curl的參數,詳細說明可見:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html

print curl.curl('http://g.cn/', FOLLOWLOCATION=False, COOKIE='mycookie')

這個模塊會在以后幾乎每個腳本里面都用到,所以這些基礎用法務必牢記。接下來是監(jiān)控網站關鍵詞排名的正式代碼:

cron.py

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

#加載模塊,此處大致按功能劃分行,是為了能夠更方便理解代碼

import sys, os, random, time, datetime

import urllib, re

import curl

#sys.argv是系統(tǒng)參數,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時間是為了避免時區(qū)問題帶來的未知麻煩

#北京時間是UTC+8,如該日UTC時間01:00相當于北京時間09:00

now = datetime.datetime.utcnow()

#將UTC時間格式化,變成如1970-01-01的格式

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

#嘗試創(chuàng)建文件夾,如果文件夾已創(chuàng)建則跳過

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 = 'http://www.baidu.com/s?wd=%s&rn=100' % encoded_keyword

#下載SERP,如果出現驗證碼即延時10分鐘并重試

while 1:

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

if '<img src="http://verify.baidu.com/cgi-bin/' in html:

except:

f.write('%s\t%d\t%s\n' % (keyword, -1, '-'))

continue

#如果在前100名找到網站,則find=True

find = False

#在SERP上面的URL中,尋找網站并確定排名

for pos, url in enumerate(urls, 1):

if site in url:

f.write('%s\t%d\t%s\n' % (keyword, pos, url))

find = True

break

#如果前100名沒有找到網站

if not find: #更標準的寫法是if find==False:

f.write('%s\t%d\t%s\n' % (keyword, -1, '-'))

delay = random.randint(1,2) #隨機設定延時時間為1秒或2秒

time.sleep(delay) #等待x秒以后繼續(xù)查詢下一個詞的排名

這段代碼即可監(jiān)控排名并收集數據。它的使用命令如:python cron.py semwatch.org keywords.txt

在運行之前,先要把關鍵詞按行分隔,保存成txt文件,并在運行參數中讓腳本去讀取它。每次運行之后,會在/home/rank/文件夾下,創(chuàng)建一個類似1970-01-01.csv這樣文件名的文件,保存著當日的關鍵詞排名情況。

標簽: 關鍵詞排名 監(jiān) 贗竟丶

版權申明:本站文章部分自網絡,如有侵權,請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:企業(yè)網站SEO診斷中的幾個重點問題

下一篇:SEO推廣第一要務網絡編輯能力