maikehong 发表于 2024-4-5 18:12:37

爬取疼寻的视频链接报错了,怎么解决?

使用他的代码

开始爬第1页
Traceback (most recent call last):
File "D:\工具\py项目\py测试\腾讯视频的html.py", line 104, in <module>
    spider_tx()
File "D:\工具\py项目\py测试\腾讯视频的html.py", line 99, in spider_tx
    find_videos(url)
File "D:\工具\py项目\py测试\腾讯视频的html.py", line 19, in find_videos
    for each in soup.select('."list_item"'):
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\bs4\element.py", line 2116, in select
    return self.css.select(selector, namespaces, limit, **kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\bs4\css.py", line 162, in select
    self.api.select(
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\__init__.py", line 147, in select
    return compile(select, namespaces, flags, **kwargs).select(tag, limit)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\__init__.py", line 65, in compile
    return cp._cached_css_compile(
         ^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\css_parser.py", line 208, in _cached_css_compile
    ).process_selectors(),
      ^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\css_parser.py", line 1129, in process_selectors
    return self.parse_selectors(self.selector_iter(self.pattern), index, flags)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\css_parser.py", line 965, in parse_selectors
    key, m = next(iselector)
             ^^^^^^^^^^^^^^^
File "C:\Program Files\Python312\Lib\site-packages\soupsieve\css_parser.py", line 1122, in selector_iter
    raise SelectorSyntaxError(msg, self.pattern, index)
soupsieve.util.SelectorSyntaxError: Malformed class selector at position 0
line 1:
."list_item"
^

进程已结束,退出代码为 1

FishC 发表于 2024-4-5 18:12:51

这个报错是由于你使用了错误的CSS选择器语法导致的。在代码中,你尝试使用`.list_item`来选择class为`list_item`的元素,但是在CSS选择器中,class选择器的写法应该是`.list_item`,而不是`."list_item"`。

所以你只需要修改代码中的这一行即可,将`for each in soup.select('."list_item"'):` 改为 `for each in soup.select('.list_item'):`。

修改后的代码如下:

import requests
from bs4 import BeautifulSoup

def find_videos(url):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    html = r.text
    soup = BeautifulSoup(html, 'html.parser')
    for each in soup.select('.list_item'):
      video_link = each.find('a')['href']
      print(video_link)

def spider_tx():
    url = 'https://v.qq.com/x/search/?q=%E7%96%BC%E5%AF%BB&stag=1&smartbox_ab='
    find_videos(url)

spider_tx()

运行以上修改后的代码,应该就不会再报错了。如果你还有其他问题,请随时提出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 18:21:40

FishC 发表于 2024-4-5 18:12
这个报错是由于你使用了错误的CSS选择器语法导致的。在代码中,你尝试使用`.list_item`来选择class为`list_ ...

还是不太行,   我就是想把腾讯视频的每一集的html抓取下来

FishC 发表于 2024-4-5 18:21:58

maikehong 发表于 2024-04-05 18:21
还是不太行,   我就是想把腾讯视频的每一集的html抓 ...

抱歉,我可能误解了你的问题。如果你只是想将腾讯视频每一集的HTML内容保存下来,你可以尝试以下代码:

import requests

def save_html(url, filename):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    r = requests.get(url, headers=headers)
    r.raise_for_status()
   
    with open(filename, 'w', encoding='utf-8') as f:
      f.write(r.text)

def spider_tx():
    # 假设你要抓取的视频链接为 https://v.qq.com/x/xxxxx.html
    for i in range(1, 31):# 假设有30集视频,根据实际情况修改结束条件
      url = f'https://v.qq.com/x/xxxxx_{i}.html'# 根据每一集的URL格式进行修改
      filename = f'video_{i}.html'# 指定保存的文件名
      save_html(url, filename)

spider_tx()

以上代码会从第一集到最后一集循环抓取每一集的HTML内容,并将其保存到以 `video_数字.html` 命名的文件中,例如 `video_1.html`、`video_2.html` 等。请将 `https://v.qq.com/x/xxxxx.html` 中的 `xxxxx` 替换为实际视频链接的编号。同时,根据实际情况修改循环的结束条件与文件名的命名方式。希望这次能够满足你的需求,如果还有问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 18:27:18

FishC 发表于 2024-4-5 18:21
抱歉,我可能误解了你的问题。如果你只是想将腾讯视频每一集的HTML内容保存下来,你可以尝试以下代码: ...

要想要每一集的html原链接放到txt文件中呢?不要video_1.html链接编号   就要视频的原链接

FishC 发表于 2024-4-5 18:27:35

maikehong 发表于 2024-04-05 18:27
要想要每一集的html原链接放到txt文件中呢?不要vid ...

明白了,你想要将每一集视频的原链接保存到一个txt文件中。那么你可以尝试以下代码:import requestsdef save_links(url, filename):    headers = {      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'    }    r = requests.get(url, headers=headers)    r.raise_for_status()      with open(filename, 'a', encoding='utf-8') as f:# 使用'a'模式,追加写入      f.write(url + '\n')def spider_tx():    # 假设你要抓取的视频链接为 https://v.qq.com/x/xxxxx.html    for i in range(1, 31):# 假设有30集视频,根据实际情况修改结束条件      url = f'https://v.qq.com/x/xxxxx_{i}.html'# 根据每一集的URL格式进行修改      filename = 'video_links.txt'# 指定保存链接的文件名      save_links(url, filename)spider_tx()以上代码会从第一集到最后一集循环抓取每一集的视频原链接,并将其保存到名为 `video_links.txt` 的文件中。请将 `https://v.qq.com/x/xxxxx.html` 中的 `xxxxx` 替换为实际视频链接的编号,根据实际情况修改循环的结束条件和文件名。每个链接都会占据一行,并以换行符 `\n` 分隔。希望这次能够满足你的需求,如果还有问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 18:42:42

FishC 发表于 2024-4-5 18:27
明白了,你想要将每一集视频的原链接保存到一个txt文件中。那么你可以尝试以下代码:import requestsde ...

能以代码模式展示出来吗?我调试不出来

FishC 发表于 2024-4-5 18:43:00

maikehong 发表于 2024-04-05 18:42
能以代码模式展示出来吗?我调试不出来

当然可以!以下是以代码形式展示出来的完整代码:import requestsdef save_links(url, filename):    headers = {      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'    }    r = requests.get(url, headers=headers)    r.raise_for_status()    with open(filename, 'a', encoding='utf-8') as f:      f.write(url + '\n')def spider_tx():    for i in range(1, 31):      url = f'https://v.qq.com/x/xxxxx_{i}.html'      filename = 'video_links.txt'      save_links(url, filename)spider_tx()请将 `https://v.qq.com/x/xxxxx.html` 中的 `xxxxx` 替换为实际视频链接的编号。将代码粘贴到你的Python IDE或编辑器中,并确保已安装 `requests` 库。在运行代码之前,请确保已修改循环的结束条件和文件名,以适应你的需求。运行代码后,会自动抓取每一集视频的原链接,并将其保存到名为 `video_links.txt` 的文件中。希望这次能够解决你的问题,如果还有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 18:55:33

FishC 发表于 2024-4-5 18:43
当然可以!以下是以代码形式展示出来的完整代码:import requestsdef save_links(url, filename):    h ...

import requests
def save_links(url, filename):
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    with open(filename, 'a', encoding='utf-8') as f:
      f.write(url + '\n')
def spider_tx():
    for i in range(1, 16):
url = f'https://v.qq.com/x/cover/mzc00200wjrts73/{i}.html'
filename = 'video_links.txt'
save_links(url, filename)
spider_tx()
这样对吗?

FishC 发表于 2024-4-5 18:55:46

maikehong 发表于 2024-04-05 18:55
import requests
def save_links(url, filename):
...

你的代码基本上是正确的,但有一个小问题。在 `spider_tx()` 函数中,你忘记缩进第9行的代码了。这会导致循环体没有正确地包含在函数中。请将第9行的代码缩进到与第8行相同的位置,这样就可以解决问题了。修改后的代码如下所示:

import requests

def save_links(url, filename):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    with open(filename, 'a', encoding='utf-8') as f:
      f.write(url + '\n')

def spider_tx():
    for i in range(1, 16):
      url = f'https://v.qq.com/x/cover/mzc00200wjrts73/{i}.html'
      filename = 'video_links.txt'
      save_links(url, filename)

spider_tx()

现在代码应该可以正常运行并将每个视频的链接保存在名为 `video_links.txt` 的文件中了。如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 18:59:03

FishC 发表于 2024-4-5 18:55
你的代码基本上是正确的,但有一个小问题。在 `spider_tx()` 函数中,你忘记缩进第9行的代码了。这会导 ...

我想爬取腾讯这样的链接https://v.qq.com/x/cover/mzc00200wjrts73/z0048ngve7k.html
而不是生成这样的https://v.qq.com/x/cover/mzc00200wjrts73/1.html   生成这个链接不能正常访问

FishC 发表于 2024-4-5 18:59:19

maikehong 发表于 2024-04-05 18:59
我想爬取腾讯这样的链接https://v.qq.com/x/cover/mzc ...

要爬取特定的腾讯视频链接,你需要修改代码中的URL格式。在你提供的示例中,你想要访问的链接是 https://v.qq.com/x/cover/mzc00200wjrts73/z0048ngve7k.html ,而不是简单的递增数字。为了实现这个目标,你可以通过修改`spider_tx()`函数中的代码来构造正确的链接。修改后的代码如下所示:

import requests

def save_links(url, filename):
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    with open(filename, 'a', encoding='utf-8') as f:
      f.write(url + '\n')

def spider_tx():
    video_ids = ['z0048ngve7k', 'z0123abcd45'] # 添加你想爬取的视频ID
    for video_id in video_ids:
      url = f'https://v.qq.com/x/cover/mzc00200wjrts73/{video_id}.html'
      filename = 'video_links.txt'
      save_links(url, filename)

spider_tx()

在`spider_tx()`函数中,我添加了一个`video_ids`列表,其中包含你想要爬取的每个视频的ID。你可以根据自己的需求修改这个列表,并将视频ID替换为你想要爬取的视频的真实ID。

运行这个修改后的代码,应该可以正确地爬取你指定的腾讯视频链接了。如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

maikehong 发表于 2024-4-5 19:01:03

FishC 发表于 2024-4-5 18:59
要爬取特定的腾讯视频链接,你需要修改代码中的URL格式。在你提供的示例中,你想要访问的链接是 https: ...

那怎么样自动获取视频的id呢?

FishC 发表于 2024-4-5 19:01:21

maikehong 发表于 2024-04-05 19:01
那怎么样自动获取视频的id呢?

要自动获取腾讯视频的ID,你可以通过请求页面,并解析页面的HTML来提取视频的ID。在腾讯视频的链接中,视频的ID通常包含在URL中的一部分。以下是一个示例代码,演示如何从腾讯视频页面中提取视频的ID:import requestsfrom bs4 import BeautifulSoupdef get_video_id(url):    headers = {      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'    }    r = requests.get(url, headers=headers)    r.raise_for_status()    soup = BeautifulSoup(r.text, 'html.parser')    video_id = soup.find('meta', {'itemprop': 'url'}).get('content').split('/')[-1]    return video_iddef spider_tx():    urls = [      'https://v.qq.com/x/cover/mzc00200wjrts73/z0048ngve7k.html',      'https://v.qq.com/x/cover/mzc00200wjrts73/y00481xobct.html',      'https://v.qq.com/x/cover/mzc00200wjrts73/x0048qz9hvq.html'    ]    for url in urls:      video_id = get_video_id(url)      print(video_id)spider_tx()在这个示例代码中,`get_video_id()`函数会接收一个腾讯视频的链接作为参数,并返回视频的ID。它首先向链接发送请求,然后使用BeautifulSoup解析页面的HTML。通过查找具有`itemprop`属性为"url"的`meta`标签,我们可以找到视频的URL,然后使用字符串操作获取URL中的视频ID部分。

在`spider_tx()`函数中,你可以将需要爬取的腾讯视频链接添加到`urls`列表中。然后,循环遍历每个链接,调用`get_video_id()`函数来获取视频的ID,并进行处理。

运行这个示例代码,应该能够自动获取腾讯视频的ID。如果你还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 爬取疼寻的视频链接报错了,怎么解决?