九、CrawlSpider⭐⭐⭐
是一个类,基于Spider的子类。
子类继承父类所有的功能,并能派生出自己的功能!
- 用于全栈数据的爬取
- 基于Spider:手动请求
- 基于CrawlSpider
- 使用流程
- 创建工程(同以前不变)
- cd XXX
- 创建爬虫文件(CrawlSpider):
scrapy genspider -t crawl xxx www.xxx.com
【scrapy genspider -t crawl sun www.xxx.com
】- 链接提取器:根据指定的规则(allow)进行指定的提取
- 规则解析器:将链接提取器的链接进行指定规则(callback)的解析操作
实战项目
- 需求
爬取sun网站网站中的编号、新闻标题、新闻内容、编号
- 分析
爬取的数据没有在同一张页面中
- 流程
- 可以使用链接提取器提取所有的页码链接
- 让链接提取器提取所有的新闻详情页
- 源码解析
- sun.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from sunPro.items import SunproItem,DetailItem
# 需求:爬取sun网站网站中的编号、新闻标题、新闻内容、编号
class SunSpider(CrawlSpider):
name = 'sun'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://wzzdg.sun0769.com/political/index/politicsNewest?id=1&page=1']
# 链接提取器:根据指定规则(allow="正则")进行指定链接的提取
link = LinkExtractor(allow=r'id=1&page=\d+')
link_detail = LinkExtractor(allow=r'index\?id=\d+')
rules = (
# 规则解析器:将链接提取器的链接进行指定规则(callback)的解析操作
# 提取链接的个数和回调的次数是相同的
Rule(link, callback='parse_item', follow=True),
Rule