需求
1、抓取虾米用户的精选集,及各精选集下的歌曲列表
2、将抓取到的数据存储至文件
思路
1、抓取页面内容
2、正则表达式匹配字符串,并返回匹配信息
3、遍历所有页面
具体实现
一、抓取页面内容
urllib2是接受url请求的模块。导入扩展包后,使用request()方法,给服务器发送Http请求。调用urlopen()方法打开url:
url = "http://www.xiami.com/space/collect/u/3735910/order/1/p/1/page/"
req = urllib2.Request(url)
respone = urllib2.urlopen(req)
运行程序后,服务器返回信息:
urllib2.HTTPError: HTTP Error 400: Bad Request
服务器拒绝访问,说明虾米服务器做了防止程序访问的措施,解决方法是:让服务器“以为”是浏览器在访问它--加入浏览器访问时的标志:User-Agent。我们在创建请求对象时,加入头数据。浏览器正常响应后,可抓取网页内容:
req = urllib2.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36')
respone = urllib2.urlopen(req)
mainpage = respone.read()
将服务器返回信息保存到文件中并打开,可以看到网页源代码(不要用记事本打开,可使用sublime等文本编辑器)。
二、正则表达式匹配字符串,并返回匹配信息
打印出抓取到的页面内容,或使用浏览器的查看网页源代码功能,可看到内容的实质是网页的源代码,其实也就是字符串。想要获取字符串中的精选集名称和歌曲名称,只要使用正则表达式进行匹配就好了。
<p class="cover"><span><a title="欧美流行" href="/collect/42347935"><img alt="欧美流行" src="http://img.xiami.net/res/img/default/cd100.gif"/></a></span></p>
提取精选集名称(“欧美流行”),精选集的id(42347935)等信息的匹配表达式
<p class="cover"><span><a title="(.+)"\s*href=