【スクレイピング】記事ページをクロール

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

【やりたいこと】複数の記事ページを取得したい!

前回は、トップページから1つの記事をスクレイピングしました。

今回は、トップページにあるすべての記事をスクレイピングしてみましょう。

【10分でできる】サーバーの負担に注意!

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

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

https://ja.osdn.net/projects/ttssh2/

・Python3.4

2.手順

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

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

import time # timeモジュールをインポートする。
import re

import requests
import lxml.html


def main():
session = requests.Session()
response = session.get('https://hk-ryukyu.club/hideto/')
urls = scrape_list_page(response)
for url in urls:
time.sleep(1) # 1秒のウェイトを入れる
response = session.get(url)
page = scrape_detail_page(response)
print(page)


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_6.pyを参考 ※一部変更

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

1.

前回のスクリプトからbreakが削除されている

2.

time.sleep(1) # 1秒のウェイトを入れる

 

【1解説】

前回のスクリプトでは、main()関数のfor文にbreak文を記入することで、1つの記事のみスクレイピングしていました。

今回は、トップページに表示されているすべての記事をスクレイピングするため、break文を削除しています。

【2解説】

サーバーに負担がかからないように、1秒間のインターバルをとっています。

②実行

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

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

3.追記

次は、MongoDBに保存してみます!

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

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

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

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

 

コメント

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