3

Selenium の助けを借りて Web ページの Javascript コンテンツを処理する Scrapy スパイダーを作成しました。しかし、このスパイダーは一般的な Scrapy Crawler よりもかなり遅いことに気付きました。このため、私は 2 つのスパイダーを組み合わせたいと考えてCrawlSpiderいます。すべてのリソースを取得するための共通のスパイダーと、Javascript を多用するページのためだけの Selenium スパイダーです。Web ページに Javascript が必要であり、大量に使用されているかどうかを検出しようとするパイプライン ステップを作成しました。これまでのところ、処理ステップに関する私のアイデアは失敗しました。

  • 一部のページでは共通<noscript>タグを使用しています。
  • 一部のページには、警告メッセージが表示されます<div class="yt-alert-message" >
  • ...

ページに Javascript が必要であることを示すには、非常に多くの方法があります。

  • Javascript を広く使用しているページを「検出」する標準化された方法を知っていますか?

注: Selenium Spider でページを処理したいのは、Selenium Spider が非常に遅く、いくつかのページが適切なデザインにのみ使用するため、本当に必要な場合のみです。

4

1 に答える 1

2

スクリプト タグからすべての JavaScript を取得し、すべてを合計して、その長さが「大規模な」JavaScript を構成すると思われる長さを超えていないことを確認できます。

# get all script tags
scripts = browser.find_elements_by_tag_name("script")

# create a string to add all the JS content to
javaScriptChars = "";   

# create an list to store urls for external scripts
urls = list()

# for each script on the page...
for script in scripts

    # get the src
    url = script.get_attribute("scr")

    # if script is external (has a 'src' attribute)...
    if url.__len__() > 0:

        # add the url to the list (will access it later)
        urls.append(url)

    else:

        # the script is inline - so just get the text inside
        javaScriptChars = javaScriptChars + script.getAttribute("textContent");

# for each external url found above...
for url in urls

    # open the script
    driver.get(url)

    # add the content to our string
    javaScriptChars = javaScriptChars + driver.page_source

# check if the string is longer than some threshold you choose                              
if javaScriptChars.__len__() > 50000:
     # JS contains more than 5000 characters

数は任意です。ページが毎回すべての関数を呼び出すとは限らないため、JSの50000文字未満は実際には「多く」ではない可能性があると思います。それはおそらく、ユーザーが何をするかに多少依存します。

しかし、適切に設計されたサイトに必要なスクリプトのみが含まれていると想定できる場合でも、文字数は、そのサイトが実行する JS の量を示す適切な指標になる可能性があります。

于 2013-05-24T18:58:52.707 に答える