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数据的。
posted @ 2019-01-12 15:17  橙子的小马甲  阅读(597)  评论(0编辑  收藏  举报
Fork me on GitHub