背景:因为业务需要,要爬取一些经典的流行歌曲,以前接触过爬虫这次正好应用下。先回顾下:
爬虫会用到的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 #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.com/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.com/tag
如下所示:
如图所示要获取红色圈住的url,在网页中获取的selector地址为:"dd.tag-items > span"
但是在代码中却怎么也获取不到数据,后来将获取的页面
requests.get(url, headers=headers).text
打印出看了一下,发现获取到的数据样式跟html的页面上并不一样,所以才获取不到,要以获取到的页面为主。