コードメモ > スクレイプ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

#coding:shift-jis
import urllib

xmlns = '{urn:yahoo:jp:news}'

def show(data):
  for l in data:
    print l

def query(param):
  yahoo_urls = 'http://news.yahooapis.jp/NewsWebService/V2/topics'
  user_id = ''
  param['appid'] = user_id
  urlget = urllib.urlencode(param)
  return urllib.urlopen(yahoo_urls + '?' + urlget)

def iter_news(topic):
  param = {
    'topicname':topic,
  }
  data = query(param)
  return parse_news(data)

def hottopic_iter(category):
  '''
    set(['domestic',
    'world',
    'economy',
    'entertainment',
    'sports',
    'computer',
    'science',
    'local'])
    '''
  data = query({'category':category})
  return parse_topic(data)

def data_to_elm(data):
  from xml.etree import ElementTree
  return ElementTree.parse(data)

def parse_topic(data):
  elm = data_to_elm(data)
  for e in elm.getroot().findall(xmlns+'Result'):
    yield e.find(xmlns+'English').text


#unicodeは'ignore'付きで変換させた方がいいよ。
def yahoonews_scraper(url):
  import lxml.html
  import urllib
  s = ''.join(urllib.urlopen(url).readlines()).decode('euc-jp')
  elm = lxml.html.fromstring(s)
  
  elmlist = elm.get_element_by_id('ynDetail').findall('div')
  def parsetext(elm):
   return elm.text_content().replace(u'\n','').replace(u'\t','')

  title = parsetext(elmlist[0])
  body = parsetext(elmlist[1])
  return (title,body)

#結局こっちの関数は無駄に終わりそう…
def topicchecker():
  for topic in hottopic_iter('computer'):
    for news in iter_news(topic):
      print news

if __name__=='__main__':
  urllist= [
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000327-oric-musi',
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000064-impress-sci',
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000647-san-base']
  for url in urllist:
    title,body= yahoonews_scraper(url)
    print title.encode('shift_jis','ignore')
    print body.encode('shift_jis','ignore')

URLリストのスクレイプは未実装。

ファイルを作ります。

#coding:shift-jis

#unicodeは'ignore'付きで変換させた方がいいよ。
def yahoonews_scraper(url):
  import lxml.html
  import urllib
  s = ''.join(urllib.urlopen(url).readlines()).decode('euc-jp')
  elm = lxml.html.fromstring(s)
  
  elmlist = elm.get_element_by_id('ynDetail').findall('div')
  def parsetext(elm):
   return elm.text_content().replace(u'\n','').replace(u'\t','')

  title = parsetext(elmlist[0])
  body = parsetext(elmlist[1])
  return (title,body)

def urllist_fromfile(filename):
  for url in filename:
    return url

def outfile(filename,body):
  f = open(filename)
  f.write(body)
  f.close()

def test_yahoonews_scraper():
  urllist= [
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000327-oric-musi',
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000064-impress-sci',
      'http://headlines.yahoo.co.jp/hl?a=20110802-00000647-san-base']
  for url in urllist:
    title,body= yahoonews_scraper(url)
    #print title.encode('shift_jis','ignore')
    print body.encode('shift_jis','ignore')

if __name__=='__main__':
  if len(sys.argv) != 2:
    print u'引数にurlリストのファイルを指定してください'
    exit()
  urllist = urllist_fromfile(sys.argv[1]):
  for url in urllist:
    title,body = yahoonews_scraper(url)
    outfile(title+'.txt',body)

2011/8/3 の午前中に作ったDB

http://www35.atwiki.jp/rapidout/?cmd=upload&act=open&page=%E3%82%B3%E3%83%BC%E3%83%89%E3%83%A1%E3%83%A2%2F%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%97&file=db.zip