全站数据爬取
大部分的网站展示的数据都进行了分页操作,那么将所有页码对应的页面数据进行爬取就是爬虫中的全站数据爬取。 基于scrapy如何进行全站数据爬取呢?
将每一个页码对应的url存放到爬虫文件的起始url列表(start_urls)中。(不推荐)
使用Request方法手动发起请求。(勉强)
使用crawlSpider链接提取器 (推荐)
需求:将糗事百科所有页码的作者和段子内容数据进行爬取切持久化存储
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class QiubaiSpider(CrawlSpider): name = 'qiubai' # allowed_domains = ['www.qiubai.cn'] start_urls = ['https://www.qiushibaike.com/8hr/page/1/'] #定义每个页码的规则,用于提取链接 link = LinkExtractor(allow=r'/8hr/page/\d+/') rules = ( Rule(link, callback='parse_item', follow=True),#fallow=True 提取所有页码 ) def parse_item(self, response):
#开始解析需要的数据 print(response)
2.其他办法(自己构造每一页的url格式)
# -*- coding: utf-8 -*- import scrapy from qiushibaike.items import QiushibaikeItem # scrapy.http import Request class QiushiSpider(scrapy.Spider): name = 'qiushi' allowed_domains = ['www.qiushibaike.com'] start_urls = ['https://www.qiushibaike.com/text/'] #爬取多页 pageNum = 1 #起始页码 url = 'https://www.qiushibaike.com/text/page/%s/' #每页的url def parse(self, response): div_list=response.xpath('//*[@id="content-left"]/div') for div in div_list: #//*[@id="qiushi_tag_120996995"]/div[1]/a[2]/h2 author=div.xpath('.//div[@class="author clearfix"]//h2/text()').extract_first() author=author.strip('\n') content=div.xpath('.//div[@class="content"]/span/text()').extract_first() content=content.strip('\n') item=QiushibaikeItem() item['author']=author item['content']=content yield item #提交item到管道进行持久化 #爬取所有页码数据 if self.pageNum <= 13: #一共爬取13页(共13页) self.pageNum += 1 url = format(self.url % self.pageNum) #递归爬取数据:callback参数的值为回调函数(将url请求后,得到的相应数据继续进行parse解析),递归调用parse函数 yield scrapy.Request(url=url,callback=self.parse)