2010年05月03日

URLから読み込むには

特定のURLからデータを読み込むスクリプトを書いてみます。
Pythonには、標準ライブラリの
  urllib,
  urllib2,
  httplib
 の3つにクラスと関数が用意されている。

1. urllib を使う方法
import urllib

url = "http://www.yahoo.co.jp/"
fd = urllib.urlopen(url)
header = fd.info()
print "Content Type is %s" % header["Content-Type"]
data = fd.read()
print data
fd.close()

ソケット接続に失敗すると、例外 IOError が発行される。
しかし、urllib.urlopen() は、サーバーのレスポンスが 404を返しても例外にはならない。


2. urllib2 を使う方法
 urllib2.urlopen() は、HTTP認証、クッキーなどがサポートされているほかは urllib.urlopen() と同じ。

サーバーがステータスコード 404を返したときには、例外 urllib2.HTTPError になる。
この例外のインスタンスには、read()メソッドがあって、
そのままエラーストリームにアクセスできる。
try:
fd = urllib2.urlopen(url)
#ストリームが正常に開かれた
data = fd.read()
except urllib2.HTTPError, e:
#404を返した
data = e.read()

リクエストヘッダーを付加して呼ぶ
req = urllib2.Request('http://www.example.com/')
req.add_header('Referer', 'http://www.python.org/')
req.add_header('User-Agent', 'Mozilla/5.0')
r = urllib2.urlopen(req)

・エラーストリームとは?
接続に失敗しても、サーバーがデータを送ってきた場合には、エラーストリームからデータを読み取ることができる。よくある例として、HTTP サーバがコード 404で応答したときにサーバーから対処策を指示する HTMLヘルプページが送信されることがある。

・参考
Java の HttpURLConnectionクラスの解説

2010年04月11日

Python で fc2ブログに投稿する

#encode: shift_jis
import xmlrpclib
import sys


def main():
server_url = 'http://blog.fc2.com/xmlrpc.php'
blog_id = 'myblog' #http://myblog.blogNum.fc2.com/
username = 'xxx@xxx.com' #mail
password = 'xxxxx'

server = xmlrpclib.Server(server_url)

entry_id = server.metaWeblog.newPost(
blog_id,
username,
password,
{
'title': u'記事の',
'description': '記事の内容',
},
xmlrpclib.True)
print entry_id


if __name__ == "__main__":
main()

2006年02月28日

ブログのトラックバックを送信するには

 ブログのトラックバックの仕組みがいまいち理解できなかったので調べてみました。意外にも簡単な仕組みでした。

・ブログ名 - blog_name
・記事への URL - url
・記事のタイトル - title
・本文の抜粋 - excerpt

これらのパラメータをPing送信先のURLにPOSTで送ればいいだけです。Pythonなら数行でできてしまいます。日本語が含まれているのなら、文字化けしないように UTF-8 でエンコードしてやります。

# encoding: shift_jis
import urllib

def sendTrackback(tr_url, blog_name, url, title, excerpt):
  post_data = urllib.urlencode({
     'title': title.encode("utf-8"), 
     'url': url, 
     'excerpt': excerpt.encode("utf-8"), 
     'blog_name': blog_name.encode("utf-8")
  })
  return urllib.urlopen(tr_url, post_data)

def main():
  tr_url = "TrackBack の URL をここに"

  # ブログ名
  blog_name = u"Python Tips"
  # 記事への URL
  url = "http://python-tips.seesaa.net/"
  # 記事のタイトル
  title = u"スクリプト言語 Python の「ツボ」"
  # 本文の抜粋
  excerpt = u"Python(パイソン)は Guido van Rossumによって.."

  f = sendTrackback(tr_url, blog_name, url, title, excerpt)
  # 応答を表示
  print f.read()
    
if __name__ == "__main__":
  main()

2006年02月25日

ブログの更新を通知するPythonスクリプト

pingtest.py
# coding: shift_jis
import xmlrpclib

pingservers = """
http://ping.bloggers.jp/rpc/
http://www.blogpeople.net/servlet/weblogUpdates
http://ping.cocolog-nifty.com/xmlrpc
http://ping.myblog.jp/
http://blog.goo.ne.jp/XMLRPC
http://ping.exblog.jp/xmlrpc
http://www.blogoon.net/ping/
http://blogdb.jp/xmlrpc
"""

def weblogUpdatesPing(pingserver, blogname, blogurl):
  svr = xmlrpclib.Server(pingserver)
  return svr.weblogUpdates.ping(blogname, blogurl)


def main():
  for pingurl in pingservers.splitlines():
    if not pingurl:
      continue
    try:
      blogname = "Python Tips"

      blogurl = "http://python-tips.seesaa.net/"
      response = weblogUpdatesPing(pingurl, blogname, blogurl)
      if int(response['flerror']) != 0:
        raise Exception, response['message']

      print "%s - 成功" % pingurl
      print " ", response['message']
    except Exception, e:
      print "%s - 失敗 %s" % (pingurl, e)


if __name__ == "__main__":
  main()
このようなメッセージが返答されれば Ping成功。
http://blog.goo.ne.jp/XMLRPC - 成功
Thanks for the ping.
Pingサーバーごとに、「Thanks for the ping」のメッセージが異なったりしていて面白いです。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。