说明:CSS表达式不能取代XPath,CSS表达式比XPath简洁,但是功能不如XPath,大多作为XPath的辅助
红色箭头为我们获取的目标
主要代码:
第一个css表达式 [class='book-mid-info']:选中所有class为book-mid-info的元素
第二个css表达式 h4>a::text:选中h4标签的子元素a的文本内容
第三个和第四个css表达式 .author>a::text:选中class的值为author下,子元素a标签的文本内容,区别不同就是一个extract()[0],一个extract()[1],从上图可知,.author下有两个a标签,下标为0的是获取第一个a标签,下标为1的是获取第二个a标签
注:第三第四个表达式可换为 .author a::text:选中class的值为author下,子孙元素a标签的文本内容
第五个css表达式 .author>span::text:选中class的值为author下,子元素span标签的文本内容
CSS表达式:
完整代码
from scrapy import Request
from scrapy.spiders import Spider
class HotSalesSpider(Spider):
# 爬虫名称
name = "hot"
#设置用户代理为浏览器类型
qidian_headers = {"User-Agent" : "Mozilla/***************************************************"}
def start_requests(self):
url = "https://www.qidian.com/rank/hotsales?style=1&page=1"
yield Request(url, headers=self.qidian_headers, callback=self.qidian_css_parse)
def qidian_css_parse(self, response):
#使用css定位到小说内容的div元素
list_selector = response.css("[class='book-mid-info']")
#读取每部小说的元素
for one_selector in list_selector:
#获取小说名称
name = one_selector.css("h4>a::text").extract_first()
#获取作者,第一个p标签的第一个a标签的内容
author = one_selector.css(".author>a::text").extract()[0]
#获取类型
type = one_selector.css(".author>a::text").extract()[1]
#获取形式
form = one_selector.css(".author>span::text").extract_first()
#把爬取的数据保存到字典
hot_dict = {
"name" : name,
"author" : author,
"type" : type,
"form" : form
}
yield hot_dict