V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
13936
V2EX  ›  问与答

关于 scrapy 的几个问题

  •  
  •   13936 · 2020-07-24 07:30:04 +08:00 · 1180 次点击
    这是一个创建于 1586 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前一直都在用 requests, 上手是很简单,但是重新写爬虫的时候有不少内容是重复的。导致新写爬虫时都会从上一个项目那拷贝不少代码过来。

    最近上手了 scrapy,发现上手还有点麻烦。前期几个小问题因为我喜欢死磕的个性耗费了不少时间。 最近主要有几个问题想请教下大家。

    我的爬取逻辑是先爬取好五六千条数据放表一里,然后再根据这几千条数据的 id 去爬取新的内容。一般能根据每个 id 能爬来 100 条数据放表二里。所以表二爬完后大概有五十万的数据在里面。

    问题是我之后还会继续爬,还有六七万的需要放至表一里的数据没有爬,如果还按照同一套存储逻辑来,表二大概得有五六百万条数据,一般这种情况需要做分表处理吗?

    还有,有时候会遇到反爬措施 403 错误,我在中间件里设置了当遇到非 200 响应的时候,就会 raise closespider,但是好像停止不了爬虫啊,只是不停地爬取新的页面然后不停地升起新的 closespider 错误,但还是会继续爬。是我的爬取逻辑导致的吗?还是说我的 closespider 代码不够完整?

    提前谢谢各位了!

    3 条回复    2020-07-24 12:08:04 +08:00
    ooh
        1
    ooh  
       2020-07-24 08:36:31 +08:00   ❤️ 1
    几百万条数据,你查询做好索引没问题,
    Scapy 默认只处理成功的请求(200-300),如果要处理错误请求要放到 handle_httpstatus_list = [403] 里面
    停止调用 self.crawler.stop()
    peonone
        2
    peonone  
       2020-07-24 08:49:03 +08:00   ❤️ 1
    几百万到不了分表的程度

    你在 middleware 里面 raise closespider 是不对的,closespider 是用于在回调函数里面抛出的。
    downloader middleware 的 process_response 只接受 Request / Response 返回值或者 IgnoreRequest 异常。
    像一楼说的,你需要先保证 403 请求被 spider 的回调处理,然后在回调里面抛出 closespider
    遇到这种问题应该先翻翻文档

    https://docs.scrapy.org/en/latest/topics/exceptions.html#scrapy.exceptions.CloseSpider
    https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#scrapy.downloadermiddlewares.DownloaderMiddleware.process_response
    13936
        3
    13936  
    OP
       2020-07-24 12:08:04 +08:00
    @peonone 谢谢,文档是翻了的。但是目前主要需要解决掉问题,一点一点从头理解透彻 scrapy 太耗时间了。谢谢答复啦。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:59 · PVG 05:59 · LAX 13:59 · JFK 16:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.