1. plumfield56

    Posted

    plumfield56
Changes in title
+Google Colaboratory(Colab)でスクレイピングするときのチートシート
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,311 @@
+目次
+
+- [Beautiful Soupの使用方法](#beautiful-soupの使用方法)
+- [Seleniumの使用方法](#seleniumの使用方法)
+- [Pandasの使用方法](#pandasの使用方法)
+- [スプレッドシートを扱う方法](#スプレッドシートを扱う方法)
+
+
+#Beautiful Soupの使用方法
+
+## 文字化け解消方法
+
+`requests`を使用する場合は通常下記のように書くと思いますが、
+
+```python
+from bs4 import BeautifulSoup
+import requests
+
+res = requests.get(url)
+soup = BeautifulSoup(res.content, 'html.parser')
+```
+
+これだと文字化けするサイトがあるので、下記にすると文字化けがかなり解消できる。
+
+```python
+from bs4 import BeautifulSoup
+import requests
+
+res = requests.get(url)
+soup = BeautifulSoup(res.content, "lxml", from_encoding='utf-8')
+```
+
+## findのコード一覧
+
+
+| 説明 | コード例 |
+|:---|:---|
+| 1件検索 | soup.find('li') |
+| タグ全検索 | soup.find_all('li') |
+| 属性検索 | soup.find('li', href='html://www.google.com/') |
+| 複数要素を取得 | soup.find_all(['a','p']) |
+| id検索 | soup.find('a', id="first") |
+| class検索 | soup.find('a', class_="first") |
+| 属性取得 | first_link_element['href'] |
+| テキスト検索 | soup.find('dt' ,text='検索ワード') |
+| テキスト部分一致の検索 | soup.find('dt' ,text=re.compile('検索ワード') |
+| 親要素を取得 | .parent |
+| 次の要素を1件取得 | .next_sibling |
+| 次の要素を全件取得 | .next_siblings |
+| 前の要素を1件取得 | .previous_sibling |
+| 前の要素を全件取得 | .previous_siblings |
+| テキスト要素 | first_link_element.string |
+| 親要素 | first_link_element.parent |
+
+
+## selectのコード一覧
+| 説明 | コード例 |
+|:---|:---|
+| 1件検索 | soup.select_one('cssセレクタ') |
+| 全件検索 | soup.select('cssセレクタ') |
+
+## セレクタの指定方法一覧
+| 説明 | コード例 |
+|:---|:---|
+| id検索 | soup.select('a#id') |
+| class検索 | soup.select('a.class') |
+| classの複数検索 | soup.select('a.class1.class2') |
+| 属性検索1 | soup.select('a[class="class"]') |
+| 属性検索2 | soup.select('a[href="http://www.google.com"]') |
+| 属性検索3 | soup.select('a[href]') |
+| 子要素の取得 | soup.select('.class > a[href]') |
+| 子孫要素の取得 | soup.select('.class a[href]') |
+
+属性要素は検索したい要素に応じて変更する。
+`id`,`class`,`href`,`name`,`summary`など。
+子要素(1階層下)だけ取得したい場合は`>`を挟み、子孫要素(階層下全て)を取得したい場合は`スペース`を入れる。
+
+
+#Seleniumの使用方法
+
+##Seleniumを使うための事前準備
+
+Colabで使用する際はSeleniumのダウンロードとUIの仕様ができないので、
+その設定が必要になります。
+
+```python
+# Seleniumを使用するのに必要なライブラリをダウンロード
+!apt-get update
+!apt install chromium-chromedriver
+!cp /usr/lib/chromium-browser/chromedriver /usr/bin
+!pip install selenium
+
+from selenium import webdriver
+
+# ドライバーをUIなしで使用するための設定
+options = webdriver.ChromeOptions()
+options.add_argument('--headless')
+options.add_argument('--no-sandbox')
+options.add_argument('--disable-dev-shm-usage')
+driver = webdriver.Chrome('chromedriver',options=options)
+driver.implicitly_wait(10)
+```
+
+## SeleniumとBeautiful Soupを使用する場合
+使用ケースとしては、Beautiful Soupだけではどうしても要素が取得できない場合に
+seleniumuでページを読み込んでからBeautiful Soupで必要な情報を抜きたい場合。
+
+```python
+driver.get(url)
+html = driver.page_source.encode('utf-8')
+soup = BeautifulSoup(html, 'html.parser')
+```
+
+
+## Seleniumの基本コード
+| 説明 | コード例 |
+|:---|:---|
+| URLを開く | driver.get('URL') |
+| 一つ前に戻る | driver.back() |
+| 一つ前に進む | driver.forward() |
+| ブラウザを更新 | driver.refresh() |
+| 現在のURLを取得 | driver.current_url |
+| 現在のタイトルを取得 | driver.title |
+| 現在のウィンドウを閉じる | driver.close() |
+| 全てのウィンドウを閉じる | driver.quit() |
+| クラスで要素取得 | driver.find_element_by_class_name('classname') |
+| IDで要素取得 | driver.find_element_by_id('id') |
+| XPATHで要素取得 | driver.find_element_by_xpath('xpath') |
+| 要素をクリック | driver.find_element_by_xpath('XPATH').click() |
+| テキスト入力 | driver.find_element_by_id('ID').send_keys('strings') |
+| テキストの取得 | driver.find_element_by_id('ID').text |
+| 属性の取得 | driver.find_element_by_id('ID').get_attribute('href') |
+| 要素が表示されているか判定 | driver.find_element_by_xpath('xpath').is_displayed() |
+| 要素が有効か判定 | driver.find_element_by_xpath('xpath').is_enabled() |
+| 要素が選択されているか判定 | driver.find_element_by_xpath('xpath').is_selected() |
+
+
+### ドロップダウンを選択したいとき
+```python
+from selenium.webdriver.support.ui import Select
+
+element = driver.find_element_by_xpath("xpath")
+Select(element).select_by_index(indexnum) # indexで選択
+Select(element).select_by_value("value") # valueの値
+Select(element).select_by_visible_text("text") # 表示テキスト
+```
+
+## Xpathの指定方法一覧
+| 説明 | コード例 |
+|:---|:---|
+| 全ての要素を選択 | //* |
+| 全ての要素を選択 | //a |
+| 属性を選択 | @href |
+| 複数要素を選択 | [a or h2] |
+| idで要素取得 | //*[@id="id"] |
+| classで要素取得 | //*[@class="class"] |
+| テキスト検索 | //*[text()="strings"] |
+| テキストの部分検索 | //*[contains(text(), "strings")] |
+| クラスの部分一致 | //*contains(@class, "class") |
+| 次のノード取得 | /following-sibling::*[1] |
+| 2つあとのa要素の | /following-sibling::a[2] |
+| 後ろのノード取得 | /preceding-sibling::*[1] |
+
+[その他ノードの取得方法はこちらを参考にする](https://www.octoparse.jp/blog/essential-for-web-scraping-xpath-introduction/)
+
+
+## タブを変更する場合
+
+クリックするとページ遷移せず新しいタブができる場合に使用
+
+```python
+handle_array = driver.window_handles
+driver.switch_to.window(handle_array[1])
+```
+
+
+## 特定の要素が表示されるまで待機処理
+
+```python
+
+from selenium.webdriver.support.ui import WebDriverWait
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.common.by import By
+
+WebDriverWait(driver, 30).until(
+ EC.presence_of_element_located((By.XPATH, 'xpath')))
+)
+```
+
+
+## クリックできないときの処理
+
+```python
+target = driver.find_element_by_xpath('xpath')
+driver.execute_script("arguments[0].click();", target)
+```
+
+# Pandasの使用方法
+
+## データフレームを作成してデータを追加していく方法
+```python
+import pandas as pd
+columns = ['項目1', '項目2', '項目3', '項目4', '項目5']
+df = pd.DataFrame(columns=columns)
+
+# データ取得の処理
+
+se = pd.Series([data1, data2, data3, data4, data5], columns)
+df = df.append(se, columns)
+```
+
+## Pandasのデータをダウンロードする場合
+```python
+from google.colab import files
+
+filename = 'filename.csv'
+df.to_csv(filename, encoding = 'utf-8-sig')
+files.download(filename)
+```
+
+
+## Pandasのデータをマイドライブに保存する場合
+```python
+from google.colab import drive
+
+filename = filename.csv'
+path = '/content/drive/My Drive/' + filename
+
+with open(path, 'w', encoding = 'utf-8-sig') as f:
+ df.to_csv(f)
+```
+
+
+# スプレッドシートを扱う方法
+
+## スプレッドシートを扱うための事前準備
+
+```python
+# スプレッドシート連携するのに必要なライブラリをダウンロード
+!pip install gspread
+
+from google.colab import auth
+from oauth2client.client import GoogleCredentials
+import gspread
+
+# 認証処理
+auth.authenticate_user()
+gc = gspread.authorize(GoogleCredentials.get_application_default())
+```
+
+### よく使用するコード
+
+```python
+ss_id = 'スプレッドシートのID'
+sht_name = 'シート名'
+
+workbook = gc.open_by_key(ss_id)
+worksheet = workbook.worksheet(sht_name)
+
+# データ取得するとき
+worksheet.acell('B1').value
+worksheet.cell(2, 1).value
+
+# アップデートするとき
+worksheet.update_cell(row, column, '更新内容')
+```
+
+## gspreadのコード一覧
+
+### ワークブックの操作
+| 説明 | コード例 |
+|:---|:---|
+| IDでスプレッドシートの選択 | gc.open_by_key('ID') |
+| URLでスプレッドシートの選択 | gc.open_by_url('URL') |
+| スプレッドシートのタイトル取得 | workbook.title |
+| スプレッドシートのID取得 | workbook.id |
+
+### シートの操作
+| 説明 | コード例 |
+|:---|:---|
+| シート名でシートを取得 | workbook.worksheet('シート名') |
+| Indexでシートを取得 | workbook.get_worksheet(index) |
+| 全シートを配列で取得 | workbook.worksheets() |
+| シート名の取得 | worksheet.title |
+| シートIDの取得 | worksheet.id |
+
+### セルの操作
+| 説明 | コード例 |
+|:---|:---|
+| A1方式でデータ取得 | worksheet.acell('B1').value |
+| R1C1方式でデータ取得 | worksheet.cell(1, 2).value |
+| 複数セルを選択して一次元配列で取得 | worksheet.range('A1:B10') |
+| 選択行のデータ取得 | worksheet.row_values(1) |
+| 選択行の数式取得 | worksheet.row_values(1,2) |
+| 選択列のデータ取得 | worksheet.column_values(1) |
+| 選択列の数式取得 | worksheet.column_values(1,2) |
+| 全データを取得 | worksheet.get_all_values() |
+| A1方式でセルの値を更新 | worksheet.update_acell('B1','更新する値') |
+| R1C1方式でセルの値を更新 | worksheet.update_cell(1,2,'更新する値') |
+
+
+
+
+【参考サイト】
+[BeautifulSoup4のチートシート(セレクターなど)](https://python.civic-apps.com/beautifulsoup4-selector/)
+[Python3メモ - BeautifulSoup4のあれこれ](https://szarny.hatenablog.com/entry/2017/07/11/144503)
+[WebスクレイピングのためのCSSセレクタの基本](https://gammasoft.jp/support/css-selector-for-python-web-scraping/)
+[Selenium webdriverよく使う操作メソッドまとめ](https://qiita.com/mochio/items/dc9935ee607895420186)
+[XPathとは?XPathの基本知識を学ぼう!](https://www.octoparse.jp/tutorial/xpath/)
+[Webスクレイピングに不可欠!Xpathのまとめ](https://www.octoparse.jp/blog/essential-for-web-scraping-xpath-introduction/)
+[gspreadライブラリの使い方まとめ!Pythonでスプレッドシートを操作する](https://tanuhack.com/library-gspread/)