【スクレイピング】記事ページからスクレイピング

スクレイピング
スクレイピング準備記事

【やりたいこと】記事ページスクレイピングしたい!

今までは、ブログのトップページからスクレイピングを行ってきました。

今回は、トップページから1記事選び、その記事のURL・タイトル・目次を抽出してみましょう。

では、さっそく、取り掛かりましょう!

【10分でできる】複数ページのスクレイピング

※ダウンロード時間は10分の中に含まれていません。

0.概要

スクレイピングするページ(記事)を確認した後、Pythonスクリプトファイルを作成します。作成後、スクリプトの解説を一部行います。最後にスクリプトを実行し、結果を確認します。

1.使用したもの

・Virtual box

Oracle VM VirtualBox

・Vagrant

Vagrant by HashiCorp
Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

・Term Term

Tera Term (テラターム) プロジェクト日本語トップページ - OSDN
Tera Term は、オリジナルの Tera Term Pro 2.3 の原作者公認の後継版です。オープンソースで開発されており、UTF-8 表示に対応しています。 また、SSH1 対応モジュール TTSSH を拡張し、SSH2 プロトコルをサポートしています。

・Python3.4

2.手順

※下記の記事の内容を完了しているものとして、進めていきます。

①記事ページの検証

本ブログのトップページから1記事選びましょう。

記事ページのタイトル部分で右クリックして、検証をクリックしましょう。

タイトルは、class=”entry-title”が含まれるh1要素のテキストコンテンツということが分かります。


目次部分で右クリックして、検証をクリックしましょう。

目次は、class=”toc-content”が含まれるdiv要素のテキストコンテンツということが分かります。

②Pythonスクリプトファイルの作成

import requests
import lxml.html


def main():
session = requests.Session() # 複数のページをクロールするのでSessionを使う。
response = session.get('https://hk-ryukyu.club/hideto/')
urls = scrape_list_page(response)
for url in urls:
response = session.get(url) # Sessionを使って記事ページを取得する。
page = scrape_detail_page(response) # 記事ページからスクレイピングして記事の情報を得る。
print(page) # 記事の情報を表示する。
break # まず1ページだけで試すため、break文でループを抜ける。


def scrape_list_page(response):
root = lxml.html.fromstring(response.content)
root.make_links_absolute(response.url)

for a in root.cssselect('a[class="entry-card-wrap a-wrap cf"]'):
url = a.get('href')
yield url


def scrape_detail_page(response):
"""
記事ページのResponseから記事の情報をdictで取得する。
"""
root = lxml.html.fromstring(response.content)
page = {
'url': response.url, # URL
'title': root.cssselect('h1[class="entry-title"]')[0].text_content(), # タイトル
'content': root.cssselect('div[class="toc-content"]')[0].text_content(), # 目次
}
return page # dictを返す。

if __name__ == '__main__':
main()

Pythonクローリング&スクレイピング サンプルコードpython_crawler_4.pyを参考 ※一部変更

上記のスクリプトを作成します。着目してほしい点は、以下の2つです。

1.

session = requests.Session() # 複数のページをクロールするのでSessionを使う。
response = session.get('https://hk-ryukyu.club/hideto/')

2.

'title': root.cssselect('h1[class="entry-title"]')[0].text_content(), # タイトル
'content': root.cssselect('div[class="toc-content"]')[0].text_content(), # 目次

【1解説】

今回は、「トップページから記事URL」「記事ページからタイトル・目次」を取得するため、複数ページを取得する必要があります。

そのため、Session()を使用します。

【2解説】

①で確認したように、タイトル・目次は、両方とも、特定の属性を含む要素のテキストコンテンツでした。

そのため、cssselectを使用し、指定の要素を取得し、その中のテキストコンテンツのみを抜き出しました。

③実行

②で作成したスクリプトファイルを実行した結果、

記事ページのURL・目次・タイトルを表示することができました。

3.追記

長いコードを読むのは、大変ですよね。

長いコードを短いコードに分解して読むと少し楽になるので、やってみてください。

【最後に】参考図書の紹介

以下の書籍は、私がPythonスクレイピングを勉強するにあたって、使用した書籍です。

「Python逆引き大全」は、秀和システムの技術書読み放題サービス「10×Eng」で読めます。最初の2週間は無料、それ以降は、月額900円で利用できます。

「プログラミング超初心者が初心者になるためのPython入門」はkindle unlimitedで読めます。

 

コメント

タイトルとURLをコピーしました