- 之前的框架只能爬取一页内容,现在我们用scrapy实现多页爬取的效果。
- 首先分析网页的构造规律
- 第一页:http://www.htqyy.com/top/musicList/hot?pageIndex=0&pageSize=20
- 第二页:http://www.htqyy.com/top/musicList/hot?pageIndex=1&pageSize=20
- 第三页:http://www.htqyy.com/top/musicList/hot?pageIndex=2&pageSize=20
- 可以看出pageindex=0,1,2的规律
musicspider.py
import scrapy
import re
from myspider.items import MyspiderItem
class MusicspiderSpider(scrapy.Spider):
name = 'musicspider'#爬虫识别名称
allowed_domains = ['www.htqyy.com']#爬虫能够爬取的网址范围
start_urls = ['http://www.htqyy.com/top/musicList/hot?pageIndex=0&pageSize=20']#爬取的起始url
def parse(self, response):
# filename='music.html'
data= response.body.decode()#获取响应内容
# open(filename,'wb').write(data)#写入本地,请求的动作被框架完成
items=[]# 存放音乐信息的列表
titles = re.findall(r'target="play" title="(.*?)"',data)#获取所有歌曲名
artists = re.findall(r'target="_blank">(.*?)</a>', data)#获取所有艺术家
for i in range(0,len(titles)):
item=MyspiderItem()
item["title"]=titles[i]
item["artist"] = artists[i]
yield item
#获取当前请求的url,提取页码信息
beforeurl=response.url
pat1=r"pageIndex=(\d)"
page=re.search(pat1,beforeurl).group(1)
page=int(page)+1#获取下一页请求的page信息
if page < 5:
#构造下一页的url,发送下次请求
nexturl='http://www.htqyy.com/top/musicList/hot?pageIndex='+str(page)+'&pageSize=20'
#在parse方法中发送请求,请求完成后调用parse方法。
yield scrapy.Request(nexturl,callback=self.parse)
在黑屏终端中输入scrapy crawl musicspider
网友评论