关于 scrapy 的几个问题

2020-07-24 07:30:04 +08:00
 13936

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

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

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

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

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

提前谢谢各位了!

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

你在 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
2020-07-24 12:08:04 +08:00
@peonone 谢谢,文档是翻了的。但是目前主要需要解决掉问题,一点一点从头理解透彻 scrapy 太耗时间了。谢谢答复啦。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX