第一次用 scrapy, 请多多指教.
用一个爬 stackoverflow 用户数据的例子来举例说明, 我的 spider 主要核心逻辑是这样的:
详细步骤是下面这个 (前面 4 步都 ok 没问题, 主要问题在第 5 步)
从这个 url 开始 start_urls = ['https://stackoverflow.com/users']
第一个 parse 把这个页面所有 users 拿到, 然后一个 for loop 对每个 user 提取基本信息, 比如头像,用户名等, 放入 item 里, 然后在这个 for loop 里用 yield scrapy.Request() 进入每个 user 的页面, 并且把之前的 item 用 meta 也传了过去, 也写了一个 parseUserPage 的函数, 一起在 request 里 callback 了. 此外, 在这个 parse 函数 for loop 遍历 users 外面的最最下面, 还有一个跳转下一页的 yield scrapy.Request()
在那个 parseUserPage 的函数里, 提取用户的自我介绍这种信息, 放入 item 里, 再拿到这个用户页面里 top10 的 posts 的 urls, 因为想把所有 posts 信息都放在一起, 所以我先让这个 item 里['posts']这个 field 新建了一个空的 list, 然后再一个 for loop 对提取的 top10 的 posts 一一遍历. // 前面的步骤都没有任何问题, 都能在 pipelines.py 的 process_item()里用 logger 打印出 item 并且跳转到下一页面, 就是到了第三步再一次进行跳转到 post 页面的时候开始出幺蛾子了
对每一个 post 的 url 再一次用 yield scrapy.Request() 进入每个 post 的页面. 还是一样, 把之前的 item 用 meta 也传了过去 (此外, 我知道 meta 是用的 shallow copy, 而且我那个 post 用的是 list, 所以我改成了 deepcopy(item) ) 也写了一个对应的 parsePost 的函数用来 callback
在这个 parsePostPage 的函数里, 对这个问题回答页面, 我提取出所有对应的问题和答案, 找出和 user-id 对应的 答案或者问题信息抓取, 然后放入 item 里 post field 里, 因为用的是 list, 所以我用的是 append(), 找到后直接 break 这个 for loop, 然后这个 parsePostPage 函数结尾 yield 出最终 item
其他信息都没问题, 比如用户名字和基本介绍这些, 问题就出现在最后处理 post 的时候, 按道理我是应该能把 top-10 个 posts 的内容都能放进我的 item 里 post 这个 field 里, 可为什么每次打印出来的结果只有个空 list, 或者只拿到 1 个 post 的内容???
到底是什么原因造成的只能拿到一个空 list 或者只有一个 post?
我测试的时候, 在 praseUserPage 都能拿到 10 个 top-posts 的 urls, 但是为什么对 top-10 posts 的那个 for loop 没有跑完就存取 item 了?
我的尝试和猜想
我是应该在 parseUserPage 的 for loop 遍历完所有 top posts 的下面去 yield item 吗? 试了一下, 这样前面很多 users 就是空的 list 什么 post 内容都没拿到, 感觉应该还是在最后一个拿到 item 所有信息的函数里 yield 出 item
我试了一下在最后那个 parseUsePost 的函数里, 对一个问答页面的 post 进行 for 循环找到 user 的 post 并且将其提取出来 append 到 item 的 post 里的 list 后, 不 break 这个 for loop, 改成直接 yield item.
这样 item 里就没有空 list 出现了, 但还是只能拿到一个或者 2 个 post 的情况.....在 parseUserPage 的函数里那个处理 top-10 的 for loop 没有把剩余的 9 个 posts 后面的遍历完...
不太明白为什么会出现这个情况...希望 scrapy 大佬能解惑一下, 多谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.