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
有人知道吗 打个断点调试一下先看看数据正不正常 xzx-python 发表于 2021-7-22 16:52
打个断点调试一下先看看数据正不正常
好,我试试 xzx-python 发表于 2021-7-22 16:52
打个断点调试一下先看看数据正不正常
试过了,还是不行,参数都没错,但就是走不到下一层 details_urls不是空吗 李玉风我爱你 发表于 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 18:37
details_urls不是空吗
改了下还是不行{:301_1008:} 本帖最后由 枼小天 于 2021-7-22 19:36 编辑
好久没碰爬虫了 for url in BookSpider.classification_urls:
这里你仔细检查检查
页:
[1]
2