分享

Scrapy之路第一篇

 stoneccf 2019-01-14

构建自己的数据王国

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

一、新建项目(scrapy startproject)

  • 在爬取前,必须创建一个新的scrapy项目,进入自定义的项目目录中,运行下列命令:
scrapy startproject myspider
  • 1
  • 其中,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./channel/teacher.shtml网站里的所有讲师的姓名、职称和个人信息。

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

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

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

  • 在当前目录下输入命令,将在myspider/spiders目录下创建一个名为itcast的爬虫,并指定爬取域的范围:
scrapy genspider itcast ""
  • 1
  • 打开myspider/spiders目录里的itcast.py,默认增加了下列代码:
import scrapy

class ItcastSpider(scrapy.Spider):
    name = 'itcast'
    allowed_domains = ['']
    start_urls = ['http://www./channel/teacher.shtml']

    def parse(self, response):
        pass
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

其实也可以由我们自行创建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./channel/teacher.shtml']
  • 1
  • 修改parse()方法
def parse(self, response):
    filename="teacher.html"
    with open(filename,'wb') as f:
        f.write(response.body)
  • 1
  • 2
  • 3
  • 4
  • 然后在myspider/myspider目录下执行
scrapy crawl itcast
  • 1
  • 运行后,打印的日志出现[scrapy.core.engine] INFO: Spider closed (finished),代表执行完成。

2、取数据

  • 爬取整个网页源码完毕,接下来是提取过程,首先观察页面源码:
    页面源码
<div class="li_txt">
    <h3> xxx </h3>
    <h4> xxxxx </h4>
    <p> xxxxxxx </p>
  • 1
  • 2
  • 3
  • 4
  • 之前在myspider/items.py里定义了一个MyspiderItem类,这里引入进来
from myspider.items import MyspiderItem
  • 1
  • 然后将我们得到的数据封装到一个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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

四、 保存数据

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

#json格式,默认为unicode编码
scrapy crawl itcast -o teachers.json
scrapy crawl itcast -o teachers.jsonl
scrapy crawl itcast -o teachers.csv
scrapy crawl itcast -o teachers.xml
  • 1
  • 2
  • 3
  • 4
  • 5

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多