目标网站:http://www.htqyy.com/top/hot
目标数据:爬取音乐网站中列表第前5页歌曲名称和音乐家的名字。
第一步:初始化项目
先在桌面创建一个文件夹,用于存放项目文件。
文件夹创建完成后,打开文件夹,在文件夹内打开控制台(快捷键Shift + 鼠标右键-->在此处打开命令窗口),在控制台输入下面命令:
scrapy startproject myspider
scrapy startproject 是固定的,后面的myspider是项目名称,可以自己命名。
命令执行完成后,在刚才新建的文件夹内会生成一个新的文件夹,文件夹的名字就是刚才输入的项目名称。
目录结构是这样的:
打开第一个文件夹,看到里面的目录结构是这样的:
第二步:创建模板文件
接下来创建爬虫的模板文件,用于爬取目标页面数据。创建方式还是在控制台执行命令行,这里需要在下面的文件夹内执行命令行:
scrapy genspider musicSpider htqyy.com
scrapy genspider 表示创建一个模板文件,musicSpider 是创建的模板的名称,不能和项目名称相同, htqyy.com是目标页面的地址。
关于这个命令的详细解读,可以参考 https://www.cnblogs.com/php-linux/p/11039743.html
命令执行完成,会在项目文件夹中生成文件名称为musicSpider.py的文件。
第三步:爬取网页内容并清洗。
到目前为止,都是在生成项目文件,接下来就要写相关代码,爬取网页内容。
编辑第二步生成的musicSpider.py文件,代码如下:
import scrapy
import re
from mySpider.items import MyspiderItem
class MusicspiderSpider(scrapy.Spider):
name = 'musicSpider' #爬虫识别名称
allowed_domains = ['htqyy.com'] #爬取网页范围
start_urls = ['http://www.htqyy.com/top/musicList/hot?pageIndex=0&pageSize=20'] #爬取页面地址
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
'Content-Length': '0',
"Connection": "keep-alive",
"Referer":"http://www.htqyy.com/top/hot"
}
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, headers=self.headers ,callback=self.parse)
def parse(self, response):
data=response.body.decode() #获取相应内容
titles=re.findall(r'title="(.*?)" sid',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
#1.获取当前请求的url,提取出页面信息
beforeUrl=response.url
pat1=r"pageIndex=(\d)"
page=re.search(pat1,beforeUrl).group(1)
page=int(page)+1 #得到下一次请求的pageIndex信息
#2.构造下一页的url,发送下一次请求
if page<5:
#构造下一页url
nextUrl="http://www.htqyy.com/top/musicList/hot?pageIndex="+str(page)+"&pageSize=20"
#发送下一次请求
yield scrapy.Request(nextUrl,callback=self.parse)
还需要编辑items.py文件:
代码如下:
import scrapy
class MyspiderItem(scrapy.Item):
title = scrapy.Field()
artist = scrapy.Field()
这里定义的两个字段,分别表示歌曲的名称和艺术家的名字。
编辑管道文件pipelines.py,管道文件负责将爬取到的数据保存到本地。
代码如下:
from itemadapter import ItemAdapter
#管道,负责item后期的处理或保存
class MyspiderPipeline:
#定义初始化参数(可以省略)
def __init__(self):
self.file=open("music.txt","a")
#管道每次接受到的item后执行的方法(必须实现)
def process_item(self, item, spider):
content=str(item)+"\n"
self.file.write(content) #写入数据到本地
return item
#当爬虫结束时执行的方法(可以省略)
def close_spider(self,spider):
self.spider.close()
最后设置一下管道的优先级别:
在settings.py文件中,将这三行代码释放开
编辑完成,保存文件,然后运行项目。运行的方式是在控制台窗口输入命令行,这里和第二步一样,在文件夹中执行命令行:
scrapy crawl musicSpider
scrapy crawl 是固定的写法,表示运行项目,musicSpider是第二步中创建的模板的名字。
命令执行完,如下所示,会新增一个txt文件。
文件内容就是目标数据,打开后如下:
到此为止,已经成功获取到了目标数据。
最后总结一下整个步骤:
1.初始化项目文件
2.生成模板文件
3.编写爬虫代码