实践项目————诗词名句网《三国演义》小说爬取

import os
import re
import time
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup def header():
# 三国演义网址
article_url = "http://www.shicimingju.com/book/sanguoyanyi.html"
# 模拟浏览器创建请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36"}
# 创建请求对象
request = urllib.request.Request(article_url,headers=headers)
return request # 发送请求
def main(request):
# 创建管理器对象对象
handler = urllib.request.HTTPHandler()
# 使用管理器对象构建请求对象
opener = urllib.request.build_opener( handler )
# 使用opener进行获取响应
response = opener.open( request )
return response # 下载内容
def download():
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36"}
request = header()
response = main(request).read()
# 使用bs4对html进行解析
article_main_html = BeautifulSoup(response,"lxml")
if not os.path.exists("三国演义"):
os.mkdir("三国演义")
# 获取书名
# article_name =article_main_html.select(".book-header h1").text
# 获取书名详解
# article_details =article_main_html.select(".book-summary p").text
# 获取章节链接
article_section = article_main_html.select(".book-mulu ul li a")
section_title_ls = []
section_url_ls = []
# 将章节和章节链接有序存入列表中
for section in article_section:
section_title_ls.append(section.text)
section_url_ls.append(section["href"]) # 分章节爬取章节内容
for num in range(0,120):
# 同时取出章节名和章节url进行请求数据
section_title = section_title_ls[num]
section_url = section_url_ls[num]
# 拼接完整的章节url
section_allurl = "http://www.shicimingju.com"+section_url
section_request = urllib.request.Request(section_allurl,headers=headers )
handler = urllib.request.HTTPHandler
opener =urllib.request.build_opener(handler)
# 请求章节数据
section_response = opener.open(section_request).read().decode("utf8")
# 使用bs4对html进行解析
article_soup =BeautifulSoup(section_response,"lxml")
article_content = article_soup.select(".chapter_content")
# 构建章节名并和文章组合
content = section_title+article_content[0].text
# 创建存储文件名
filename ="三国演义"+".doc"
print("正在下载第%d章"%num)
# 将下载的数据写入文件中
filename_path = os.path.join("三国演义",filename)
with open(filename_path,"ab+") as tf:
tf.write(content.encode("utf8"))
tf.close()
# 防止暴力请求
time.sleep(2) if __name__ == '__main__':
download()
 

百度音乐爬取案例

import os
import re
import time
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import json # 面向对象爬取数据
class BaiDuMusic( object ): # 初始化输入参数
def __init__(self, singer, page):
self.singer = singer
self.page = page
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36"} # 构建请求头信息
def header(self):
url = "http://music.taihe.com/search/song?"
data = {
"s": "1",
"key": self.singer,
"jump": "0",
"start": (self.page - 1) * 20,
"size": "20",
"third_type": "0",
}
# 解析参数
data = urllib.parse.urlencode( data )
singer_url = url + data
# 创建请求头
request = urllib.request.Request( url=singer_url, headers=self.headers )
return request # 创建管理器对象,请求数据
def requset(self):
request = self.header()
handler = urllib.request.HTTPHandler()
opener = urllib.request.build_opener( handler )
response = opener.open( request )
return response # bs4解析数据
def paserSong(self):
response = self.requset()
singer_soup = BeautifulSoup( response, "lxml" )
pattern=re.compile(r'[\d]+')
# bs4匹配目标标签<li>
songs_info =singer_soup.find_all(name="li", attrs={"data-albumid":pattern})
# 获取<li>标签中的”data-songitem“属性,并将属性值转成json格式
song_ls =[json.loads(li["data-songitem"]) for li in songs_info]
song_info=[(song_info["songItem"]["sname"],song_info["songItem"]["sid"]) for song_info in song_ls]
# print(song_info)
# 输出结果如下,获取歌曲id
# """[('只要平凡', 598740690), ('My Sunshine', 127018924), ('听', 123192697), ('微笑着胜利(庆祝建军91周年网宣主题曲)', 601622060), ('Lost In The Stars', 268791350), ('Everything Will Say Goodbye', 285312563), ('《星辰》——电视剧《择天记》片头曲', 609686640), ('听', 123206622), ('Give You My World', 277779153), ('微笑着胜利(庆祝建军91周年网宣主题曲)(伴奏)', 601622061), ('My Sunshine', 131096021), ('三生三世', 537883379), ('着魔', 53603708), ('三生三世', 537883380), ('Torches', 541943830), ('浩瀚', 124796979), ('逆战', 14944589), ('剑心', 121223583), ('天下', 1103789), ('燕归巢', 136982116)]"""
return song_info
def downloadSong(self):
if not os.path.exists('music'):
os.mkdir('music')
song_info =self.paserSong()
for song_detail in song_info:
song_info_id=song_detail[1]
song_info_name=song_detail[0]
print("正在下载第%s页的:%s的《%s》"%(self.page,self.singer,song_info_name))
# 通过该API接口获取歌曲信息的json格式数据
song_url ='http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.song.play&format=jsonp&callback=jQuery17202741599001012014_1513517333931&songid=%s&_=1513517334915'%song_info_id
# 获取请求
request_song_detail =urllib.request.urlopen(song_url)
# 解析json歌曲数据
pattern_song =re.compile(r'\((.*)\)',re.S)
json_song_info=pattern_song.findall(request_song_detail.read().decode("utf8"))
# 将字符串数据转化成json数据,便于提取下载路径
lrclink=json.loads(json_song_info[0])["songinfo"]["lrclink"]
file_link =json.loads(json_song_info[0])["bitrate"]["file_link"]
# 创建文件格式保存文件
filename_music=song_info_name+"_%s.mp3"%self.singer
filename_lrc =song_info_name+"_%s.lrc"%self.singer
song_path = os.path.join("music",filename_music)
lrc_path = os.path.join("music",filename_lrc)
try:
# 下载歌曲和歌词数据
urllib.request.urlretrieve(lrclink,lrc_path)
urllib.request.urlretrieve( file_link, song_path )
time.sleep(1)
print("《%s》下载完成"%song_info_name)
except Exception as e:
print("因版权受限无法下载") # 录入爬取信息
def main():
singer = input( "请输入爬取的歌手或是歌名:" )
start_page = int( input( "请输入爬取的开始页:" ) )
end_page = int( input( "请输入爬取的终止页:" ) )
for page in range( start_page, end_page + 1 ):
baidumusic = BaiDuMusic( singer, page )
if page>end_page+1:
print("%s歌手的所有歌曲都已下载完毕"%singer)
baidumusic.downloadSong() # 运行
if __name__ == '__main__':
main()

爬虫学习(十二)——bs4实践案例的更多相关文章

  1. Python爬虫学习:二、爬虫的初步尝试

    我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...

  2. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  3. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  4. 爬虫系列(十二) selenium的基本使用

    一.selenium 简介 随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载 对于爬取这些网站,一般有两种思路: 分析 Ajax 请 ...

  5. 爬虫学习(二)--爬取360应用市场app信息

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 代码环境:windows10, python 3.5 ...

  6. 软件设计师【软件工程:软件开发模型、XP极限编程十二最佳实践】

    一.软件开发模型 二.XP极限编程十二最佳实践

  7. Scala学习十二——高阶函数

    一.本章要点 在Scala中函数是”头等公民“(可以作为参数,返回值,赋值给其他); 可以创建匿名函数,通常还会交给其他函数; 函数参数可以给出需要稍后执行的行为; 许多集合方法都接受函数参数,将函数 ...

  8. 【Hadoop学习之十二】MapReduce案例分析四-TF-IDF

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 概念TF-IDF(term fre ...

  9. JVM学习十二:JVM之性能监控工具

    前面我们学习了很多JVM相关的理论知识,那么本节将重点讲述的是工具的使用,正所谓:工欲善其事,必先利其器.因此,本节介绍常用的性能监控工具,用于性能监控和问题排查. 一.系统性能监控 系统性能工具用于 ...

随机推荐

  1. Object.create 以及 Object.setPrototypeOf

    第一部分 Object.crate() 方法是es5中的关于原型的方法, 这个方法会使用指定的原型对象以及属性去创建一个新的对象. 语法 Object.create(proto, [ properti ...

  2. 使用mongoosejs链接Mongodb

    以前只是了解Nodejs 这回打算好好学学.学到熟练使用的程度 var options={ user:'test_user', pass:'123456' }; mongoose.connect('m ...

  3. Day7上

    T1 部分分 枚举某个数 100 离散化.或 map 相对了不知道呢过不能过. T2 逆序对,不知对不对 归并排序,

  4. MySQL连接服务端的几种方式

    一.MySQL 连接本地数据库,用户名为“root”,密码“123456”: D:\>mysql -h localhost -u root -p123456 注意:“-p”和“123456” 之 ...

  5. SASS简介及使用方法

    一.什么是Sass Sass (Syntactically Awesome StyleSheets)是css的一个扩展开发工具,它允许你使用变量.条件语句等,使开发更简单可维护.这里是官方文档. 二. ...

  6. 使用js来执行全屏

    当用户按下F11事件,浏览器为触发自身全屏功能,这个过程我们一般是不可控制的,即使是监听了F11的键盘事件,退出全屏的时候,我们也捕捉不到退出全屏触发的事件.所以,我们就用程序自己去实现F11的功能, ...

  7. sublime介绍常用插件和快捷键

    简介 Sublime Text是由程序员Jon Skinner于2008年1月份所开发出来的,它最初被设计为一个具有丰富扩展功能的Vim. 是一个跨平台的编辑器,同时支持Windows.Linux.M ...

  8. 开发中常用的sql语句二

    sql 数字全角半角转换 create FUNCTION dbo.ConvertWordAngle ( ), --要转换的字符串 @flag bit --转换标志,0转换成半角,1转换成全角 )) A ...

  9. polyfill 一个解决兼容的绝佳方案

    polyfill为何物 Polyfill你可以理解为“腻子”,就是装修的时候,可以把缺损的地方填充抹平. 举个例子,html5的storage(session,local), 不同浏览器,不同版本,有 ...

  10. webstrom使用

    主题 主题下载:http://color-themes.com/?view=index&page=1&order=popular&search=&layout=HTML ...