scrapy学习笔记(四)
实际任务千差万别,因此需对症下药。
这篇讲一个自己爬虫的简单实际应用。
A任务:scrapy爬取panda.tv的dota板块数据并输出文本出结果
新建工程:
> scrapy startproject pandatv
> cd pandatv
> scrapy genspider pandatv_spider
分析网页任务:
可以看到每个room的信息都包含在这个li标签内。
图一 网页结构分析再一步分析可以看到我们需要爬取的主要信息来源于属性为“video-info”的子标签:
图二 爬取内容细节结构分析然后就可以开始着手写爬虫了。
开始编辑pandatv_spider.py:
# -*- coding: utf-8 -*-
import scrapy
class PandatvSpiderSpider(scrapy.Spider):
name = 'pandatv_spider'
start_urls = ['https://www.panda.tv/cate/dota1?pdt=1.24.s1.15.7goptbe4fpt']
def parse(self, response):
print(response)
lis = response.xpath('//li[contains(@class,"video-list-item video-no-tag video-no-cate ")]')
room_id_lis = lis.xpath('@data-id').extract()
num = lis.xpath('a/div[2]/span[3]/text()').extract()
level = lis.xpath('a/div[2]/span[2]/i/@data-level').extract()
f = open("out.txt","w")
for i,j,k in zip(room_id_lis,num,level):
i=i.encode('utf-8')
j=j.encode('utf-8')
k=k.encode('utf-8')
print(i,":",j,":",k)
print >> f, "%s %s %s" % (i,j,k)
f.close()
这样不仅可以在powershell中直接观察到爬取效果,响应(200)有数值列表打印出来,并且在工作目录中出现了数据文件out.txt并包含我们想要的结果。
注意到最开始写的时候打印的字符为Unicode编码难以辨识,随后加入了语句data.encode('utf-8')打印出来的结果就舒服多了。
还有f句柄open函数>>写入print值的做法以及f.close()关闭写入的语法,都值得学习。
另外值得学习的是python内置函数zip,其任务是将几个变量的值组合成一个列表。