【问题标题】:How do I scrape a website that changes the order of its media file after each refresh?如何抓取每次刷新后更改其媒体文件顺序的网站?
【发布时间】:2020-09-21 14:33:35
【问题描述】:

我想抓取包含注释的特定网站的媒体文件。我尝试了很多次从中下载笔记,并且很容易获取文件,但没有一个是按顺序排列的。该网站可能会在您滚动到第 30 页后进行 Ajax 调用,然后加载接下来的 30 个页面,并且它会像这样一直持续到页面结束。有人可以告诉我如何以正确的顺序获取文件吗?我知道这个问题还不够,但我只想大致了解如何解决这个问题。

我正在删除该网站以供参考 https://lecturenotes.in/m/37320-note-for-java-programming-java-by-prateek-jain?reading=true

【问题讨论】:

    标签: python selenium web-scraping scrapy


    【解决方案1】:

    该网站似乎正在向https://lecturenotes.in/material/v2/37320/page-1?noOfItems=30 发出初始请求,以加载包含 30 个项目的第一页。当通过滚动到达第 30 张幻灯片时,正在向 https://lecturenotes.in/material/v2/37320/page-30?noOfItems=10 发出另一个请求,该请求加载 10 个项目,然后您向 https://lecturenotes.in/material/v2/37320/page-39?noOfItems=10 发出请求,依此类推。

    因此,您的方法是保留加载的元素(页面)的计数,并将其增加一个偏移量。如:

    import requests # This proof of concept requires the requests module
    
    slides = []
    lecture_id = "37320" # The ID of the lecture
    itemsToLoad = 10 # Pages to load per request
    page = 1 # Page number
    
    while page < 70:
        data = requests.get(f"https://lecturenotes.in/material/v2/{lecture_id}/page-{page}?noOfItems={itemsToLoad}").json()
    
        pages = data.get('page', [])
        if not pages: break
    
        slides.extend(pages)
        page += len(pages) - 1
    
    print(slides) # [{'id': '5d83d172662e4e36315ce88a', 'path': '/uploads/upload/5d83/5d83d1/5d83d15f662e4e36315ce885/ck0r2ehe96f3c0qqu1y5z7gi8.jpg', 'width': 1000, 'height': 562, 'text': 'JAVA\n\n', 'upgradeToPrime': False, 'type': 'jpg', 'pageNum': 1}, {'id': '5d83d172662e4e36315ce88b', 'path': '/uploads/upload/5d83/5d83d1/5d83d15f662e4e36315ce885/ck0r2ehec6f3d0qqufouvgf96.jpg', 'width': 1000, 'height': 562, 'text': 'JAVA FROM\nC++\n\n', 'upgradeToPrime': False, 'type': 'jpg', 'pageNum': 2} ...
    
     
    

    【讨论】:

    • 非常感谢兄弟。我对刮擦真的很陌生,我认为这真的很难,但非常感谢你让我看到了一些希望。上帝保佑你,我的朋友。
    • 不客气。每个人都必须从某个时间点开始。如果此答案解决了您的问题,请务必接受并毫不犹豫地投票。
    • 如果您不介意,我可以问您一些事情吗?我是新手,请不要介意
    • 当然可以。我全神贯注。
    • 好吧,当你第一次看到那个网站时,我在我的问题中提供的那个。你的第一个想法是什么?我的意思是你是怎么想到刮掉它的?我没有导师。我只是看视频并了解到这就是我缺乏基础的原因。所以请不要介意我
    【解决方案2】:

    我不确定我是否完全理解了你的问题,但这些是你可以抓取的信息:

    在我打开开发工具的网络选项卡并重新加载页面后,我发现:

    在 R 中抓取页面:

    library(rvest)
    library(dplyr)
    details <- jsonlite::fromJSON("https://lecturenotes.in/material/v1/37320/details")
    lecture <- 
      purrr::map_dfr(
        1:details$material$pagesCount,
        function(i) {
          as.data.frame(jsonlite::fromJSON(paste0("https://lecturenotes.in/material/v2/37320/page-", i))$page)
        }
      ) %>%
      mutate(
        path = paste0("https://lecturenotes.in", path)
      )
    

    结果:

    【讨论】:

    • 非常感谢。这对我帮助很大。请投票赞成这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多