爬取主页面中的视频页面地址
- 正则表达式测试:推荐这个网址进行测试,测试网址,不建议整个页面进行正则匹配,我感觉不如搭配着好用
- 使用requests模块的时候不要使用代理软件,例如clash,否则会引发一串报错
import time
import requests
from bs4 import BeautifulSoup
import re
import os
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
regex = r"<a href=\"(.*?)\">[\D\d]*?loadBannerDirect\('(.*?)',[\D\d]*?\"headline\">(.*?)</h2>[\D\d]*"
def get_num_url(page_num):
for num in range(1, page_num):
urls = '**************/page/{}/'.format(num)
html_data = requests.get(url=urls, headers=headers).text
soup = BeautifulSoup(html_data, 'lxml')
str_lists = soup.select('article > a')
for str_list in str_lists:
matches = re.findall(regex, str(str_list), re.S)
with open('./page{}.txt'.format(str(num)), 'a', encoding='utf-8') as ft:
try:
if len(matches[0][2]) < 150:
ft.write(str(matches[0]) + '\n')
except IndexError:
pass
time.sleep(0.5)
if __name__ == '__main__':
get_num_url(10)
- 大体就是从主页面爬取其中视频页的预览图,视频页的地址,视频页的名字
- 其中正则表达式还有bs4解析都需要根据你自己想爬取的网页进行重新编排,该代码只能看个流程
从视频页面里爬取m3u8地址,并下载其中的ts文件
import time
from datetime import datetime
import requests
from lxml import etree
import os
import re
regex_txt = r"\('(.*?)', '(.*?)', '(.*?)'\)"
regex_url = r".*?\"url\":\"(.*?)\",\"pic\".*"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
def download_m3u8(urls, name):
html_data = requests.get(url=urls, headers=headers).text
parser = etree.HTMLParser(encoding='utf-8')
tree = etree.HTML(html_data, parser=parser)
video_content = tree.xpath('//div[@class="dplayer"]/@data-config')
video_url = re.match(regex_url, video_content[0], re.S).group(1)
video_url = video_url.replace('\\', '')
name = name.replace(' ', '')
folder_path = './{}'.format(name)
if not os.path.exists(folder_path):
os.mkdir(folder_path)
m3u8_path = folder_path + '/index.m3u8'
with open(m3u8_path, 'w', encoding='utf-8') as fm:
fm.write(requests.get(url=video_url, headers=headers).text)
time.sleep(1)
return folder_path, m3u8_path, video_url[:-10]
def get_ts_urls(m3u8_path, base_url):
urls = []
with open(m3u8_path, "r") as file:
lines = file.readlines()
for line in lines:
if line.endswith(".ts\n"):
urls.append(base_url + line.strip("\n"))
return urls
def download_ts(ts_urls, download_path):
for ts_url in ts_urls:
file_name = ts_url.split("/")[-1]
ts_path = download_path + "/{}".format(file_name)
print(ts_path)
print(ts_url)
if not os.path.exists(ts_path):
with open(ts_path, "wb") as fb:
try:
response = requests.get(headers=headers, url=ts_url).content
fb.write(response)
except TimeoutError:
pass
except ConnectionError:
pass
else:
print("{} 已经存在,开始下载下一个ts".format(file_name))
continue
def get_page_video(page_num):
with open('page{}.txt'.format(page_num), 'r', encoding='utf-8') as ft:
lines_data = ft.readlines()
for line_data in lines_data:
match = re.match(regex_txt, line_data, re.S)
url = match.group(1)
name = match.group(3)
print(name)
folder_path, m3u8_path, base_url = download_m3u8(url, name)
print(folder_path)
ts_urls = get_ts_urls(m3u8_path, base_url)
download_ts(ts_urls, folder_path)
if __name__ == '__main__':
for i in range(1, 9):
get_page_video(i)
- 这部分大体是根据上一步爬取的视频页地址,对视频页解析获取m3u8文件,然后对m3u8文件进行读取,然后拼接m3u8文件里所有的ts文件地址后进行下载,存储到文件夹里
- 同理这些也只能看看流程和处理方式,其中正则和xpath解析也需要根据你的爬取界面的链接进行匹配
bs4与Xpath解析流程与方法
'''
bs4解析流程:
1. 对象实例化 将html文档加载当前对象中
b = open('n.html','r',encoding = 'utf-8')
soup = BeautifulSoup(b,'lxml')
b = respons.text
soup = BeautifulSoup(b,'lxml')
2.
#返回第一次出现的a标签
soup.a 等同于 soup.find('a')
#返回第一个a标签里含有class为song的标签
soup.find('a',class_='song')
#返回所有a标签
soup.findall('a')
#选择器,例如id class 标签等等
soup.select('')
#类选择器(class标签):.(类的值)
#ID选择器(ID标签):#(ID的值)
#标签选择器:标签名
例如:soup.select('.rang > #lisd > li > a')
选择所有 类名为rang下,ID为lisd下,li标签下的a标签,其中>代表一个层级(子代选择器),必须是紧挨着自己的下一层
soup.select('.rang > #lisd a')
选择所有 类名为rang下,ID为lisd下所有a标签,其中空格表示后代选择器,中间可以隔很多代
# 获取标签间的文本数据
soup.a.text/string,text获取标签下所有内容,string只获取直系文本
# 获取标签中的属性值
soup.a['href']
'''
'''
xpath解析:
实例化etree对象,将被解析的页面源码数据加载到对象中
调用etree对象的xpath方法结合着xpath表达式实现标签的定位和内容捕获
流程:
1.将本地html文档中源码加载到对象中
etree.parse(filepath)
2.将互联网获取的数据加载到对象中
etree.HTML(page_text)
3.xpath表达式
/:表示的是从根节点开始定位。表示的是一个层级。
//∶表示的是多个层级。也可以表示从任意位置开始定位。
属性定位: //div[@class='song'] 标准形式tag[@attrName="attrValue"]
索引定位: //div[@class='song']/p[3] 索引是从1开始的。
取文本:
/text()获取的是标签中直系的文本内容
//text(标签中非直系的文本内容(所有的文本内容)
取属性:
/@attrName ==> 例如:img/@src 就是取img的src的属性值
'''
|