pythonでスクレイピングする時のサンプル コードです。
指定したタグとクラスで要素をテキストで取り出しリストに格納、pandasのseriesに変換してリターン
#タグで要素取る def tag_get(self,tag1,tag2): #リスト初期化 all_list = [] for txt in self.res.find_all(tag1, class_ = tag2): #print(txt.text) all_list.append(txt.text) s = pd.Series(all_list) return s
html = self.driver.page_source.encode('utf-8') res = BeautifulSoup(html, "lxml")
tag1 = ‘p’はタグ
tag2 = ‘link’はクラス
リンクのaタグを見つけて、指定条件でリストに追加と置換
for element in elements.find_all("a"): url = element.get("href") if 'なんとか' in url: all_list.append(url) elif 'かんとか' in url: url = url.replace('かんとか', 'なんとか') url = uri + url elif '//' in url: url = url.replace('http://', 'https://') else: pass
指定したclassの数をカウントする
この回数分の処理を繰り返す。
def check_datenum(self): elements = self.driver.find_elements_by_class_name(self.key_class) return len(elements)
find_element_by_class_nameは、Seleniumのバージョンにより非推奨になる。
By.CSS_SELECTOR
Seleniumのバージョンにより以下
driver.find_elements(By.CSS_SELECTOR,'div.class')
指定したCSSクラスでURLを見つけてリストに格納し、pandasデータフレームに格納
elements = driver.find_elements(By.CSS_SELECTOR,'div.heading > a') elem_url=[] for elem in elements: elem_url.append(elem.get_attribute("href")) alink = pd.DataFrame(elem_url)
Xpathであいまい検索、ワイルドカード
Xpath自体はChromeのデバッグで、検証からコピーしています。
//*[@id="IDname_20211004"]/dd/ul[1]/li[1]/a ↑だった場合に xpath= '//*[contains(@id,"IDname_")]/dd/ul[1]/li[1]/a'
URLの連番の一部をループで回して作ってしまう
##レース開催日分のレース詳細を取りに行く ## この時にclass内で第一レースのURLは予想して入れてしまう for i in range(1, num+1): CD.key_URL = 'https://.jp/a' + str(i) + '0001/nav_btn' CD.table_name = 'detail' CD.key_tag = 'a' CD.ifstr = "nav_btn" CD.dget() linklists = CD.check_txtnum() print(linklists)
ドライバー準備のオプション設定
class DClass(): def __init__(self): #ドライバー呼び出し self.driver_option() def driver_option(self): options = webdriver.ChromeOptions() options.add_argument('disable-infobars') options.add_argument('--no-sandbox') options.add_argument('--headless') options.add_argument('--window-size=1024,768') user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36" options.add_argument('--user-agent=' + user_agent) driver = webdriver.Chrome(options=options); driver.implicitly_wait(25) driver.set_page_load_timeout(25) self.driver = driver
マルチスレッド化
windowsアプリ制作の時に使用。
そうしないとボタン動作でアプリは動作しているが、画面上はフリーズしたように見えてしまうため。
def callback(self): th = threading.Thread(target=self.DF_MAKE) th.start()
対象URLのリトライ関連
j = 0 while j < 9: try: self.driver.get(self.key_URL) print("The page was loaded " + self.key_URL) except TimeoutException: j = j + 1 print("Timeout, Retrying... (%(j)s/%(max)s)" % {'j': j, 'max': 9}) time.sleep(15) continue else: break sleep(3)
HTMLタグ指定でのスクレイピング
driver.find_element(By.TAG_NAME, "h2")Seleniumのバージョンによっては、もう動かないはず。非推奨かな?
find_elements_by_tag_name
CSS指定でのスクレイピング
複数クラス指定の一例
driver.find_element(By.CSS_SELECTOR,'.gLFyf.gsfi')
クラスとタグ指定
driver.find_elements(By.CSS_SELECTOR,'div.yuRUbf > a')
ID指定
driver.find_elements(By.CSS_SELECTOR,'#ID')
前方一致や後方一致もあるものの、あまり私が使わないため省略。
参考
【Python】Seleniumを利用したスクレイピングでよく使うプログラムサンプル集
【Python】Seleniumを利用したスクレイピングでよく使うスプレッドシートのプログラムサンプル集
当サイトはリンクフリーです。
ご自身のブログでの引用、TwitterやFacebook、Instagram、Pinterestなどで当サイトの記事URLを共有していただくのは、むしろありがたいことです。
事前連絡や事後の連絡も不要ですが、ご連絡いただければ弊社も貴社のコンテンツを紹介させていただく可能性がございます。