在页面中使用 elem.send_keys 作为句柄 "Infinite Scroll"。在 Python 中使用 Selenium PhantomJS

Use elem.send_keys for handle "Infinite Scroll" in page. Using Selenium PhantomJS in Python

我需要在像 this 这样的 "Infinite Scroll" 网页中获取由 xpath 识别的元素。 问题是,当我将 Selenium 与 webdriver PhantomJS 一起使用时,它只需要一些链接,第一个链接是在页面加载后加载的。 我尝试增加 time.sleep() 或在代码中插入更多但不起作用。如果我像使用 webdriver 一样使用 Firefox,它运行良好。

可以解决这个问题并改进我的代码吗? 也许不使用时间事件,而是寻找可以判断页面是否下降的东西。

谢谢和问候

import re
import mechanize
from pydblite import Base
from selenium import webdriver
import platform
import codecs
import scrapy  
import time
from selenium.webdriver.common.keys import Keys

class getFrom(object):



def scrapying(self):
    print platform.system()


        #browser = webdriver.Firefox()
        browser = webdriver.PhantomJS(executable_path='/usr/local/bin/node_modules/phantomjs/lib/phantom/bin/phantomjs')



    browser.get("https://medium.com/top-100/december-2013")
    time.sleep(5)

    elem = browser.find_element_by_tag_name("body")

    no_of_pagedowns = 200

    while no_of_pagedowns:
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.02)
        no_of_pagedowns-=1

    #Qui ci dovrebbe essere lo spider

    post_elems = browser.find_elements_by_class_name("graf--h2")

    #Fine Spider

    for post in post_elems:
        print post.text

    browser.quit()

myClassObject = getFrom()
myClassObject.scrapying()

我这样修改了我的代码:

import re
import mechanize
from pydblite import Base
from selenium import webdriver
import platform
import codecs
import scrapy
import time
from selenium.webdriver.common.keys import Keys

class getFrom(object):



def scrapying(self):
    print platform.system()

    if platform.system()=="Windows":
        browser = webdriver.Firefox()
    else:
        #browser = webdriver.Firefox()
        browser = webdriver.PhantomJS(executable_path='/usr/local/bin/node_modules/phantomjs/lib/phantom/bin/phantomjs')



    browser.get("https://medium.com/top-100/december-2013")
    time.sleep(5)

    elem = browser.find_element_by_tag_name("body")


    mins = raw_input("For how many minutes you want to scrapy the links? ")

    print "start: "+ time.asctime( time.localtime(time.time()) )
    timeout = time.time() + 60* int(mins) # 5 minutes from now

    while True:
        test = 0
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.5)
        if test == 5 or time.time() > timeout:
            print "end: "+ time.asctime( time.localtime(time.time()) )
            break
        test = test - 1

    #Qui ci dovrebbe essere lo spider

    post_elems = browser.find_elements_by_class_name("graf--h2")

    #Fine Spider

    for post in post_elems:
        print post.text

    browser.quit()



myClassObject = getFrom()
myClassObject.scrapying()

现在工作正常。 我删除了 for 循环添加了一个时间控制来处理获得很少结果或很多结果的可能性。 但最重要的是使用这个 javascript 函数: browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

而不是 send_keys