#coding:utf-8 2 __author__ = "zhoumi" 3
?4 import requests 5 import re 6 import urllib 7 ‘‘‘ 8 本文档目的在于获得: 9 1、一级目录与其对应链接的字典,如下形式10 ????dictinfo = {一级目录:链接}11 2、二级目录与其对应链接的字典,如下形式12 ????dict2info = {二级目录:链接}13 3、一级目录与二级目录对应的字典,如下形式14 ????dict3info = {一级目录:[二级目录]}15 ‘‘‘16 17 #获得待解析的页面18 #首先用raise_for_status处理异常:若请求不成功,抛出异常19 def getText(url):20 ????????source = requests.get(url)21 ????????source.raise_for_status()22 ????????source.encoding = source.apparent_encoding23 ????????return(source.text)24 25 #返回分类名(keys)及对应链接(value)的字典26 #dictinfo = {name1list:html1list}27 #例如:动画:www.bilibili.donghua.com,........28 def getfirsttitle(source):29 ????text = re.findall(r‘a class.*?div class‘,source)30 ????namelist = []31 ????htmllist = []32 ????dictinfo = {}33 ????for i in text:34 ????????namelist.append(i.split("><em>")[1].split("</em>")[0])35 ????????htmllist.append(i.split(‘href="//‘)[1].split(‘"><em>‘)[0])36 ????for i in range(len(namelist) - 1):37 ????????dictinfo[namelist[i]] = htmllist[i]38 ????return dictinfo39 40 #返回二级分类的keys(分类名)和values(对应链接)的字典41 #dict2info = {name2list:html2list}42 def getsecondtitle(source):43 ????text2 = re.findall(r‘a href.*?<em></em></b></a></li>‘,source)44 ????name2list = []45 ????html2list = []46 ????dict2info = {}47 ????for i in text2:48 ????????name2list.append(i.split(‘><b>‘)[1].split(‘<em>‘)[0])49 ????????html2list.append(i.split(‘a href="//‘)[1].split(‘"><b>‘)[0])50 ????for i in range(len(name2list) - 1):51 ????????dict2info[name2list[i]] = html2list[i]52 ????return dict2info53 54 #获得一级分类和二级分类的分类名的字典55 #dict3info = {name1list:[name2list]}56 def getfirst2second(source):57 ????text3 = re.findall(r‘"m-i".*?</ul‘,source,re.S)58 ????dict3info = {}59 ????middletitle = []60 ????for i in text3:61 ????????#获得出各个一级标题62 ????????title = i.split(‘><b>‘)[0].split(‘</em>‘)[0].split(‘<em>‘)[1]63 ????????#获得各一级标题的子标题64 ????????childtitle = i.split(‘><b>‘)65 ????????dict3info[title] = childtitle66 ????????for j in range(len(childtitle) - 1):67 ????????????childtitle[j] = childtitle[j + 1]68 ????????#处理冗余69 ????????childtitle.pop()70 ????????for k in childtitle:71 ????????????middletitle.append(k.split(‘<em>‘)[0])72 ????????#每处理完一个title的childtitle,就执行存储语句73 ????????dict3info[title] = middletitle74 ????????#初始化传递列表75 ????????middletitle = []76 ????return dict3info77 78 79 #——————————————————————————————————————————————
80 ##导入字典{二级分类名:urls2}计划使用urllib库81 ‘‘‘82 url为dict_2_url2字典里面的url283 本文本块目的在于获取二级分类页面的源视频链接和视频名称84 并生成最终可调用字典{source_name:source_url}85 86 url = dict_2_urls.values()87 ‘‘‘88 89 def gettext(url):90 ????source = requests.get(url)91 ????source.raise_for_status()92 ????source.encoding = source.apparent_encoding93 ????return source.text94 95 def download(source):96 ????text = re.findall(r‘<video> src="blob:.*?"></video>‘,source)97 ????html = text.split(‘<video> src="‘)[1].split(‘"></video>‘)[0]98 ????pass
这是今两天瞎鼓捣弄出来的代码,函数名、变量名的定义存在问题。
最开始利用requests.get(url)获得文本之后,不明白为什么需要text._raise_for_status()这一句代码,后来明白这个是为了处理向url发出response请求时的异常处理,具体是什么处理不太明白。
其中,text.encoding = text.apparent.encoding的实现原理也没有深究,需要慢慢积累。
requests作为一个第三方库,提供的是一种便利的功能,但是学习这几天之后,我发现这个并不太适合初学者,深层次的才是基础的,所以我觉得需要好好了解一下urllib这个模块。
之后,我准备尝试使用urllib模块对下载下来的文本进行处理,urlretrieve函数,urllib.request.urlopen函数等.
还遇见一个问题,当我准备利用字典里面的视频链接下载b站的视频时,会显示如下结果:
b‘\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xc5}{\x93\x1bE\xb2\xef\xdf8\xe2|\x87^\xb1\xc1\x8c\x03\xeb9\x9a\x97\xf1\x0c\x07\x0c\xdcC\x1cX\xd8\xc5
我的源码是:
1 import urllib.request2 import urllib.parse3 4 def gettext(url):5 ????source = urllib.request.urlopen(url,timeout=30)6 ????return source.read()7 url = ‘https://www.bilibili.com/video/av11138658/‘8 text = gettext(url)9 print(text)
百思不得其解,最后我把原因归结为B站视频有做过加密处理,入门不足一个月的小白还没有能力解决这个问题~~~
B站标题/子标题/url爬取示例(requests+re)
原文地址:http://www.cnblogs.com/elderjiang/p/7604137.html