scrapy爬虫框架详解,爬取某网站小游戏案例实战


scrapy介绍

名词介绍:

  1. 引擎(engine)
    scrapy的核心,负责模块之间的衔接
  2. 调度器(scheduler)
    存放我们要爬取的URL地址,可以看成一个URL容器,它决定着我们下一步要去爬取哪个URL
  3. 爬虫(spider)
    主程序吧,大部分代码在这里写,主要负责解析response中的数据解析,拿到我们想要的数据
  4. 管道(pipeline)
    数据存放的地方,管道可以有多个,按照优先级来,数越小,优先级越高
  5. 下载器(download)
    负责发送request请求,将结果直接打包成可以解析的数据,交给爬虫

scrapy工作流程:

  1. 爬虫(spider)从其实url构造成requests对象传递给调度器
  2. 引擎(engine)从调度器中获取到request对象交给下载器
  3. 由下载器(downloader)获取到页面源代码,在交给引擎
  4. 引擎将获取到的原码交给spider ,spider对数据进行解析(parse)并返还给引擎

使用方法:

1.在终端里移动到项目所在地址
scrapy startproject 【项目名字】 # 使用scrapy创建项目
2.cd到刚才的项目里面,创建目标
scrapy genspider 【名字】【目标URL】

项目实战

主程序里面:

import scrapy


class Game4399Spider(scrapy.Spider):
    name = "game4399"
    allowed_domains = ["4399.com"]
    start_urls = ["http://4399.com/flash"]

    def parse(self, response):
        # print(response.text)  # 页面源代码
        # response.json(), response.cs
        # 需要用extract单独提取内容
        # 一次性提取
        # name = response.xpath('//*[@id="skinbody"]/div[8]/ul/li/a/b/text()').extract()
        # print(name)
        # 分块提取
        lis = response.xpath('//ul[@class="n-game cf"]/li')
        for li in lis:
            # 使用extract_first()提取第一项,没有不取,代替[0],防止报错
            name = li.xpath('./a/b/text()').extract_first()
            link = 'http://www.4399.com' + li.xpath('./a/@href').extract_first()
            # print(name)
            # 因为列表比较耗内存,所以这里转成字典
            dic = {
                "name": name,
                "link": link,
            }
            # 用yield将数据传递给管道pipeline
            yield dic  # 如果返回的是数据,直接可以认为给了管道pipeline

setting里面把不需要的日志取消显示,只显示错误信息就够用了,把这行加上去

# 日志级别:DEBUG, INFO, WARNING, CRITICAL , 依次递增
LOG_LEVEL = 'ERROR'

还要在里面打开项目管道,scrapy默认是关闭的,找到这几行代码,取消注释即可

ITEM_PIPELINES = {
   "game.pipelines.GamePipeline": 300,
   # key:管道的路径 value:管道的优先级,越小优先级越高,管道可有多个,mysql,MangoDB等
   # 创建一个新的管道
   "game.pipelines.NewPipeline": 200,
}

pipelines里面的代码:

# 管道默认是不生效的,需要去设置中打开
class GamePipeline:  # 类名可以自定义
    def process_item(self, item, spider):  # 处理数据的专用方法,不可随意更改,item:数据,spader:爬虫
        # print(item)
        # print(spider.name)
        return item

class NewPipeline:  # 使用自定义的管道,优先级200
    def process_item(self, item, spider):
        item['love'] = 'OK'
        return item

最后执行scrapy crawl [项目名字]
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫木马牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值