爬虫还是不会写,所以借鉴一个,仔细分析分析:https://blog.csdn.net/only_anan/article/details/80082316
1,导入爬取要用到的库,主要是是BeautifulSoup库很有用
import re
import urllib.request
from bs4 import BeautifulSoup
2,利用BeautifulSoup库获取网址
用到的基本知识:
1,方法选择器:find_all()
#功能:得到符合条件的所有元素
API如下:
find_all(name,attrs,recursive,text,**kwargs)
(1),name
根据节点名来查询元素,
例:find_all(name='ul')#查询所有的ul节点
(2),attrs
根据插入的属性查询
例:find_all(attrs={'name':'elements'})#查询节点名为name,其属性为elements的所有元素
find_all(attrs={'id':'list-1'})#查询节点名为id,其属性为list-1的所有元素
(3),text
text参数可用来匹配节点的文本,传入的形式:字符串||正则表达式对象
格式:find_all(text=re.compile('link'))||find_all(text='string')
结果 返回所有匹配正则表达式的结点文本组成的列表
例:<ul>string_string</ul>
string_string 即为节点的文本
2,get()方法
获取某个属性的值:
1,如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么
print soup.p['class']
#['title']
2,利用get方法,传入属性的名称,
print soup.p.get('class')
#['title']
补充:1,属性的内容可以更改.
soup.p['class']="newClass"
print soup.p
#<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
2,可以将属性删除
del soup.p['class']
print soup.p
#<p name="dromouse"><b>The Dormouse's story</b></p>
3,获取网址:
<ul id="menu-list">#顾名思义,菜单列表,本页面所有的美剧纸牌屋第四季链接都是其子节点
<li> 相当于 "每一个美剧纸牌屋第四季"
<h2> 相当于 "标题"
最后正则表达式提取
'''获取网址'''
def get_url(url):
Url = []
#url = 'http://www.kekenet.com/video/16692/'
f = urllib.request.urlopen(url)
html = f.read()
soup = BeautifulSoup(html,'html.parser')
content = soup.find_all('ul',id='menu-list')
for tag in content:
li = tag.find_all('li') #类型<class 'bs4.element.ResultSet'>
#print(type(li))
for tag2 in li:
h = tag2.find_all('h2')
for tag3 in h:
h1 = tag3.find_all('a',text=re.compile(r'MP3+')) # re.compile() 正则表达匹配,匹配内容不能为中文
for tag4 in h1:
t = tag4.get_text() #获取内容
get_url = tag4.get('href') #获取URL
Url.append(str(get_url))
Url = reversed(Url) #将列表中的所有元素进行倒序排列
return (list(Url)) #必须添加list,将其转换为list
#print(list(Url))
4,获取网页内容:
'''获取网页中的内容'''
url1 = []
base_url = 'http://www.kekenet.com/video/15830/List_'
for i in range(18):
full_url = base_url + str(i+1) +'.shtml'
url1.append(full_url)
url1.append('http://www.kekenet.com/video/15830/')
# print(url1)
# print(len(url1))
这个网址如何得到?
http://www.kekenet.com/video/15830/List_
很简单:因为字幕存储在这个网页之下(可以点开看一下,直接跳转)
5,保存文本
要爬取字幕首先要找到字幕
n = 0
for i in range (len(url1)):
url = url1[i]
Get_Url = get_url(url)
for i in range(len(Get_Url)):
f = urllib.request.urlopen(Get_Url[i])
html = f.read()
soup = BeautifulSoup(html,'html.parser') #解析抓取到到html
title = soup.title.get_text() #获取html的title
en_contents = soup.find_all('div',class_='qh_en')
zg_contents = soup.find_all('div',class_='qh_zg')
file = 'M_S6.txt'
with open(file,'a') as f: #追加的方式写入文件
f.write(title)
n = n+1
for content in zip(en_contents,zg_contents): #同时输出两个列表中的元素,先将其转化为元组
f.write(content[0].get_text()) #输出元组中的第一个元素,即第一个列表中的第一个元素
f.write(content[1].get_text()) #输出元组中的第2个元素,即第2个列表中的第1个元素
f.write('\n') #换行
#break
print(n)