scrapy爬取相似页面及回调爬取问题(以慕课网为例)
以爬取慕课网数据为例
慕课网的数据很简单,就是通过get方式获取的
根据page参数来分页
这个时候有两种爬取方式
一种是获取到跳转到下一页的链接,通过递归回调爬取函数来完成爬取过程
主要代码如下:通过css选择器获取到下一页的链接,再通过urljoin获取到绝对链接
在这里的scrapy.Request方法,这是Scrapy的跟踪链接机制:当你在回调方法中产生一个Request时,Scrapy会安排发送该请求并注册一个回调方法,以便在该请求完成时执行
import scrapy class imoocall_Spider(scrapy.Spider): name = "imoocall" start_urls = [ 'https://www.imooc.com/course/list?page=2', ] def parse(self, response): for course in response.css('div.course-card-container'): yield { '类别': course.css('label::text').extract_first(), '课程名': course.css('h3::text').extract_first(), '难度级别': course.css('span::text').extract(), '简介': course.css('p::text').extract_first(), } next_page = response.css('div.page a::attr("href")')[9].extract() if next_page is not None: next_page = response.urljoin(next_page) yield scrapy.Request(next_page, self.parse)
第二种就是for循环,主要用来处理重复页面数较少,或者所要爬取页面的分页机制不是很规律就可以使用for循环
主要代码如下:
import scrapy class imooc_Spider(scrapy.Spider): name = "imooc" def start_requests(self): for num in range(1,32): numstr = str(num) url = "https://www.imooc.com/course/list?page="+numstr yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): for course in response.css('div.course-card-container'): yield { '类别': course.css('label::text').extract_first(), '课程名': course.css('h3::text').extract_first(), '难度级别': course.css('span::text').extract(), '简介': course.css('p::text').extract_first(), }
注意要将int型强制转换为string后才能拼接
之后直接进入你的spider页面运行 scrapy runspider imooc_spider.py -o imooc.csv就可以了,
爬取的部分数据如下~
sa
以上就是爬取慕课网的全部过程,爬取极客学院和腾讯课堂、csdn学院等,都可以用这种方法爬取,他们的数据都是后台传值后直接写进页面的,如果是通过js加载数据的情况通过这种方式就不行,网易云课堂,网易云公开课就是通过js加载post数据的。