前言
熟悉Scrapy之后,本篇文章带大家爬取七麦数据(https://www.qimai.cn/rank )的ios appstore付费应用排行榜前100名应用。
爬取内容包括app在列表中的下标,app图标地址,app的名称信息,app的类型,在分类中的排行,开发者,详情等。
考虑的问题:
- Forbidden by robots.txt的错误
- 网页返回403
- 页面通过动态渲染,普通的请求url,在页面渲染之前已经返回response,解析没有数据
- 列表一页20个app,想要拿到前100个需要翻页,但是翻页没有更改url,而是通过js动态加载
- …
创建项目
在需要放置项目的目录下,
> scrapy startproject qimairank
回车即可创建默认的Scrapy项目架构。
创建Item
创建Item来存储我们爬取的app在列表中的下标,app图标地址,app的名称信息,app的类型,在分类中的排行,开发者,详情。
修改items.py
,在下面增加
class RankItem(scrapy.Item):
# 下标
index = scrapy.Field()
# 图标地址
src = scrapy.Field()
# app标题信息
title = scrapy.Field()
# app类型
type = scrapy.Field()
# 分类中的排行
type_rank = scrapy.Field()
# 开发者
company = scrapy.Field()
# 详情信息
info = scrapy.Field()
创建Spider
在spiders
目录下创建RankSpider.py
,并创建class RankSpider
,继承于scrapy.Spider。
import scrapy
class RankSpider(scrapy.Spider):
name = "RankSpider"
start_urls = ["https://www.qimai.cn/rank"]
def parse(self, response):
pass
name
:用于区别Spider,该名字必须是唯一的。start_urls
:Spider在启动时进行爬取的url列表,首先会爬取第一个。def parse(self, response)
:得到url的response信息后的解析方法。
解析付费榜
解析用的Selectors选择器有多种方法:
- xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
- css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.
- extract(): 序列化该节点为unicode字符串并返回list。
- re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。
下面我们用xpath()选择节点,xpath的语法可参考w3c的http://www.w3school.com.cn/xpath/xpath_nodes.asp 学习,需要熟悉语法、运算符、函数等。
def parse(self, response):
base = response.xpath(
"//div[@class='ivu-row rank-all-item']/div[@class='ivu-col ivu-col-span-8'][2]//ul/li[@class='child-item']/div[@class='ivu-row']")
for box in base:
# 创建实例
rankItem = RankItem()
# 下标
rankItem['index'] = \
box.xpath(".//div[@class='ivu-col ivu-col-span-3 left-item']/span/text()").extract()[0]
# 图标地址
rankItem['src'] = box.xpath(".//img/@src").extract()[0]
# app名称信息
rankItem['title'] = box.xpath(".//div[@class='info-content']//a/text()").extract()[0]
# app类型
rankItem['type'] = box.xpath(".//div[@class='info-content']//p[@class='small-txt']/text()").extract(