三木零 发表于 2021-7-22 16:47

scrapy的Spider回调函数问题

本帖最后由 三木零 于 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了
--------------------------------------------------------------------原来问题的分割线----------------------------------------------------------------------
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/div/div/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/span/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)
运行结果
全部分类页面: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

xzx-python 发表于 2021-7-22 16:52
打个断点调试一下先看看数据正不正常

好,我试试

三木零 发表于 2021-7-22 17:06

xzx-python 发表于 2021-7-22 16:52
打个断点调试一下先看看数据正不正常

试过了,还是不行,参数都没错,但就是走不到下一层

李玉风我爱你 发表于 2021-7-22 18:37

details_urls不是空吗

三木零 发表于 2021-7-22 19:04

李玉风我爱你 发表于 2021-7-22 18:37
details_urls不是空吗

那里好像是看漏了,这是改了之后的代码
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/div/div/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/span/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 18:37
details_urls不是空吗

改了下还是不行{:301_1008:}

枼小天 发表于 2021-7-22 19:26

本帖最后由 枼小天 于 2021-7-22 19:36 编辑

好久没碰爬虫了

QingYi. 发表于 2021-7-22 19:42

for url in BookSpider.classification_urls:
这里你仔细检查检查
页: [1] 2
查看完整版本: scrapy的Spider回调函数问题