31

我写了很多爬虫,但我不确定如何处理无限滚动。如今,大多数网站等,Facebook,Pinterest 都有无限的滚动条。

4

3 回答 3

33

您可以使用 selenium 废弃无限滚动的网站,如 twitter 或 facebook。

第 1 步:使用 pip 安装 Selenium

pip install selenium 

第2步:使用下面的代码自动无限滚动并提取源代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import sys

import unittest, time, re

class Sel(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://twitter.com"
        self.verificationErrors = []
        self.accept_next_alert = True
    def test_sel(self):
        driver = self.driver
        delay = 3
        driver.get(self.base_url + "/search?q=stckoverflow&src=typd")
        driver.find_element_by_link_text("All").click()
        for i in range(1,100):
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(4)
        html_source = driver.page_source
        data = html_source.encode('utf-8')


if __name__ == "__main__":
    unittest.main()

第 3 步:如果需要,打印数据。

于 2014-11-08T06:07:44.383 回答
26

大多数具有无限滚动功能的网站(正如 Lattyware 所指出的)也有适当的 API,使用它而不是抓取可能会更好地为您服务。

但如果你必须刮...

当您到达页面底部时,此类网站正在使用 JavaScript 从网站请求其他内容。您需要做的就是找出该附加内容的 URL,然后您就可以检索它。可以通过检查脚本、使用 Firefox Web 控制台或使用调试代理来确定所需的 URL 。

例如,打开 Firefox Web 控制台,关闭除 Net 之外的所有过滤器按钮,然后加载您要抓取的站点。您将在加载所有文件时看到它们。在查看 Web 控制台的同时滚动页面,您将看到用于附加请求的 URL。然后您可以自己请求该 URL 并查看数据的格式(可能是 JSON)并将其放入您的 Python 脚本中。

于 2012-09-20T19:57:52.780 回答
1

查找 ajax 源的 url 将是最好的选择,但对于某些站点来说可能很麻烦。或者,您可以使用无头浏览器,例如QWebKitfromPyQt并在从 DOM 树中读取数据时发送键盘事件。QWebKit有一个漂亮而简单的 api。

于 2012-09-21T11:37:32.627 回答