无限滚动抓取网站
Posted
技术标签:
【中文标题】无限滚动抓取网站【英文标题】:scrape websites with infinite scrolling 【发布时间】:2012-09-13 04:48:05 【问题描述】:我写了很多爬虫,但我不确定如何处理无限滚动。如今,大多数网站等、Facebook、Pinterest 都有无限滚动条。
【问题讨论】:
您最好的选择是使用这些站点的 API——到目前为止,这将是最简单、最可靠的选择。除此之外,你将不得不处理 javascript,这基本上意味着运行一个完整的浏览器——这样的库确实存在。 听起来像是模拟,你能指出一些处理jscript的例子吗 【参考方案1】:您可以使用 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 步:如果需要,打印数据。
【讨论】:
循环是否意味着我们向下滚动 100 次?其中 100 是随机选择的数字。对吗? @satarupa 你说得对,循环是向下滚动 100 次【参考方案2】:大多数具有无限滚动功能的网站(如 Lattyware 所述)也有适当的 API,使用它而不是抓取可能会更好地为您服务。
但如果你必须刮...
当您到达页面底部时,此类网站会使用 JavaScript 从网站请求其他内容。您需要做的就是找出该附加内容的 URL,然后您就可以检索它。可以通过检查脚本、使用 Firefox Web 控制台或使用debug proxy 来确定所需的 URL。
例如,打开 Firefox Web 控制台,关闭除 Net 之外的所有过滤器按钮,然后加载您要抓取的站点。您将在加载所有文件时看到它们。在查看 Web 控制台的同时滚动页面,您将看到用于附加请求的 URL。然后您可以自己请求该 URL 并查看数据的格式(可能是 JSON)并将其放入您的 Python 脚本中。
【讨论】:
你能举一个具体的例子吗? 我添加了更多细节,希望对您有所帮助!【参考方案3】:查找 ajax 源的 url 将是最佳选择,但对于某些网站来说可能很麻烦。或者,您可以使用无头浏览器,例如 PyQt
中的 QWebKit
,并在从 DOM 树中读取数据时发送键盘事件。 QWebKit
有一个漂亮而简单的 api。
【讨论】:
以上是关于无限滚动抓取网站的主要内容,如果未能解决你的问题,请参考以下文章