Python 用无限滚动来刮网站

Python 用无限滚动来刮网站,python,screen-scraping,scraper,Python,Screen Scraping,Scraper,我已经写了很多scraper,但我真的不知道如何处理无限滚动条。如今,大多数网站(如Facebook、Pinterest等)都有无限的滚动条。大多数有无限滚动条的网站(如Lattyware所述)也有一个合适的API,使用该API可能比使用刮削更好 但是如果你一定要刮 当您到达页面底部时,这些站点使用JavaScript从站点请求其他内容。您所需要做的就是找出附加内容的URL,然后您就可以检索它了。通过检查脚本、使用Firefox Web控制台或使用 例如,打开Firefox Web控制台,关闭除

我已经写了很多scraper,但我真的不知道如何处理无限滚动条。如今,大多数网站(如Facebook、Pinterest等)都有无限的滚动条。

大多数有无限滚动条的网站(如Lattyware所述)也有一个合适的API,使用该API可能比使用刮削更好

但是如果你一定要刮

当您到达页面底部时,这些站点使用JavaScript从站点请求其他内容。您所需要做的就是找出附加内容的URL,然后您就可以检索它了。通过检查脚本、使用Firefox Web控制台或使用


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

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

您可以使用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:如果需要,打印数据。

您最好使用这些站点的API,这将是目前为止最简单、最可靠的选择。除此之外,你还需要处理JavaScript,这基本上意味着运行一个完整的浏览器——这样的库确实存在。听起来像是模拟,你能指出一些处理JScript的例子吗?你能给出一个具体的例子吗?我已经添加了一些细节,希望能有所帮助!循环是否意味着我们向下滚动100次?其中100是随机选择的数字。是吗?@satarupa你说得对循环向下滚动100次