吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 963|回复: 15
收起左侧

[已解决] scrapy的Spider回调函数问题

[复制链接]
三木零 发表于 2021-7-22 16:47
本帖最后由 三木零 于 2021-7-24 14:10 编辑

实验的新结果:
有函数1、2、3
如果我是直接(1)函数爬取一个url传递给(2)函数来解析,(2)函数再爬取一个url传递给(3)函数解析
这样的话很快啊,一下就访问到了第三层

但是:
同样是1、2、3
我使用(1)函数爬取url,爬取出来的数据有多个url传递给(2)函数解析,而(2)函数要爬取两个数据(1、目标数据的url,2、下一页的url),目标url传递给(3)函数,下一页继续回调(2)函数
这时候就有个问题了,(1)(2)函数可以正常输出,但(3)函数就是没有数据出来
是有延迟还是怎么了,搞不明白

----------------------------------------------结论--------------------------------------------------------------------------
经过很长一段时间的运行,终于找到了问题所在
原来这是由于scrapy的一个特性
在(2)函数运行的时候,是一直调用了本身来获取下一页
但这个分类太多了,下一页有很多,就导致了大量的url传递给(2)函数
虽然也是有具体数据的url发送给(3)函数,但是(2)函数没有执行完毕之后是不会运行(3)函数的
也就是说要跑很久,如果只是学习的作用的话还是建议不要使用scrapy爬取太多的url了
--------------------------------------------------------------------原来问题的分割线----------------------------------------------------------------------
[Asm] 纯文本查看 复制代码
class BookSpider(scrapy.Spider):
    name = 'book'
    # allowed_domains = ['book']
    start_urls = ['https://book.douban.com/tag/?view=type&icn=index-sorttags-all']

    # 获取分类链接
    def parse(self, response, **kwargs):
        print("全部分类页面:" + response.url)
        urls = response.xpath('//div[@id="content"]/div[1]/div[1]/div[2]/div/table/tbody/tr/td/a/text()').getall()
        classification_urls = ["https://book.douban.com/tag/" + i for i in urls]
        for url in classification_urls:
            yield response.follow(url=url, callback=self.get_details, dont_filter=True)

    # 获取分类中所有书籍的url
    def get_details(self, response, **kwargs):
        print("正在获取分类:" + response.url)
        urls = response.xpath('//div[@id="subject_list"]/ul/li/div[@class="info"]/h2/a/@href').getall()

        for url in urls:
            yield response.follow(url=url, callback=self.get_data, dont_filter=True)

        next_url = "https://book.douban.com" + response.xpath(
            '//*[@id="subject_list"]/div[2]/span[last()]/a/@href').get()
        print("下一页:" + next_url)
        yield response.follow(url=next_url, callback=self.get_details, dont_filter=True)

    # 获取详情页中的具体信息
    def get_data(self, response, **kwargs):
        print("书本详情页:" + response.url)

运行结果
[Asm] 纯文本查看 复制代码
全部分类页面:https://book.douban.com/tag/?view=type&icn=index-sorttags-all
正在获取分类:https://book.douban.com/tag/J.K.%E7%BD%97%E7%90%B3
下一页:https://book.douban.com/tag/J.K.罗琳?start=20&type=T
正在获取分类:https://book.douban.com/tag/%E5%87%A0%E7%B1%B3
下一页:https://book.douban.com/tag/几米?start=20&type=T
正在获取分类:https://book.douban.com/tag/%E9%83%AD%E6%95%AC%E6%98%8E
下一页:https://book.douban.com/tag/郭敬明?start=20&type=T
正在获取分类:https://book.douban.com/tag/%E9%9D%92%E6%98%A5%E6%96%87%E5%AD%A6
下一页:https://book.douban.com/tag/青春文学?start=20&type=T


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 三木零 发表于 2021-7-22 16:51
有人知道吗
xzx-python 发表于 2021-7-22 16:52
 楼主| 三木零 发表于 2021-7-22 16:56
 楼主| 三木零 发表于 2021-7-22 17:06
xzx-python 发表于 2021-7-22 16:52
打个断点调试一下  先看看数据正不正常

试过了,还是不行,参数都没错,但就是走不到下一层
李玉风我爱你 发表于 2021-7-22 18:37
details_urls不是空吗
 楼主| 三木零 发表于 2021-7-22 19:04

那里好像是看漏了,这是改了之后的代码
[Asm] 纯文本查看 复制代码
class BookSpider(scrapy.Spider):
    name = 'book'
    # allowed_domains = ['book']
    start_urls = ['https://book.douban.com/tag/?view=type&icn=index-sorttags-all']

    # 获取分类链接
    def parse(self, response, **kwargs):
        print("全部分类页面:" + response.url)
        urls = response.xpath('//div[@id="content"]/div[1]/div[1]/div[2]/div/table/tbody/tr/td/a/text()').getall()
        classification_urls = ["https://book.douban.com/tag/" + i for i in urls]
        for url in classification_urls:
            yield response.follow(url=url, callback=self.get_details, dont_filter=True)

    # 获取分类中所有书籍的url
    def get_details(self, response, **kwargs):
        print("正在获取分类:" + response.url)
        urls = response.xpath('//div[@id="subject_list"]/ul/li/div[@class="info"]/h2/a/@href').getall()

        for url in urls:
            print("内容页:" + url)
            yield response.follow(url=url, callback=self.get_data, dont_filter=True)

        next_url = "https://book.douban.com/tag/" + response.xpath(
            '//*[@id="subject_list"]/div[2]/span[last()]/a/@href').get()
        print("下一页:" + next_url)
        yield response.follow(url=next_url, callback=self.get_details, dont_filter=True)

    # # 获取详情页中的具体信息
    def get_data(self, response, **kwargs):
        print("书本详情页:" + response.url)
 楼主| 三木零 发表于 2021-7-22 19:06

改了下还是不行
枼小天 发表于 2021-7-22 19:26
本帖最后由 枼小天 于 2021-7-22 19:36 编辑

好久没碰爬虫了
QingYi. 发表于 2021-7-22 19:42
for url in BookSpider.classification_urls:
这里你仔细检查检查
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 01:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表