LoginSignup
16
22

More than 5 years have passed since last update.

【Python】Pager(次へ)が存在するポストを最後までスクレイピングしCSVに保存

Posted at

やったこと

  • はてなブックマークで[R]と検索して、ページャーが存在する限りすべてのページをスクレイピングする

pager.JPG

  • どうせならCSVに保存しておく

アルゴリズム

  • 検索語句を格納する変数を用意する (例)query = "R"
  • http://b.hatena.ne.jp/search/text?q=QueryとなるようなURLを用意する
  • そのURLにアクセスする
    • そのページに存在する各記事をXpathで複数取得する
    • 記事からそれぞれ以下の情報を取得し、csvに追加する
      • タイトル
      • 作成日時
      • ブックマーク数
      • もし次の40件のボタンがあれば
    • 次の40件ボタンをクリックし、ページの情報を再度printする
    • もし次の40件のボタンがなければ
      • 処理を終了する
    • 存在すれば
      • 次のページに移動する

ソースコード

hatena.py
from selenium import webdriver
import requests # for slack  
from pandas import * 
import time

#Access to page

browser = webdriver.PhantomJS()  # DO NOT FORGET to set path
query = "R"
url = "http://b.hatena.ne.jp/search/text?safe=on&q=" + query + "&users=50"
browser.get(url)

df = pandas.read_csv('trend.csv', index_col=0)

#Insert title,date,bookmarks into CSV file

page = 1 #This number shows the number of current page later

while True: #continue until getting the last page
    if len(browser.find_elements_by_css_selector(".pager-next")) > 0:
        print("######################page: {} ########################".format(page))
        print("Starting to get posts...")
        #get all posts in a page
        posts = browser.find_elements_by_css_selector(".search-result")

        for post in posts:
            title = post.find_element_by_css_selector("h3").text
            date = post.find_element_by_css_selector(".created").text
            bookmarks = post.find_element_by_css_selector(".users span").text
            se = pandas.Series([title, date, bookmarks],['title','date','bookmarks'])
            df = df.append(se, ignore_index=True)
            print(df)

        #after getting all posts in a page, click pager next and then get next all posts again

        btn = browser.find_element_by_css_selector("a.pager-next").get_attribute("href")
        print("next url:{}".format(btn))
        browser.get(btn)
        page+=1
        browser.implicitly_wait(10)
        print("Moving to next page......")
        time.sleep(10)
    else: #if no pager exist, stop.
        print("no pager exist anymore")
        break

df.to_csv(query + ".csv")
print("DONE")

より詳しい方法については、下の記事を参考

【Python】Webスクレイピングチュートリアル -「次へ」ボタンが存在するページをすべて取得する場合 -
https://review-of-my-life.blogspot.jp/2017/10/pager-next-selenium.html

16
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
22