码迷,mamicode.com
首页 > Web开发 > 详细

B站标题/子标题/url爬取示例(requests+re)

时间:2017-09-27 22:31:07      阅读:664      评论:0      收藏:0      [点我收藏+]

标签:utf-8   blog   页面   inf   动画   com   没有   dal   bilibili   

 #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_encoding 23 return(source.text) 24 25 #返回分类名(keys)及对应链接(value)的字典 26 #dictinfo = {name1list:html1list} 27 #例如:动画:www.bilibili.donghua.com,........ 28 def getfirsttitle(source): 29 text = re.findall(ra 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 dictinfo 39 40 #返回二级分类的keys(分类名)和values(对应链接)的字典 41 #dict2info = {name2list:html2list} 42 def getsecondtitle(source): 43 text2 = re.findall(ra 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 dict2info 53 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] = childtitle 66 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] = middletitle 74 #初始化传递列表 75 middletitle = [] 76 return dict3info 77 78 79 #——————————————————————————————————————————————
80 ##导入字典{二级分类名:urls2}计划使用urllib库 81 ‘‘‘ 82 url为dict_2_url2字典里面的url2 83 本文本块目的在于获取二级分类页面的源视频链接和视频名称 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_encoding 93 return source.text 94 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.request
2 import urllib.parse
3 
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)

标签:utf-8   blog   页面   inf   动画   com   没有   dal   bilibili   

原文地址:http://www.cnblogs.com/elderjiang/p/7604137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!