这是我第一次在这里提问。如果我出错了,请原谅我。 我是python中的一个新人,我试着用scrapy来学习更多关于蜘蛛的东西。
问题在这里:
def get_chapterurl(self, response):
item = DingdianItem()
item['name'] = str(response.meta['name']).replace('\xa0', '')
yield item
yield Request(url=response.url, callback=self.get_chapter, meta={'name':name_id})
def get_chapter(self, response):
urls = re.findall(r'<td class="L"><a href="(.*?)">(.*?)</a></td>', response.text)
正如你所看到的,我同时产生了item和Requests,但是get_chapter函数没有运行第一行(我在那里使用了一个断点),那么我错在哪里? 对不起,打扰您。 我有谷歌一段时间,但得到注意......
答案 0 :(得分:1)
您的请求被过滤掉了。
Scrapy具有内置请求过滤器,可防止您下载同一页面两次(预期功能)。
让我们说你在http://example.com;这个要求你屈服:
yield Request(url=response.url, callback=self.get_chapter, meta={'name':name_id})
尝试再次下载http://example.com。如果你看一下爬行日志,它应该说&#34;忽略重复的网址http://example.com&#34;。
您始终可以通过在dont_filter=True
对象中设置Request
参数来忽略此功能,如下所示:
yield Request(url=response.url, callback=self.get_chapter, meta={'name':name_id},
dont_filter=True)
然而!我无法理解您的代码意图,但似乎您并不真的想要两次下载相同的网址。
您也不必安排新的请求,您可以使用您已有的请求拨打回叫:
response = response.replace(meta={'name': name_id}) # update meta
# why crawl it again, if we can just call the callback directly!
# for python2
for result in self.get_chapter(response):
yield result
# or if you are running python3:
yield from self.get_chapter(response):