Scrapy之路第一篇

来源:互联网 发布:sportsdt体育大数据 编辑:程序博客网 时间:2024/06/05 08:48

Scrapy之路第一篇(入门案例)

构建自己的数据王国

  • 新建项目
  • 明确目标
  • 制作爬虫
  • 保存数据

一、新建项目(scrapy startproject)

  • 在爬取前,必须创建一个新的scrapy项目,进入自定义的项目目录中,运行下列命令:
scrapy startproject myspider
  • 其中,myspider为项目名称,可以看到将会创建一个myspider文件夹,目录结构大致如下:
    myspider目录结构

这些文件的主要作用列举如下:

  1. scrapy.cfg:项目的配置文件
  2. myspider/:项目的python模块,将会从这里引用代码
  3. myspider/items.py:项目的目标文件
  4. myspider/pipelines.py:项目的管道文件
  5. myspider/settings.py:项目的设置文件
  6. myspider/spiders/:存储爬虫代码目录

二、 明确目标(myspider/items.py)

准备抓取网站http://www.itcast.cn/channel/teacher.shtml网站里的所有讲师的姓名、职称和个人信息。

  1. Item用来定义结构化数据字段,用以保存爬取到的数据,有点像python中的dict,但是提供了一些额外的保护减少错误。
  2. 可以在myspider/items.py中创建一个Item类,并且通过在Item类中继续定义多个Field类(该类是继承了dict)来完善该Item类
  3. 接下来,创建一个ItcastItem类,和构建item模型(model)。
import scrapyclass ItcastItem(scrapy.Item):    name = scrapy.Field()    level = scrapy.Field()    info = scrapy.Field()

三、 制作爬虫(spiders/itcastspider.py)

爬虫功能要分两步:
1、爬数据

  • 在当前目录下输入命令,将在myspider/spiders目录下创建一个名为itcast的爬虫,并指定爬取域的范围:
scrapy genspider itcast "itcast.cn"
  • 打开myspider/spiders目录里的itcast.py,默认增加了下列代码:
import scrapyclass ItcastSpider(scrapy.Spider):    name = 'itcast'    allowed_domains = ['itcast.cn']    start_urls = ['http://www.itcast.cn/channel/teacher.shtml']    def parse(self, response):        pass

其实也可以由我们自行创建itcast.py并编写上面的代码,只不过使用命令可以免去编写固定代码的麻烦。

要建立一个spider,你必须用scrapy.spider类创建一个子类,并确定了三个强制的属性和一个方法。

  • name = ‘itcast’:这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字
  • allow_domains=[]:是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略
  • start_urls=[]:爬取的URL元祖/列表,爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始,其他子URL将会从这些起始URL中继承性生成。
  • parse(self,response):解析的方法,每个初识URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数主要作用如下:
    • 负责解析返回的网页数据(reponse.body),提取结构化数据(生成item)
    • 生成需要下一页的URL请求
  • 将start_urls的值修改为需要爬取的第一个url
start_urls=['http://www.itcast.cn/channel/teacher.shtml']
  • 修改parse()方法
def parse(self, response):    filename="teacher.html"    with open(filename,'wb') as f:        f.write(response.body)
  • 然后在myspider/myspider目录下执行
scrapy crawl itcast
  • 运行后,打印的日志出现[scrapy.core.engine] INFO: Spider closed (finished),代表执行完成。

2、取数据

  • 爬取整个网页源码完毕,接下来是提取过程,首先观察页面源码:
    页面源码
<div class="li_txt">    <h3> xxx </h3>    <h4> xxxxx </h4>    <p> xxxxxxx </p>
  • 之前在myspider/items.py里定义了一个MyspiderItem类,这里引入进来
from myspider.items import MyspiderItem
  • 然后将我们得到的数据封装到一个MyspiderItem对象中,可以保存每个老师的属性:
def parse(self, response):     # filename="teacher.html"     # with open(filename,'wb') as f:     #     f.write(response.body)     items=[]     for each in response.xpath("//div[@class='li_txt']"):         item=MyspiderItem()         name=each.xpath("h3/text()").extract()[0]         level=each.xpath("h4/text()").extract()[0]         info=each.xpath("p/text()").extract()[0]         item['name']=name         item['level']=level         item['info']=info         items.append(item)     return items

四、 保存数据

我们暂时先不处理管道。
scrapy保存信息的最简单的方法主要有四中,-o输出指定格式的文件,命令如下:

#json格式,默认为unicode编码scrapy crawl itcast -o teachers.jsonscrapy crawl itcast -o teachers.jsonlscrapy crawl itcast -o teachers.csvscrapy crawl itcast -o teachers.xml
原创粉丝点击