之前由于简直需要爬取youtube视频,于是我就订阅了大量关于游戏类的视频的创作作者,但是要自己一个个打开视频内容来复制粘贴地址和名字到txt或者word上面是在太麻烦。
在寻找一堆爬虫过后无果后,就自己写了一个爬取youtube订阅内容的简单爬虫。
1.创建python程序
在此处需要建立一个编译环境,由于我自己用的是pycharm,这个地方就不赘述了。
2.导入需要使用的包
import urllib.request as req #爬虫常用的包,用于访问网页并获得其中内容
import re #正则表达式的使用包,用于实现正则表达式书写
import datetime #关于时间的包,通常用于获取时间相关的内容
这里的相关包都是python3自带的包,如果是python2相关的版本,缺少的话自己使用pip命令安装
3.写入获取网页的相关代码
url_ytb_s = 'https://www.youtube.com/feed/subscriptions'
#辨别个人的cookie

此处需要说明的是,因为我们每个人的订阅内容不一样,所以需要通过youtube需要通过cookie验证你的个人身份,因此需要在打开订阅页面的时候加上cookie验证来获得你个人的订阅内容。

这里的cookie获取可以使用浏览器查看,我个人使用的是chrome,按下F12,再点击订阅内容,查看subscripiton的那个XHR文件的请求cookie即可看到在请求订阅内容时候使用的cookie。
完整的请求页面代码如下:
#辨别个人的cookie
cookie_youtube = 'APISID=08pQtyBJUwqu7asv/A1YdKNnP4c-LzIglG;' \ 'CONSENT=YES+CN.zh-CN+20170813-09-1;' \ 'HSID=ArNjTDZ4DW3-duwpD;' \ 'LOGIN_INFO=AFmmF2swRQIgYtrv-ph4o3QnULfpTUetmqOCC-WEOT6a3GR-r4jFUycCIQDJ-4fpb6g6Iqrv9cPKgLmbIz8K3rR3vooN2TNXCMHZHA:QUQ3MjNmekVoMVhFVW5YWGpOeEJFejIxYjByQ2xqMFRSVGthREJ6LVVoQjBNT2FUVng2cV96VUhwd0g0VlNSZFU0aHpTdHA2bUd4Q1JST0pwMkZYcklEUWJWYlRXaWduRGlneTNOX0h6c2dEU29pMDFqcHZvZHZXUDRURHZmb0NsOE1ZckdkbGR2UlVVRmJrUHBzbTFXdk9RYi01YXdLRXFiTHlFR1dhNHNQbEluN3ExUUlqbThZ;' \ 'PREF=f1=50000000&al=zh-CN;' \ 'SAPISID=4g9YstiqqkcAtARd/A2kSQFDk6sCJ_N4dk;' \ 'SID=SgZ3TrvX0tuz1IgxhrY3EgD5KanguFlz5_fzzK7GTNmzM0uoxIcyp2xX4wpW5RnUarknUA.;' \ 'SSID=A6G-g9j6cnQUBNLJd;' \ 'ST-1tzw2b8=itct=CCQQtSwYAiITCLKktsOAwtwCFQsOKgodVxML2TIKZy1wZXJzb25hbA%3D%3D&csn=Z31cW8ecJtqioQPHx6uADg;' \ 'VISITOR_INFO1_LIVE=xBfJyY4sUN0;' \ 'YSC=zpD1N6BAjx4;'
#模拟浏览器访问使用的头信息
header = {'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'Connection': ' keep-alive', 'Cookie':cookie_youtube}
request_ytb = req.Request(url=url_ytb_s,headers=header) #带着浏览器的头信息去请求这个我们订阅的网页
response_ytb = req.urlopen(request_ytb) #得到返回信息并打开,获得网页内容
html = response_ytb.read().decode('utf8') #读取网页内容,并转码成utf8的编码形式,此处如果不转码会发现其中的汉字被转换成其他的编码形式
4.获取视频的名字和地址
这里我们已经获得了订阅内容页面的所有信息,如何从这里面找到需要的内容就需要使用正则表达式了。
相关代码如下:
#获得视频名字的正则表达式
ytb_name_pattern = re.compile(r'},\"title\":{\"accessibility\":{\"accessibilityData\":{"label\":\"(.*?)来自')
#获得视频地址的正则表达式
ytb_address_patter = re.compile(r'\"url\":\"/watch\?v=(.*?)\",\"webPageType\":\"WEB_PAGE_TYPE_WATCH\"}},\"watchEndpoint\":{\"videoId\":\"')
#获取所有符合正则表达式的视频名字,并存储在名为result_name的列表里
result_name = re.findall(ytb_name_pattern,html)
#获取所有符合正则表达式的视频地址,并存储在名为result_naddress的列表里
result_address = re.findall(ytb_address_patter,html)
5.关于内容的存储
获得了需要的信息之后需要进行存储,我们这里根据日期创建每日的订阅内容,来创建不同日期的txt以便存储。
代码如下:
#获取当日订阅的时间
today = datetime.datetime.now()
file_name = str(today.year)+'-'+str(today.month)+'-'+str(today.day)
#print(file_name)
#在指定文件夹的地址内创建存储订阅内容的txt文件,此处可以将 F:\work_log\ 替换为你需要存储文件的地址
file_adr = 'F:\\work_log\\'+file_name+'.txt'
log_point = 0
fr = open(file_adr,'w')
#打印出所有符合正则表达式的内容 while log_point
while log_point<len(result_name):
# fr.writelines('https://www.youtube.com/watch?v='+result_address[log_point])
# fr.writelines('#北京搬运#'+result_name[log_point])
# fr.writelines('#北京搬运#' + result_name[log_point].encode('utf-8'))
print('https://www.youtube.com/watch?v=' + result_address[log_point])
print(result_name[log_point], '\n',log_point+1,'\n')
log_point += 1
fr.close()
这里需要说明的地方是,在没有使用科学上网的情况下是没有办法获得订阅内容的,所以在运行时,要保证你能进得去youtube的网站。还有就是这里没有直接将得到的内容直接放入写好的txt文件里,是因为在写入的时候会出现编码错误,所以这里只能是打印出来,然后人工复制粘贴到已经创建好的txt文件里,以待后期修复
网友评论