1、抓取网站情况介绍
抓取网站:http://www.imooc.com/course/list
抓取内容:要抓取的内容是全部的课程名称,课程简介,课程URL ,课程图片URL,课程人数(由于动态渲染暂时没有获取到)
网站图片:
2、建立工程
在命令行模式建立工程
scrapy startproject scrapy_course
建立完成后,用pycharm打开,目录如下:
scrapy.cfg: 项目的配置文件
scrapytest/: 该项目的python模块。之后您将在此加入代码。
scrapytest/items.py: 项目中的item文件.
scrapytest/pipelines.py: 项目中的pipelines文件.
scrapytest/settings.py: 项目的设置文件.
scrapytest/spiders/: 放置spider代码的目录.
3、创建一个爬虫
下面按步骤讲解如何编写一个简单的爬虫。
我们要编写爬虫,首先是创建一个Spider
我们在scrapy_course/spiders/
目录下创建一个文件MySpider.py
文件包含一个MySpider类,它必须继承scrapy.Spider类。
同时它必须定义一下三个属性:
-name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
-start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
-parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
创建完成后MySpider.py的代码如下
定义爬虫项目
创建完了Spider文件,先不急着编写爬取代码
我们先定义一个容器保存要爬取的数据。
这样我们就用到了Item
为了定义常用的输出数据,Scrapy提供了Item类。Item对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。
我们在工程目录下可以看到一个items文件,我们可以更改这个文件或者创建一个新的文件来定义我们的item。
这里,我们在同一层创建一个新的item文件CourseItems.py
根据如上的代码,我们创建了一个名为courseItem的容器,用来保存、抓取的信息,
title->课程标题, url->课程url, image_url->课程标题图片, introduction->课程描述, student->学习人数
在创建完item文件后我们可以通过类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。
常用方法如下
4、编写Spider代码
定义了item后我们就能进行爬取部分的工作了。
为了简单清晰,我们先抓取一个页面中的信息。
首先我们编写爬取代码
我们在上文说过,爬取的部分在MySpider类的parse()方法中进行。
parse()方法负责处理response并返回处理的数据以及(/或)跟进的URL。
该方法及其他的Request回调函数必须返回一个包含 Request 及(或) Item 的可迭代的对象。
我们在之前创建的MySpider.py中编写如下代码。
注意和上边MySpider.py的区别
# -*- coding:utf8-*-
import scrapy
import sys
import time
reload(sys)
sys.setdefaultencoding('utf-8')
from scrapy_course.items import CourseItem
from scrapy.selector import Selector
sys.stdout = open('output.txt', 'w')
pageIndex = 0
'''
遇到不懂的问题?Python学习交流群:1004391443满足你的需求,资料都已经上传群文件,可以自行下载!
'''
class MySpider(scrapy.Spider):#用于区别Spidername = "MySpider"#允许访问的域allowed_domains = ['imooc.com']#爬取的地址start_urls = ["http://www.imooc.com/course/list"]#爬取方法def parse(self, response):# 实例一个容器保存爬取的信息item = CourseItem()# 这部分是爬取部分,使用xpath的方式选择信息,具体方法根据网页结构而定# 先获取每个课程的divsel = Selector(response)title = sel.xpath('/html/head/title/text()').extract() # 标题print title[0]# sels = sel.xpath('//div[@class="course-card-content"]')sels = sel.xpath('//a[@class="course-card"]')pictures = sel.xpath('//div[@class="course-card-bk"]')index = 0global pageIndexpageIndex += 1print u'%s' % (time.strftime('%Y-%m-%d %H-%M-%S'))print '第' + str(pageIndex)+ '页 'print '----------------------------------------------'for box in sels:print ' '# 获取div中的课程标题item['title'] = box.xpath('.//h3[@class="course-card-name"]/text()').extract()[0].strip()print '标题:' + item['title']# 获取div中的课程简介item['introduction'] = box.xpath('.//p/text()').extract()[0].strip()print '简介:' + item['introduction']# 获取每个div中的课程路径item['url'] = 'http://www.imooc.com' + box.xpath('.//@href').extract()[0]print '路径:' +item['url']# 获取div中的学生人数item['student'] = box.xpath('.//div[@class="course-card-info"]/text()').extract()[0].strip()print item['student']# 获取div中的标题图片地址item['image_url'] = pictures[index].xpath('.//img/@src').extract()[0]print '图片地址:' + item['image_url']index += 1yield itemtime.sleep(1)print u'%s' % (time.strftime('%Y-%m-%d %H-%M-%S'))# next =u'下一页'# url = response.xpath("//a[contains(text(),'" + next + "')]/@href").extract()# if url:# # 将信息组合成下一页的url# page = 'http://www.imooc.com' + url[0]# # 返回url# yield scrapy.Request(page, callback=self.parse)