サーバーにphantomjsをおいてスクレイピングを動かしたい時
サーバーにphantomjsを置くなら、npmからインストールするのがおすすめ
sudo yum install epel-release sudo yum install nodejs npm
でnpmをインストールして
npm install phantomjs
でphantomjsをインストールする。
node_modulesというフォルダができてその中にphantomjsがインストールされるのでそこにパスを張る。
実際のインスコ先は
node_modules/phantomjs/bin/phantomjs
になる。
from selenium import webdriver import time from bs4 import BeautifulSoup from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.desired_capabilities import DesiredCapabilities dcap = dict(DesiredCapabilities.PHANTOMJS) dcap["phantomjs.page.settings.userAgent"] = ( "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 " "(KHTML, like Gecko) Chrome/15.0.87" ) driver = webdriver.PhantomJS("/home/user/app/node_modules/phantomjs/bin/phantomjs", desired_capabilities=dcap) url="http://yahoo.co.jp" #yahooは単なるたとえ driver.get(url) #スクリーンショットのとり方 driver.save_screenshot("./screen_shot_1.png") # javascriptのレンダリングを確実に待つ、読み込み待機 time.sleep(5)とか使ってもいいけど、下記の方が確実でいい。 #例外処理をちゃんと書くともっと良い wait = WebDriverWait(driver, 10) wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "articleList"))) #BeautifulSoupで欲しい部分を soup = BeautifulSoup(driver.page_source,'html.parser') #h2要素でclassがarticleList__titleのものを引っ張ってくる。 h2_element = soup.find_all("h2", class_="articleList__title") #h2要素内からa要素を探してきて、href(リンク)とaタグに囲まれている文字列を抜き出す。 for article in h2_element: print(article.find("a").get("href")) print(article.find("a").string)