爬取疼寻的视频链接报错了,怎么解决?
使用他的代码开始爬第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 这个报错是由于你使用了错误的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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-5 18:12
这个报错是由于你使用了错误的CSS选择器语法导致的。在代码中,你尝试使用`.list_item`来选择class为`list_ ...
还是不太行, 我就是想把腾讯视频的每一集的html抓取下来
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-5 18:21
抱歉,我可能误解了你的问题。如果你只是想将腾讯视频每一集的HTML内容保存下来,你可以尝试以下代码: ...
要想要每一集的html原链接放到txt文件中呢?不要video_1.html链接编号 就要视频的原链接 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-5 18:27
明白了,你想要将每一集视频的原链接保存到一个txt文件中。那么你可以尝试以下代码:import requestsde ...
能以代码模式展示出来吗?我调试不出来 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 小助理,如未能正确解答您的问题,请继续追问。 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()
这样对吗? 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 小助理,如未能正确解答您的问题,请继续追问。 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 生成这个链接不能正常访问 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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-4-5 18:59
要爬取特定的腾讯视频链接,你需要修改代码中的URL格式。在你提供的示例中,你想要访问的链接是 https: ...
那怎么样自动获取视频的id呢? 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]