私は現在、人気のあるジョークのWebサイトを削っています。 1つの例は、jokes.cc.comと呼ばれるウェブサイトです。ウェブサイトにアクセスする場合は、ページの左側にあるの「ランダムジョークを取得する」ボタンの上にカーソルを置くと、リダイレクトされるリンクはjokes.cc.com/#
になります。レンダリング後のWebページのHTMLコンテンツをPythonで完成させる方法
しばらく待つと、実際の冗談を表示するウェブサイト内の適切なリンクに変わります。それはjokes.cc.com/*legit joke link*
に変更されます。
ページのHTMLを解析する場合は、<href>
店舗リンクページはあなたをんリダイレクトしたいランダムなジョークにclass=random_link
とのリンク(<a>
)があることがわかります。ページが完全に読み込まれたら、これをチェックすることができます。基本的に、「#」は正当なリンクに置き換えられます。
ここまでは、私が静的なウェブサイトで行ったようにHTMLを削るためのコードです。
import urllib
from bs4 import BeautifulSoup
urlToRead = "http://jokes.cc.com";
handle = urllib.urlopen(urlToRead)
htmlGunk = handle.read()
soup = BeautifulSoup(htmlGunk, "html.parser")
# Find out the exact position of the joke in the page
print soup.findAll('a', {'class':'random_link'})[0]
出力:#
私は、ページが完全にレンダリングされていないことを実現するために来ているので、これが予想される出力である私はBeautifulSoup
ライブラリを使用していました。
しばらく待ってから、またはレンダリングが完了した後で、ページを削り取るにはどうすればよいですか。 などの外部ライブラリを使用する必要がありますか。機械化?私はそれを行う方法がわからないので、どんなヘルプ/ガイダンスもありがとうございます
EDIT:最終的にPhantomJSとPythonのSeleniumを使用して問題を解決することができました。レンダリングが完了した後にページを取得するコードを次に示します。
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.PhantomJS() #selenium for PhantomJS
driver.get('http://jokes.cc.com/')
soupFromJokesCC = BeautifulSoup(driver.page_source) #fetch HTML source code after rendering
# locate the link in HTML
randomJokeLink = soupFromJokesCC.findAll('div', {'id':'random_joke'})[0].findAll('a')[0]['href']
# now go to that page and scrape the joke from there
print randomJokeLink #It works :D
*セレン*ブラウザの自動化は行く方法ですか? – bholagabbar
N.B.私は決してセレンを使用したことはありませんが、それはあなたのプロジェクトの範囲に依存します。ジョークを表示するアプリケーションを作成する場合は、Webブラウザを自動化するのは理想的ではないでしょう。それはあなたのユーザーがブラウザをインストールして開いている必要があります、そして、あなたはそのブラウザに多くの仕事を負担させるでしょう。しかし、JavaScriptの仕組みを掘り下げてみると、JavaScriptのことを考えなくても、アプリ内での振る舞いを再現し、ジョークを掻き立てることができます。 –
ヘッドレスブラウザのソートはどうですか? – bholagabbar