2022/01,江端さんの技術メモ

Pythonのスクレイピングを、Golangで記述してみる。

まずpythonの記述です。

# -*- coding: utf-8 -*-
from pyquery import PyQuery

q = PyQuery('https://kabutan.jp/stock/?code=7203')
sector = q.find('#stockinfo_i2 > div > a')[0].text
print(sector)

これでターゲットとなるhtml部分は、多分ここ

<div id="stockinfo_i2">
<dl>
<dt>業績</dt>
<dd><img src="/images/cmn/gyouseki_2.gif" title="今期予想" /></dd>
</dl>

<div>
<a href="/themes/?industry=17&market=1">輸送用機器</a>
</div>

これをgolangで実現するには、このようにコーディングするようです。

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func main() {
	//get_url_info, err := goquery.NewDocument("https://profile.yahoo.co.jp/search/?w=トヨタ自動車")
	get_url_info, err := goquery.NewDocument("https://kabutan.jp/stock/?code=7203")
	if err != nil {
		fmt.Println("get html NG")
	}

	//result := get_url_info.Find("div > div > table > tbody > tr > td")
	//result := get_url_info.Find("div > div > a")
	result := get_url_info.Find("#stockinfo_i2 > div > a")
	result.Each(func(index int, s *goquery.Selection) {
		fmt.Println(s.Text())
	})
}

出力結果は以下の通りです。

ebata@DESKTOP-P6KREM0 MINGW64 ~/kese/gonet-html
$ go run main3.go
輸送用機器

こうやると、もっと簡単にできそう。

package main

import (
	"fmt"

	"github.com/PuerkitoBio/goquery"
)

func main() {

	q, err := goquery.NewDocument("https://kabutan.jp/stock/?code=7203")
	if err != nil {
		fmt.Println("get html NG")
	}

	name := q.Find("div.company_block > h3").Text()
	fmt.Println(name)

	code_short_name := q.Find("#stockinfo_i1 > div.si_i1_1 > h2").Text()
	fmt.Println(code_short_name)

	market := q.Find("span.market").Text()
	fmt.Println(market)

	unit_str := q.Find("#kobetsu_left > table:nth-child(4) > tbody > tr:nth-child(6) > td").Text()
	fmt.Println(unit_str)

	sector := q.Find("#stockinfo_i2 > div > a").Text()
	fmt.Println(sector)

}

 

 

2022/01,江端さんの技術メモ

参照 : https://github.com/PuerkitoBio/goquery

goqueryは、jQueryに似た構文と機能群をGo言語に提供するものです。

$ go get github.com/PuerkitoBio/goquery

で使うことができるようになります。

サンプルプログラムで、この内容の解説を試みます。

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/PuerkitoBio/goquery"
)

func ExampleScrape() {
	// Request the HTML page.

	res, err := http.Get("http://kobore.net")

	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()
	if res.StatusCode != 200 {
		log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)
	}

	// Load the HTML document
	doc, err := goquery.NewDocumentFromReader(res.Body)
	if err != nil {
		log.Fatal(err)
	}

	doc.Find("input").Each(func(i int, s *goquery.Selection) {
		// For each item found, get the title
		title, _ := s.Attr("type")
		fmt.Printf("Review %d: %s\n", i, title)
	})

	/*
		上記によって以下の4行がピックアップされる。

		<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
		<input type="hidden" name="ie" value="Shift_JIS" />
		<input type="text" name="q" size="10" />
		<input type="submit" name="sa" value="Search" />
	*/

}

func main() {
	ExampleScrape()
}

対象となる、Webのhtmlは以下の通り

(前略)

<TITLE>kobore.net</TITLE>
</head>

<TD ALIGN="right">
<A HREF="./index-en.shtml">English</A> /
Japanese
</TD>

<div align="RIGHT">
<img src="https://www.kobore.net/KOBORE-small.jpg">
<form id="cse-search-box" action="https://google.com/cse" target="_blank">
<input type="hidden" name="cx" value="010448971387544815344:gehqdwxqnlo" />
<input type="hidden" name="ie" value="Shift_JIS" />
<input type="text" name="q" size="10" />
<input type="submit" name="sa" value="Search" />
</form>
</div>

<body BGCOLOR="#F0FFA0">

<H1 ALIGN="center">こぼれネット</H1>
<H2 ALIGN="center">
www.kobore.net
</H2> 

(後略)

出力結果は、以下の通り。

C:\Users\ebata\kese\gonet-html>go run main.go
Review 0: hidden
Review 1: hidden
Review 2: text
Review 3: submit