日曜大工の位置監視

検索エンジン、最初のクエリの位置の監視を行います。



通常、顧客の増加に関心があります。

そして、何かを増やすためには、まずそれを評価しなければなりません。

また、歴史的に、一部の顧客が検索エンジンからオンラインストアにアクセスすることがありました。

(興味のある方は、以下の記事でコンテキスト広告と価格アグリゲーターとの連携について書きます。)

また、検索エンジンで自分の状態を評価するには、通常、検索結果のクエリのステータスに関する統計を収集する必要があります。



ツールは2つの部分で構成されます。





リクエストに応じてyandex.ruから自分の立場を学びます。



すぐに明確にしたいので、この記事では基本について説明し、最も簡単なオプションを作成します。これは将来改善されます。



まず、htmlでurlを返す関数を作成しましょう。


pycurlを使用してページをロードします。

import pycurl c = pycurl.Curl()
      
      





ロードするURLを設定します

 url = 'ya.ru' c.setopt(pycurl.URL, url)
      
      





ページの本文を返すために、curlはコールバック関数を使用して、htmlで文字列を渡します。

StringIO文字列バッファーを使用します。入力にはwrite()関数があり、getvalue()を使用してすべてのコンテンツを取得できます。

 from StringIO import StringIO c.bodyio = StringIO() c.setopt(pycurl.WRITEFUNCTION, c.bodyio.write) c.get_body = c.bodyio.getvalue
      
      





念のため、curlをブラウザのように見せ、タイムアウト、ユーザーエージェント、ヘッダーなどを記述します。

 c.setopt(pycurl.FOLLOWLOCATION, 1) c.setopt(pycurl.MAXREDIRS, 5) c.setopt(pycurl.CONNECTTIMEOUT, 60) c.setopt(pycurl.TIMEOUT, 120) c.setopt(pycurl.NOSIGNAL, 1) c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0') httpheader = [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Charset:utf-8;q=0.7,*;q=0.5', 'Connection: keep-alive', ] c.setopt(pycurl.HTTPHEADER, httpheader)
      
      





次にページをロードします

 c.perform()
      
      





それだけです、ページは私たちと一緒です、私たちはhtmlページを読むことができます

 print c.get_body()
      
      





ヘッダーを読むことができます

 print c.getinfo(pycurl.HTTP_CODE)
      
      





また、200以外のサーバー応答を受け取った場合は、処理できます。 例外をスローするだけです。次の記事で例外を処理します。

 if c.getinfo(pycurl.HTTP_CODE) != 200: raise Exception('HTTP code is %s' % c.getinfo(pycurl.HTTP_CODE))
      
      







関数になったすべてをラップして、最終的には

 import pycurl try: from cStringIO import StringIO except ImportError: from StringIO import StringIO def get_page(url, *args, **kargs): c = pycurl.Curl() c.setopt(pycurl.URL, url) c.bodyio = StringIO() c.setopt(pycurl.WRITEFUNCTION, c.bodyio.write) c.get_body = c.bodyio.getvalue c.headio = StringIO() c.setopt(pycurl.HEADERFUNCTION, c.headio.write) c.get_head = c.headio.getvalue c.setopt(pycurl.FOLLOWLOCATION, 1) c.setopt(pycurl.MAXREDIRS, 5) c.setopt(pycurl.CONNECTTIMEOUT, 60) c.setopt(pycurl.TIMEOUT, 120) c.setopt(pycurl.NOSIGNAL, 1) c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0') httpheader = [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Charset:utf-8;q=0.7,*;q=0.5', 'Connection: keep-alive', ] c.setopt(pycurl.HTTPHEADER, httpheader) c.perform() if c.getinfo(pycurl.HTTP_CODE) != 200: raise Exception('HTTP code is %s' % c.getinfo(pycurl.HTTP_CODE)) return c.get_body()
      
      





機能を確認する

 print get_page('ya.ru')
      
      







検索結果ページから、位置のあるサイトのリストを選択します


