

【やりたいこと】記事ページをスクレイピングしたい!
今までは、ブログのトップページからスクレイピングを行ってきました。
今回は、トップページから1記事選び、その記事のURL・タイトル・目次を抽出してみましょう。
では、さっそく、取り掛かりましょう!
【10分でできる】複数ページのスクレイピング
※ダウンロード時間は10分の中に含まれていません。
0.概要
スクレイピングするページ(記事)を確認した後、Pythonスクリプトファイルを作成します。作成後、スクリプトの解説を一部行います。最後にスクリプトを実行し、結果を確認します。
1.使用したもの
・Virtual box
・Vagrant

・Term Term

・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で読めます。
コメント