Scrapy学习

本文档介绍了如何使用Scrapy爬虫框架进行网页数据爬取,包括新建项目、定义数据结构、编写爬虫和保存数据。在items.py中定义Item字段,spiders中编写爬虫逻辑,通过XPath解析网页内容,最后通过pipelines存储数据。提供了详细的步骤和代码示例,适合初学者入门。
摘要由CSDN通过智能技术生成

参考https://segmentfault.com/a/1190000013178839

介绍

流程:

  1. 新建项目 (scrapy startproject xxx):新建一个新的爬虫项目
  2. 明确目标 (编写items.py):明确你想要抓取的目标
  3. 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
  4. 存储内容 (pipelines.py):设计管道存储爬取内容

Scrapy框架官方网址:https://doc.scrapy.org/en/latest/

Scrapy中文维护站点:https://scrapy-chs.readthedocs.io/zh_CN/latest/index.html

demo

1.新建项目

scrapy startproject Project_Name

Project_Name为项目名称,可以看到将会创建一个 Project_Name文件夹,目录结构大致如下:


Project_Name【文件夹】
------Project_Name【文件夹】
------------spiders【文件夹】
------------------ __init__.py
------------ __init__.py
------------items.py
------------middlewares.py
------------pipelines.py
------------settings.py
------scrapy.cfg


各个主要文件的作用:

  • scrapy.cfg :项目的配置文件
  • Project_Name/ :项目的Python模块,将会从这里引用代码
  • Project_Name/items.py :项目的目标文件
  • Project_Name/pipelines.py :项目的管道文件
  • Project_Name/settings.py :项目的设置文件
  • Project_Name/spiders/ :存储爬虫代码目录

2.明确目标(Project_Name/items.py)

打开Project_Name目录下的items.py
Item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。
可以通过创建一个 scrapy.Item 类, 并且定义类型为
scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)。
接下来,创建一个ItcastItem 类,和构建item模型(model)。

import scrapy

class Project_NameItem(scrapy.Item):

   name = scrapy.Field()
   title = scrapy.Field()
   info = scrapy.Field()

3.制作爬虫 (spiders/Project_Name_Spider.py)

cd Project_Name
scrapy genspider Project_Name_Spider xxxx.com
Project_NameItem_Spider.py名字随意


举例:

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

class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn"]
    start_urls = (
        'http://www.itcast.cn/',
    )

    def parse(self, response):
        pass

name = “” :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

负责解析返回的网页数据(response.body),提取结构化数据(生成item)
生成需要下一页的URL请求。
将start_urls的值修改为需要爬取的第一个url

start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)

修改parse()方法

def parse(self, response):
    filename = "teacher.html"
    open(filename, 'w').write(response.body)

在Project_Name目录下执行scrapy crawl itcast itcast是 ItcastSpider 类的 name 属性,也就是使用 scrapy genspider命令的唯一爬虫名。
运行之后,如果打印的日志出现 [scrapy] INFO: Spider closed (finished),代表执行完成。 之后当前文件夹中就出现了一个 teacher.html 文件,里面就是我们刚刚要爬取的网页的全部源代码信息。

2)取数据
爬取整个网页完毕,接下来的就是的取过程了,首先观察页面源码:

<div class="li_txt">
    <h3>  xxx  </h3>
    <h4> xxxxx </h4>
    <p> xxxxxxxx </p>

在Project_Name_Spider.py 内引入item类

  from mySpider.items import ItcastItem

定义类内函数parse:


from mySpider.items import ItcastItem

def parse(self, response):
    #open("teacher.html","wb").write(response.body).close()

    # 存放老师信息的集合
    items = []

    for each in response.xpath("//div[@class='li_txt']"):
        # 将我们得到的数据封装到一个 `ItcastItem` 对象
        item = ItcastItem()
        #extract()方法返回的都是unicode字符串
        name = each.xpath("h3/text()").extract()
        title = each.xpath("h4/text()").extract()
        info = each.xpath("p/text()").extract()

        #xpath返回的是包含一个元素的列表
        item['name'] = name[0]
        item['title'] = title[0]
        item['info'] = info[0]

        items.append(item)

    # 直接返回最后数据
    return items
我们暂时先不处理管道,后面会详细介绍。
保存数据

写成这样,结果一样

from mySpider.items import ItcastItem

def parse(self, response):
    #open("teacher.html","wb").write(response.body).close()

    # 存放老师信息的集合
    #items = []

    for each in response.xpath("//div[@class='li_txt']"):
        # 将我们得到的数据封装到一个 `ItcastItem` 对象
        item = ItcastItem()
        #extract()方法返回的都是unicode字符串
        name = each.xpath("h3/text()").extract()
        title = each.xpath("h4/text()").extract()
        info = each.xpath("p/text()").extract()

        #xpath返回的是包含一个元素的列表
        item['name'] = name[0]
        item['title'] = title[0]
        item['info'] = info[0]

        #items.append(item)

        #将获取的数据交给pipelines
        yield item

    # 返回数据,不经过pipeline
    #return items

4.保存信息

scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,,命令如下:

json格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json

json lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl

csv 逗号表达式,可用Excel打开
scrapy crawl itcast -o teachers.csv

xml格式
scrapy crawl itcast -o teachers.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值