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数据的。
相关文章
相关标签/搜索