時間:2023-01-18 07:49:02 | 來源:電子商務(wù)
時間:2023-01-18 07:49:02 來源:電子商務(wù)
從這篇文章開始不打算再花費大量精力去寫程序本身的知識,畢竟是各類書籍上有的內(nèi)容。其余主要需要學習的是內(nèi)置函數(shù)的使用,和一些模塊的使用方式,尤其是pycurl, re, threading這些需要慢慢熟悉起來。
若在學習中有不解的地方,在文章評論中可以提出,如果有空會盡力幫忙解答。
程序需求
對于稍大的一個網(wǎng)站,往往會有許多關(guān)鍵詞需要每隔一個周期監(jiān)控它們的排名,以分析SEO效果的好壞,及判斷百度Google的動向等等。
有一個關(guān)鍵在于數(shù)據(jù)的收集全自動與否的問題。若經(jīng)常用Google Analytics分析數(shù)據(jù)的話應(yīng)該會感覺到,數(shù)據(jù)分析的需求是多種多樣的,只有事先已經(jīng)有了完善的各個維度的數(shù)據(jù)以后,才能隨著最初的想法進行分析,而不會為數(shù)據(jù)的匱乏所局限。像Google Analytics這樣出色的工具完全自動的將這些數(shù)據(jù)收集了起來,才給SEO對于流量的多樣化分析打下了基礎(chǔ)。同樣的,如果想分析的時候更自由的話,就需要記錄盡多種類的歷史數(shù)據(jù),如果這些作為每日工作,那將耗時非常長,所以自動化的收集就體現(xiàn)出了其重要性。
現(xiàn)有的監(jiān)控排名主要解決方案是使用商業(yè)軟件Rank Tracker,但它也有些不是很理想的地方。比如對于幾乎所有既有軟件都存在的問題,功能不靈活。另外它最大的弊端之一在于它一定要找個具有圖形界面的系統(tǒng)運行(因為它是Java實現(xiàn)的,有多操作系統(tǒng)版本,所以不一定是Windows)。
對于DIY的Python腳本,在Linux系統(tǒng)里面可以將其放到crontab中(系統(tǒng)級計劃任務(wù)),全自動的定時運行收集原始數(shù)據(jù)。然后在需要的時候,再用另外的腳本來處理原始數(shù)據(jù),進行各個維度的分析。所需的一般情況下為:Linux系統(tǒng)的低配置VPS一臺,總共不超過100行的Python代碼(Windows也能實現(xiàn)這些,但相對比較麻煩)。
然后再來分析更具體的需求。此處我總結(jié)了一些原則:
1. 除非數(shù)據(jù)量大到會對硬盤帶來壓力(比如每日數(shù)G的日志的分析等),不然把能想到的盡多的數(shù)據(jù)都記錄下來。因為分析的需求是多變的,數(shù)據(jù)若全面即可有備無患。
2. 同上,除非數(shù)據(jù)量極大,不然務(wù)必把歷史數(shù)據(jù)全部保存下來。在大數(shù)據(jù)量的時候,也需要按實際情況保存一定時間區(qū)間的數(shù)據(jù)(打個比方,前3年每月保存一副本,當年每周保存一副本)。歷史數(shù)據(jù)的對比在很多時候的意義非常大。
3. 當數(shù)據(jù)非常單一的時候,使用txt按行保存;當數(shù)據(jù)比較簡單的時候,使用csv按行列儲存;當數(shù)據(jù)比較復(fù)雜的時候,可以考慮使用MongoDB等key-value型NoSQL儲存;再復(fù)雜的時候,使用MySQL之類的關(guān)系性數(shù)據(jù)庫儲存。但這些不是絕對的,還是要看實際情況而定。
對于目前的需求,因為是要監(jiān)控關(guān)鍵詞排名趨勢,所以一般最多監(jiān)控幾千個關(guān)鍵詞就夠了。或許網(wǎng)站比較大,想了解數(shù)十萬的關(guān)鍵詞的排名,但對于了解排名趨勢的情況下,沒必要全部查詢,隨機選取其中一小部分作為樣本就可以了。
因為最多幾千個關(guān)鍵詞,所以最好每天記錄一次它們的排名數(shù)據(jù)(保證穩(wěn)定的情況下,對于單IP,Google每天可以查詢5000+詞,百度則可以查詢數(shù)萬的詞)。而且數(shù)據(jù)本身,主要為關(guān)鍵詞、排名、著陸頁URL這幾項,文件體積很小,所以每天都保存一份數(shù)據(jù)。
數(shù)據(jù)的儲存方式上,此時一般建議選擇csv。它和Excel表格(xls)在數(shù)據(jù)的儲存方式上是一模一樣的。
代碼實現(xiàn)
這些代碼需要以下運行環(huán)境:
Linux操作系統(tǒng)
Python的第三方模塊pycurl
Python下載網(wǎng)頁的最簡單方式是:
import urllib2
print urllib2.urlopen('http://***.com/').read()
但urllib2模塊本身功能雖然還行,卻仍離pycurl模塊有較大距離。且在做稍微復(fù)雜一些的操作時,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()
對于簡單的采集里面需要用到的下載功能,已經(jīng)被整合在了這個模塊之中。如User-agent輪換、自動301/302跳轉(zhuǎn)等、使用當前URL作為REFERER的有些取巧的方法等。這個模塊的代碼可以日后再慢慢理解,現(xiàn)在只要知道它的用法即可。
首先到放置Python腳本的目錄,將前面一段代碼保存為curl.py,然后在同一目錄下創(chuàng)建一個新文件,輸入以下測試代碼:
# -*- coding:utf-8 -*-
import curl
print curl.curl(';) #這樣即下載了一個網(wǎng)頁
#以下是比較保險的下載方式,因為各種原因,就算總體很穩(wěn)定的網(wǎng)站也偶爾會出現(xiàn)網(wǎng)頁暫時無法打開的情況
#當網(wǎng)頁下載出錯時,如果retry為True,則會不斷重試,直到下載完網(wǎng)頁
#delay則指定了幾次重試之間的時間間隔,以秒為單位
print curl.curl(';, retry=True, delay=1)
#以下用到了一些Curl的參數(shù),詳細說明可見:
print curl.curl(';, FOLLOWLOCATION=False, COOKIE='mycookie')
關(guān)鍵詞:實現(xiàn),關(guān)鍵
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。