Python 随机化抓网靓汤

Python 随机化抓网靓汤,python,beautifulsoup,Python,Beautifulsoup,我正在使用下面的脚本从视频网站中提取10个视频。每次运行时,它都会播放相同的10个视频。相反,我想让它每次拉10个不同的视频。我怎样才能做到这一点 我一直在尝试添加videos=random.choice(video)和其他东西 def link(url): headers = { 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.

我正在使用下面的脚本从视频网站中提取10个视频。每次运行时,它都会播放相同的10个视频。相反,我想让它每次拉10个不同的视频。我怎样才能做到这一点

我一直在尝试添加
videos=random.choice(video)
和其他东西

def link(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'     
    }
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'html.parser')
    videos = list(soup.find_all('script', type='application/ld+json', limit=10))
    for video in videos:
        if '.mp4' in video.string:   
            try:
                video = json.loads(video.string.strip()) 
                r = requests.get(video['contentUrl'], stream=True)
                filename = video['contentUrl'].split('/')[-1]
                with open("/Users/path/Desktop/Test/" + filename, 'wb') as fd:
                    for chunk in r.iter_content(chunk_size=1024):
                        fd.write(chunk)
            except Exception:
                print(Exception)

link('somewebsite.com')

看起来你的名单已经列出来了。现在你只需要随机化它。你应该能够利用

随机导入

并将您的列表随机化,如下所示:


videos = list(soup.find_all('script', type='application/ld+json', limit=10))
random.shuffle(videos)
    for video in videos:
只需将该导入与所有其他导入(如BeautifulSoup)一起放在代码顶部,就可以开始了


如果你希望网站只返回10个随机视频,你需要改变你请求这些视频的方式。如何让浏览器返回10个随机视频?你会传递什么参数?然后模拟URL以执行相同的操作。如果网站总是随机返回10个视频,那么你就无能为力了:)

我假设网站每次请求都会提供10个以上的视频。 我认为@MichaelMoretti的建议是最简单的方法,但对10个元素的列表无效。 因此,也许解决方案是,首先,加载所有视频,删除“限制”
videos=list(soup.find_all('script',type='application/ld+json'))
然后使用sample()获得10个随机视频

编辑: 代码如下:

import requests
from bs4 import BeautifulSoup
import json
import random
def link(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'     
    }
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.content, 'html.parser')
    videos = list(soup.find_all('script', type='application/ld+json'))
    videos = random.sample(videos, 10)
    for video in videos:
        if '.mp4' in video.string:   
            try:
                video = json.loads(video.string.strip()) 
                r = requests.get(video['contentUrl'], stream=True)
                filename = video['contentUrl'].split('/')[-1]
                with open("/Users/path/Desktop/Test/" + filename, 'wb') as fd:
                    for chunk in r.iter_content(chunk_size=1024):
                        fd.write(chunk)
            except Exception as e:
                print(str(e))

link('http://www.shutterstock.com/video/search?sort=random')

正如它所暗示的,也许你还没走那么远。尝试使用
random\u videos=random.sample(videos,10)
这似乎可行,但代码每次运行时仍会下载相同的10个视频。以本网站为例,每个页面都有多个视频。如果我去掉“限制”并将其应用于示例,那么“限制”将不再起作用,所有视频都将下载。我想知道我是否应该随机化页面而不是列表,也许这更简单?脚本中的视频位于运行时排序的固定列表中,因此无论您在查询字符串中输入了什么。我想到的唯一解决办法就是答案中的那个。我在我的电脑上试过了,它似乎起作用了。无论如何,我要编辑答案,插入我试过的代码。