2016-12-26 11 views
1

とJSに反応私はクラスでアンカーリンクをこすりしたい=「_ 1UoZlX」この特定のページからの検索結果から - 私は私が検索することを実現したページからスープを作成したときhttps://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4ioスクレーピング要素はBeautifulSoup

結果はReact JSを使用してレンダリングされているため、ページソース(またはスープ)でそれらを見つけることができません。ここで

は私のコードは、これは私が得ているエラーです

import requests 
from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


listUrls = ['https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4iof'] 
PHANTOMJS_PATH = './phantomjs' 
browser = webdriver.PhantomJS(PHANTOMJS_PATH) 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    wait = WebDriverWait(browser, 20) 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"_1UoZlX"}) 
    for result in results: 
     link = result["href"] 
     print link 
     urls.append(link) 
    print urls 

です。

Traceback (most recent call last): 
    File "fetch_urls.py", line 19, in <module> 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen 

ページではJavaScriptを処理するために、セレンを使用する方法があることをthis answerで述べた誰か。誰かがそれについて詳しく説明できますか?私はいくつかのグーグルを行ったが、この特定の場合に有効なアプローチを見つけることができませんでした。

答えて

0

あなたのコードに問題はありませんが、あなたが掻き集めるウェブサイトには問題はありません。あなたが書いたページとそれに続くコードの解析を妨げる何らかの理由でロードを停止しません。

私は同じことを確認するためにウィキペディアでみました:

from bs4 import BeautifulSoup 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

listUrls = ["https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"] 
# browser = webdriver.PhantomJS('/usr/local/bin/phantomjs') 
browser = webdriver.Chrome("./chromedriver") 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"mw-redirect"}) 
    for result in results: 
     link = result["href"] 
     urls.append(link) 
    print urls 

出力:

[u'/wiki/List_of_states_and_territories_of_India_by_area', u'/wiki/List_of_Indian_states_by_GDP_per_capita', u'/wiki/Constitutional_republic', u'/wiki/States_and_territories_of_India', u'/wiki/National_Capital_Territory_of_Delhi', u'/wiki/States_Reorganisation_Act', u'/wiki/High_Courts_of_India', u'/wiki/Delhi_NCT', u'/wiki/Bengaluru', u'/wiki/Madras', u'/wiki/Andhra_Pradesh_Capital_City', u'/wiki/States_and_territories_of_India', u'/wiki/Jammu_(city)'] 

P.S.を私はデバッグの目的で実際のクロムブラウザに対してスクリプトを実行するためにクロームドライバを使用しています。クロムドライバをダウンロードするhttps://chromedriver.storage.googleapis.com/index.html?path=2.27/

0

セレンは、JavaScriptを含むページをレンダリングします。あなたのコードは適切に動作しています。要素が生成されるのを待っています。あなたの場合、SeleniumはそのCSS要素を取得しませんでした。指定したURLは結果ページを表示していません。その代わりに、次のエラーページが生成されています。

http://imgur.com/a/YwFyE

このページではCSSクラスを持っていません。あなたのコードはその特定のCSS要素を待っています。 Firefox Webドライバを試して、何が起きているのかを確認してください。

+0

私はヘッドレスブラウザを使用しています。それが理由かもしれません。通常のブラウザで試してみます。 – dontpanic

+0

ヘッドレスブラウザが正常に動作するはずです。通常のブラウザでは出力が見やすくなります。問題が解決したら、通常のブラウザに切り替えることができます。 Flipkartはほとんどの場合エラーページを開いています。スクリプトが発生するたびに[再試行]ボタンをクリックするようにしてください。 – Sriraman

関連する問題