検索クエリを作成し、

yandex.ru/yandsearchで 、3つのGETパラメーターを送信する必要があります。

'text'-request、' lr'-search region、 'p'-issueのページ

 import urllib import urlparse key='' region=213 page=1 params = ['http', 'yandex.ru', '/yandsearch', '', '', ''] params[4] = urllib.urlencode({ 'text':key, 'lr':region, 'p':page-1, }) url = urlparse.urlunparse(params)
      
      





URLを印刷して、ブラウザーでチェックインします

 print url
      
      





前の関数の出力を含むページを取得します

 html = get_page(url)
      
      





ここで、lxmlを使用してdomモデルに従って解析します

 import lxml.html site_list = [] for h2 in lxml.html.fromstring(html).find_class('b-serp-item__title'): b = h2.find_class('b-serp-item__number') if len(b): num = b[0].text.strip() url = h2.find_class('b-serp-item__title-link')[0].attrib['href'] site = urlparse.urlparse(url).hostname site_list.append((num, site, url))
      
      





ここで何が起こっているのかを詳しく書きます

lxml.html.fromstring(html)-html文字列からhtmlドキュメントオブジェクトを作成します

.find_class( 'b-serp-item__title')-クラス 'b-serp-item__title'を含むすべてのタグのドキュメントを調べ、交差する位置に関する情報を含むH2要素のリストを取得し、それらをループします

b = h2.find_class( 'b-serp-item__number')-見つかったH2タグ内で要素bを探します。これにはサイトの位置番号が含まれます。見つかった場合は、サイトの位置b [0] .text.strip()および行c urlサイト

urlparse.urlparse(url).hostname-ドメイン名を取得



結果のリストを確認してください

 print site_list
      
      





そして、機能になったすべてを収集します

 def site_list(key, region=213, page=1): params = ['http', 'yandex.ru', '/yandsearch', '', '', ''] params[4] = urllib.urlencode({ 'text':key, 'lr':region, 'p':page-1, }) url = urlparse.urlunparse(params) html = get_page(url) site_list = [] for h2 in lxml.html.fromstring(html).find_class('b-serp-item__title'): b = h2.find_class('b-serp-item__number') if len(b): num = b[0].text.strip() url = h2.find_class('b-serp-item__title-link')[0].attrib['href'] site = urlparse.urlparse(url).hostname site_list.append((num, site, url)) return site_list
      
      





機能を確認する

 print site_list('', 213, 2)
      
      







サイトのリストでサイトを見つける


「www」を遮断するヘルパー機能が必要です。 サイトの最初に

 def cut_www(site): if site.startswith('www.'): site = site[4:] return site
      
      







サイトのリストを取得して、当社のサイトと比較してください

 site = 'habrahabr.ru' for pos, s, url in site_list('python', 213, 1): if cut_www(s) == site: print pos, url
      
      





うーん、「python」による発行の最初のページにはハブがありません。深さのループで問題を調べてみましょう。

しかし、制限max_positionを設定する必要があります-どの位置にチェックするか、

同時に、関数でラップし、何も見つからない場合はNone、Noneを返します

 def site_position(site, key, region=213, max_position=10): for page in range(1,int(math.ceil(max_position/10.0))+1): site = cut_www(site) for pos, s, url in site_list(key, region, page): if cut_www(s) == site: return pos, url return None, None
      
      





確認する

 print site_position('habrahabr.ru', 'python', 213, 100)
      
      







それが実際に私たちの立場を獲得したことです。



書いてください、このトピックは興味深いですか、私は続けますか?



次の記事で何を書きますか?

-タブレットとグラフを使用してこの機能へのWebインターフェースを作成し、cronにスクリプトを掛けます

-手動および特別なAPIの両方で、この関数のキャプチャ処理を行います

-マルチスレッドでwhat-threadの監視スクリプトを作成する

-APIまたは価格管理を介してアナウンスメントを生成および入力する例により、ディレクティブを使用して作業を説明する



All Articles