2017-04-07 10 views
1

スクリプトは結果のサブセットを表示するbase_urlからすべてのリンクを取得することになっています。スクロールすると、リストが使い果たされるまでさらに多くの結果がサブセットに追加されます。私はそれを行うことができますが、問題は、スクロールを実行せずにWebページが表示されたときに最初に読み込まれる数少ないリンクのみを取得できることです。レスポンスは、Webドライバによるスクロールと並行して更新できるはずです。しかし、これはこれまでの私のコードです。セレンのスクロールで応答が更新されない

import re 
import requests 
import time 

from bs4 import BeautifulSoup 
from selenium import webdriver 

mybrowser = webdriver.Chrome("E:\chromedriver.exe") 

base_url = "https://genius.com/search?q="+"drake" 

myheader = {'User-Agent':''} 

mybrowser.get(base_url) 
t_end = time.time() + 60 * 1 
while(time.time()<t_end): 
    mybrowser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
    response = requests.get(base_url, headers = myheader) 
    soup = BeautifulSoup(response.content, "lxml") 

pattern = re.compile("[\S]+-lyrics$") 

for link in soup.find_all('a',href=True): 
    if pattern.match(link['href']): 
     print (link['href']) 

最初の数個のリンクのみが表示されます。セレンがページをスクロールしたときに読み込まれるリンクは取得されません。

+0

ここでWebページをダウンロードする要求を使用していますが、代わりにセレンからフェッチしてください。 – Rishav

+0

@Rishav問題は内部的にURLを更新するajaxリクエストです。 'http://genius.com/?page=i(1-50..60 ... n)&& q = drake'のように – pythonlearn

答えて

1

Selenium自体からHTMLを解析する必要があります(これは、SeleniumがWebページをスクロールしたときに変更されます)。ページのダウンロード要求は使用しません。

変更:

response = requests.get(base_url, headers = myheader) 
soup = BeautifulSoup(response.content, "lxml") 

へ:

html = mybrowser.page_source 
soup = BeautifulSoup(html, "lxml") 

そして、それだけで正常に動作するはずです。

+0

これらのURLをファイルにどのように追加しますか? – pythonlearn

+0

@pythonlearn 'mybrowser.current_url' – Rishav

+0

' file.write(リンク['href']) 'は動作しませんか? – pythonlearn

関連する問題