Published Date : 2020年9月2日6:04

【python, Web Scraping】Beautifulsoupとlxmlとpandasでウェブスクレイピング
【python, Web Scraping】Web scraping with Beautiflusup, lxml and pandas


This blog has an English translation


YouTubeにアップした動画、「【python, Web Scraping】Beautifulsoupとlxmlとpandasでウェブスクレイピング」の補足説明の記事です。

Here's a little more about the 「【python, Web Scraping】Web scraping with Beautiflusup, lxml and pandas」 video I uploaded to YouTube.


目次

Table of Contents




① 動画の説明
① Video Description



requestsとBeautifulSoupとPandasを使用したウェブスクレイピング。

Web scraping using requests, BeautifulSoup, and pandas.

この動画で必要となるので、BeautifulSoupとlxmlとpandasをインストールしておいてください。

You will need it for this video, so install BeautifulSoup, lxml and pandas.

pip install beautifulsoup4
pip install lxml
pip install pandas

今回はjupyter notebookを使用します。

I use a jupyter notebook this time.

jupyter-notebook

まずはrequestsとBeautifulSoupから。

Import requests, BeautifulSoup, re and csv.

requestsとBeautifulSoupとreとcsvをインポートします。

Put the URL of the website you want to scrape into the get method of the requests.

スクレイピングしたいウェブサイトのURLをrequestsのgetメソッドに入れます。

Then use BeautifulSoup to make it available on a per-tag basis.

その後、BeautifulSoupを使用して、タグ毎に取得できるようにします。

Please Web scraping for personal analysis.

ウェブサイトは個人の解析の為にスクレイピングしてください。

Be sure to do so without burdening the web server.

必ずサーバーの負担をかけずに行ってください。

Right-click in the browser and examine the HTML structure of your site in [Inspect Element].

ブラウザで右クリックして「要素を調べる」でサイトのHTMLの構造を調べます。

For example, if you want to go to a list page, look up [href of the a tag],

例えば一覧ページに行く場合に[aタグのhref]を調べて、そのURLからさらに一覧の一覧ページ、

go to the list page from that URL, and then go to the content of each page.

そして、各ページのコンテンツに行く。

Start with requests and BeautifulSoup.

といった具合にどのようにスクレイピングすれば目的のコンテンツを得られるか事前に調べておきます。

In this way, you should know in advance how to scrape to get the desired content.

idで取得するばあいはselectメソッドを使用します。

If you get it by id, use the select method.

結果はリストだけど、idのタグしか返さない。

The result is a list, but only the tag with id is returned.

idのタグで囲まれたaタグをリストで取得する場合。

Get a list of a tags enclosed in the tag id.

タグの中の文字列を抽出するにはString属性を指定します。

Specify the String attribute to extract the string in the tag.

hrefのURLを抽出するにはGetメソッドを使用します。

soup.select('#trad a')[0].string

soup.select('#trad a')[0].get('href')

To extract the URL for href, use the Get method.

抽出したURLと実際のURLの規則性を見つけ、URLを完成させる。

Find the regularity of the extracted URL and the actual URL and complete the URL.

スラッシュで区切ってリストにする、最後手前までが必要なので、最後をぬかす。

List separated by slashes. The last part of the sequence is removed because the last part of the sequence is required.

二度手間なので長いがこちらのほうがスッキリする。

It takes two steps, so it's long, but I think this one can clean it better.

これらの操作をまとめてタイトルとリンクのCSVファイルにしてみる。

Let's summarize the operations so far and create a CSV file with titles and links.

タイトルをスッキリさせたい場合にはPython標準モジュールのreを使用するのが便利です。

The standard Python module re is useful if you want to tidy up the title string.

数字が一つ以上続いて、コロンの後にスペースがある箇所を消す。

Eliminates any part of the sequence of one or more digits followed by a space after the colon.

スペースの後に数字が一つ以上続いて、()で囲まれた場所を()ごと消す。

Eliminates parenthesized places where a space is followed by one or more digits.

バックスラッシュは特殊文字と呼ばれる文字をエスケープさせる。

A backslash escapes characters called special characters.

こうしないと、例えば「(XXX)」は()で囲われた「XXX」を一つのグループとしてみなす正規表現なので、

For example, [(XXX)] is a regular expression that treats [XXX] enclosed in () as a group.

意図した動作にならない。

So if you don't escape () with a backslash, it won't work as you intended.

re.sub(r'[\d]+: ', '', '1: xxxx x34xx23 x (999)')
'xxxx x34xx23 x (999)'

re.sub(r' \([\d]+\)', '', '1: xxxx x34xx23 x (999)')
'1: xxxx x34xx23 x'

ちゃんと動くかどうか実験。

Experiment to see if it works.

大丈夫そうなので、再度CSVファイルにする。

It looks fine, so I will change it to CSV file again.

一行空いてしまうのを防ぐためnewlineオプションに何も指定しないようにする。

The newline option specifies empty string to prevent a single line of the list from being empty.

もしBeautifulSoupでXPATHを使いたいのならlxmlモジュールを使用する。

If you want to use XPATH in BeautifulSoup, use the lxml module.

文字化け対策でエンコードをSHIFT_JISで上書きする。

Overwrite the encoding with SHIFT_JIS to prevent garbled characters.

Pandasがある人はpandas.read_html()で"table"タグが簡単に取得できる。

If you have Pandas, you can easily get the [table] tag in [pandas.read_html()] method.

但し今回のような細かいタグの操作は出来ない。

However, you can't do the same kind of detailed tag manipulation.

このようにtableタグがないとエラーになる。

If there is no table tag, an error occurs.

なので、tableタグがあるサイトで使ってみます。

So, I will use it on a site with a table tag.

しかし、関係の無いtableタグまで取得してしまうので、

However, since we get even unrelated table tags,

マッチを使って取得したいテーブルを指定します。

we use a match to specify the table we want to get.

pd.read_html('https://xxxxxxxxx.xxxxxxx')
"""
HTTPError: HTTP Error 403: Forbidden
"""
surl = "https://xxxxxxxxxxxxxx.xxxxxxxxxxxxxxx"
df = pd.read_html(surl)
"""
In [41]: len(df)
Out[41]: 18
"""
df = pd.read_html(surl, match="xxxxxxxxxxxxxxx")
"""
In [50]: len(df)
Out[50]: 1
"""

NaNが入っていると見栄えが悪いので、fillnaメソッドで空文字に置き換えます。

It looks bad with NaN in it, so replace it with an empty string in the fillna method.

to_csvメソッドを使えば簡単にCSVファイルにできます。

You can easily create a CSV file using the to_csv method.

インデックス番号が邪魔な場合、オプションで消すこともできます。

If the index number is in the way, you can optionally erase it.



以上です。お疲れ様です。

That's all. Thank you for your hard work.



See You Next Page!