使用Python / PhantomJS / Selenium滚动无限页面

时间:2017-12-15 12:18:41

标签: python selenium web-scraping phantomjs

我正试图抓住这一个(无限)页面(www.mydealz.de),但我无法让我的webdriver向下滚动页面。 我使用Python(3.5),Selenium(3.6)和PhantomJS。 我已经尝试了几种方法,但是webdriver只是不会滚动 - 它只是给了我第一页。

第一种方法(使用滚动方法):

last_height = driver.execute_script("return document.body.scrollHeight")
while True:
  driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  time.sleep(1)
  new_height = driver.execute_script("return document.body.scrollHeight")
  if new_height == last_height:
       break
  last_height = new_height

第二种方法(只需按下向下键几次然后释放它,尝试在按下之间进行操作):

ActionChains(driver).key_down(Keys.ARROW_DOWN).perform()
ActionChains(driver).key_up(Keys.ARROW_DOWN).perform()

第3种方法(找到“滚动列表”中的最后一个元素并滚动到其视图以强制滚动):

posts = driver.find_elements_by_css_selector("div.threadGrid")
driver.execute_script("arguments[0].scrollIntoView();", posts[-1])

到目前为止没有任何工作,是否有人知道是否有其他方法或我犯了错误?

3 个答案:

答案 0 :(得分:1)

比使用Selenium / PhantomJS方式更容易模仿浏览器的功能。如果你打开"网络" Chrome浏览器的开发人员工具中的标签,您会看到浏览器向https://www.mydealz.de/?page=2&ajax=true发出请求以实现无限滚动。当我将请求复制为curl时,将其限制为将其引导至

的最小值
curl 'https://www.mydealz.de/?page=2&ajax=true' -H 'x-requested-with: XMLHttpRequest'

将其转换为python脚本:

import json, requests

url = 'http://www.mydealz.de/'
headers = {'x-requested-with': 'XMLHttpRequest'}

for page in range(10):
    params = dict(page=page, ajax='true')
    resp = requests.get(url=url, params=params, headers=headers)
    data = json.loads(resp.text)
    html = data['data']['content']
    # do something with html, maybe parse it with beautifulsoup

除了更简单的代码之外,它也会快得多。

答案 1 :(得分:0)

我可以在上述网站中看到1853页。所以你可以迭代一个循环,直到你到达最后一页。睡眠时间必须高于平均值以加载每页,尝试使用最少3,值越多,不加载数据的机会就越少。

stage

答案 2 :(得分:0)

要滚动浏览网页,直到the url is mydealz.de/?page=3,您可以使用以下代码块:

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\\Utility\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe')
driver.set_window_size(1400,1000)
driver.get("https://www.mydealz.de")
while ("3" not in driver.current_url) :
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
print(driver.current_url)
driver.quit()

控制台输出:

https://www.mydealz.de/?page=3