背景:因为业务需要,要爬取一些经典的流行歌曲,以前接触过爬虫这次正好应用下。先回顾下:

爬虫会用到的Python库:requests库、htmlparser库、BS4库。

1,爬虫的小知识

requests库:get方法:r=requests.get(url);

这样得到的r可以用如下的函数得到其中的信息:包含url,status_code,headers,encoding以及text、json
r.json 将爬取下来的json数据存储成字典格式

在爬取图片时,可以先用“Image”库对数据进行转换:Image.open(BytesIO(r.context)),然后再保存起来image.save("name.jpg")
 

对于爬虫的时候中文乱码问题,先查看下源网页是什么编码(在ie中可以通过“源码”看到)以及当前r是什么类型(r.encoding会显示文件的类型);然后将内容编码成源文件的类型:b=r.text.encode("iso-8859"),最后再编码成源文件的类型:b.decode('gbk')
encode:str-->bytes;decode:bytes-->str

2,解析数据

windows很好的查看源代码的工具fiddler;mac上是charles--付费
对数据的解析:XML/JSON解析:DOM容易理解,先读入内存再解析,解析慢;SAX,边读边解析,代码难理解

对于html的解析的话有css定位器和xpath两种,css定位器比xpath更好写,适合初学者。

主要讲一下用css定位器解析html页面,以百度的首页为例:

一般来说css中的id都是唯一的,如果怕不保险可以再加上id前面的名字如<input type="submit" id="su" value="百度一下" class="bg_s_btn">
可以加上:input #su
如果是class使用"."来定位。
其下级通过">"来定位:span.bg> input#su;表示span的bg中class下的input的id为"su"的部分。
便签直接写,如span、input、html
属性用"[]",如:html[lang=zh-cn]

静态网页解析:有htmlparser库、BS4库两个方法。
htmlparser库,类SAX模式网页解析,需要实现一大堆的函数。
BS4库:find函数搜索使用、使用css定位器搜索 
bs.select("...")和bs.find("...")都比较好用

3,对qiqiyinyue的爬虫

歌曲下载的地址如下:http://music.taihe/tag/%E7%BB%8F%E5%85%B8%E8%80%81%E6%AD%8C

页面如下所示:

想法是通过绿色圆圈的“下一页”按钮,来获取下一页的页面,爬取页面上的歌曲信息。

核心代码如下所示:

# parse_url函数解析歌曲数据,并返回下一页的url
def parse_url(self,url):
    # headers 模拟人的请求
    headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
    html = requests.get(url, headers=headers).text
    # 查看文件的编码
    #print(requests.get(url, headers=headers).encoding)
    # 将文件转换成源文件本来的编码样式,并使用"html.parser"解析器来解析
    soup = BeautifulSoup(html.encode('ISO-8859-1').decode('utf-8'),"html.parser")
    # 解析soup中的歌曲名
    for item in  soup.select("span.song-title > a"):
        song_name = item.text
        if len(song_name)==0:
            continue
        else:
            self.songname_list.append(song_name)
    # 获取下一页的url,如果已经到达最后一页,就返回None
    next_content = soup.select("div.page-inner > a.page-navigator-next")
    # 如果没有下一页了
    if len(next_content) ==0 :
        print("finished page")
        return None

    next_url_tail = next_content[0].get('href').strip()
    next_url = self.qianqianurl + next_url_tail
    #print("next_url is :",next_url)
    return next_url

 

总结:1,用requests获取页面信息;

           2,用BeautifulSoup来解析获取到的数据;对数据转码、定位并获取数据信息

 

后记:后来有尝试获取其主页数据的url:http://music.taihe/tag

如下所示:

如图所示要获取红色圈住的url,在网页中获取的selector地址为:"dd.tag-items > span"

但是在代码中却怎么也获取不到数据,后来将获取的页面

requests.get(url, headers=headers).text

打印出看了一下,发现获取到的数据样式跟html的页面上并不一样,所以才获取不到,要以获取到的页面为主。

更多推荐

【Python】简单爬虫---爬取流行歌曲