之前一直都在用 requests, 上手是很简单,但是重新写爬虫的时候有不少内容是重复的。导致新写爬虫时都会从上一个项目那拷贝不少代码过来。
最近上手了 scrapy,发现上手还有点麻烦。前期几个小问题因为我喜欢死磕的个性耗费了不少时间。 最近主要有几个问题想请教下大家。
我的爬取逻辑是先爬取好五六千条数据放表一里,然后再根据这几千条数据的 id 去爬取新的内容。一般能根据每个 id 能爬来 100 条数据放表二里。所以表二爬完后大概有五十万的数据在里面。
问题是我之后还会继续爬,还有六七万的需要放至表一里的数据没有爬,如果还按照同一套存储逻辑来,表二大概得有五六百万条数据,一般这种情况需要做分表处理吗?
还有,有时候会遇到反爬措施 403 错误,我在中间件里设置了当遇到非 200 响应的时候,就会 raise closespider,但是好像停止不了爬虫啊,只是不停地爬取新的页面然后不停地升起新的 closespider 错误,但还是会继续爬。是我的爬取逻辑导致的吗?还是说我的 closespider 代码不够完整?
提前谢谢各位了!
1
ooh 2020-07-24 08:36:31 +08:00 1
几百万条数据,你查询做好索引没问题,
Scapy 默认只处理成功的请求(200-300),如果要处理错误请求要放到 handle_httpstatus_list = [403] 里面 停止调用 self.crawler.stop() |
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 |