最近学习吉他,一张一张保存吉他谱太麻烦,写个小程序下载吉他谱。

安装 BeautifulSoup,BeautifulSoup是一个解析HTML的库。
pip install BeautifulSoup4

在这个程序中 BeautifulSoup 使用 html5lib 所以还要安装 html5lib
pip install html5lib

代码如下:

# -*- coding: utf-8 -*-
#coding=UTF8 import os
import sys
import logging
import urllib
import urllib2
import chardet
import re
import cookielib
import urlparse from bs4 import BeautifulSoup sysEncoding = sys.getfilesystemencoding()
cookieJar = cookielib.CookieJar() def get(url): req = urllib2.Request(url) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
response = opener.open(req) return response.read() def download_guitar_image(url, target): print 'start download guitar image ...' req = urllib2.Request(url)
req.add_header('Accept','image/webp,image/*,*/*;q=0.8') opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
response = opener.open(req) content = response.read() with open(target, 'wb') as code:
code.write(content) #解析吉他谱图片页面链接地址
def parse_guitar_img_link(): page_list = [] url_base = 'http://www.17jita.com/' page = 1
while True: url = url_base + 'tab/img/index.php?page=' + str(page) print url html = get(url) soup = BeautifulSoup(html, "html5lib") list = soup.select('#ct dl > dt > a') if not list:
break for item in list:
page_list.append({ 'title' : item.text, 'link' : url_base + item['href'] }) page += 1 return page_list def download_guitar_image_link_list(url): image_link_list = [] page = 1 while True: page_url = url if page > 1:
page_url = url.replace('.html', '' + str(page) + '.html') try: html = get(page_url) soup = BeautifulSoup(html, 'html5lib') img_list = soup.select('#article_contents a > img') for img in img_list:
image_link_list.append(img['src']) except urllib2.URLError, e:
msg = u'下载 ' + page_url + u' 出错, 原因: ' + e.reason
print msg
logging.error(msg)
break page += 1 return image_link_list if __name__ == '__main__': logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename='guitar.log',
filemode='a') path = 'guitar'
if not os.path.exists(path):
os.mkdir(path) page_list = parse_guitar_img_link()
for page in page_list: print page['link'] + '(' + page['title'] + ')' guitar_path = path + '/' + (page['title']).encode('GBK')
if not os.path.exists(guitar_path):
os.mkdir(guitar_path) image_link_list = download_guitar_image_link_list(page['link'])
for image_link in image_link_list: print '\t' + image_link filename = image_link[image_link.rindex('/'):] filepath = guitar_path + filename.encode('GBK') download_guitar_image(image_link, filepath)

程序中还存在一些问题尚优化,比如下载中断,不能下载剩下的吉他谱。

Python爬取17吉他网吉他谱的更多相关文章

  1. Python爬取中国天气网

    Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...

  2. (python爬取小故事网并写入mysql)

    前言: 这是一篇来自整理EVERNOTE的笔记所产生的小博客,实现功能主要为用广度优先算法爬取小故事网,爬满100个链接并写入mysql,虽然CS作为双学位已经修习了三年多了,但不仅理论知识一般,动手 ...

  3. python爬取天气后报网

    前言 大二下学期的大数据技术导论课上由于需要获取数据进行分析,我决定学习python爬虫来获取数据.由于对于数据需求量相对较大,我最终选择爬取 天气后报网,该网站可以查询到全国各地多年的数据,而且相对 ...

  4. Python 爬取煎蛋网妹子图片

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-24 10:17:28 # @Author : EnderZhou (z ...

  5. Python爬取中国票房网所有电影片名和演员名字,爬取齐鲁网大陆所有电视剧名称

    爬取CBO中国票房网所有电影片名和演员名字 # -*- coding: utf-8 -*- # 爬取CBO中国票房网所有电影片名 import json import requests import ...

  6. python爬取斗图网中的 “最新套图”和“最新表情”

    1.分析斗图网 斗图网地址:http://www.doutula.com 网站的顶部有这两个部分: 先分析“最新套图” 发现地址栏变成了这个链接,我们在点击第二页 可见,每一页的地址栏只有后面的pag ...

  7. 适合初学者的Python爬取链家网教程

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TinaLY PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  8. python爬取中国知网部分论文信息

    爬取指定主题的论文,并以相关度排序. #!/usr/bin/python3 # -*- coding: utf-8 -*- import requests import linecache impor ...

  9. python爬取千库网

    url:https://i588ku.com/beijing/0-0-default-0-8-0-0-0-0-1/ 有水印 但是点进去就没了 这里先来测试是否有反爬虫 import requests ...

随机推荐

  1. 基于ArcGIS的栅格图像平滑处理(转)

    基于ArcGIS的栅格图像平滑处理 栅格数据获取的途径多种多样,造成了栅格数据质量的很大差异,一些质量较差的栅格数据存在大量“噪音”象元,即在表达同类型的地理要素时,出现个别像元值与周边像元不一致的情 ...

  2. 反射机制及开源框架xUitls的使用,使用HttpUtils通过断点续传下载文件

    反射: Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性 Java反射机制主要提供下面几种用途: 1•在运行时判断 ...

  3. 如何让PHP支持Redis

    原理:php默认扩展库不含有redis扩展:要支持redis扩展,需要有redis.so这个扩展文件 所以我们的目标就是生成redis.so扩展文件,并修改php.ini 让其支持redis扩展. 准 ...

  4. php使用mysql_query查询超大结果集超内存的解决方法

    再使用mysql_query查询超大结果集的时候会出现超出内存限制的致命错误,这是因为mysql_query采用的是查询全部结果然后把结果集全部缓存到内存中的方式. mysql的查询还提供了另外一种查 ...

  5. jquery checkbox的判断和设置方法

    jquery的操作复选框偶尔能用到,每次都是百度去查,不得不说现在百度的搜索真的很垃圾,好多特别老的文章都排在前面,想要甄别出有用的东西挺费劲.脑子又记不住这么多东西,好记性不如烂笔头,还是记下来吧 ...

  6. nc命令用法举例

    什么是nc nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具 nc的作用 (1)实现任意TCP/UDP端口的侦听,nc可以作为server ...

  7. hihocoder 1186

    1186 : Coordinates 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Give you two integers P and Q. Let all div ...

  8. 【Objective-C】0-第一个OC的类

    OC是一门面向对象的语言,因此它也有类.对象.静态\动态方法.成员变量的概念.这讲就来创建第一个OC的类. 一.语法简介 1.类 在Java中,我们用1个.java文件就可以描述清楚一个类:在OC中, ...

  9. c#检测端口是否被占用的简单实例

    c#检测端口是否被占用的简单实例. 当我们要创建一个Tcp/Ip Server connection ,我们需要一个范围在1000到65535之间的端口 . 但是本机一个端口只能一个程序监听,所以我们 ...

  10. 【Oracle&SQLServer】并集、交际、补集

    1.并集(UNION/UNION ALL) Oracle&SQLServer中用法一致 UNION 去重 UNION ALL 不去重 -- 去重 select * from tablea un ...