我希望scrapy抓取一些开始网址,然后根据规则关注这些网页中的链接。我的蜘蛛继承自CrawlSpider
,并设置了start_urls
和'规则'。但它似乎没有使用我定义的解析函数来解析start_urls。以下是代码:
<!-- language: lang-python -->
class ZhihuSpider(CrawlSpider):
start_urls = ["https://www.zhihu.com/topic/19778317/organize/entire",
"https://www.zhihu.com/topic/19778287/organize/entire"]
rules = (Rule(LinkExtractor(allow= (r'topic/\d+/organize/entire')), \
process_request='request_tagInfoPage', callback = 'parse_tagPage'))
# this is the parse_tagPage() scrapy should use to scrape
def parse_tagPage():
print("start scraping!") # Explicitly print to show that scraping starts
# do_something
但是,控制台显示scrapy爬行了start_urls但没有打印出来。所以我很确定没有调用parse_tagPage()函数。即使scrapy显示网址已被抓取[scrapy] DEBUG: Crawled (200) <GET https://www.zhihu.com/topic/19778317/organize/entire> (referer: http://www.zhihu.com)
有关为什么会发生这种情况以及如何设置scrapy以使用parse_tagPage()的任何提示?
答案 0 :(得分:0)
第1,CrawlSpider类使用默认的parse()方法来处理没有指定回调函数的所有请求,在我的情况下包括从start_urls发出的请求。此parse()方法仅应用规则来提取链接,并且根本不解析start_url的页面。这就是为什么我不能从start_url页面中删除任何东西。
第二,LinkExtractor以某种方式仅从start_urls页面中提取第一个链接。不幸的是,第一个链接是start_urls本身。因此scrapy内部复制防止机制阻止解析这些页面。这就是调用回调函数parse_tagPage()的原因。
我正在修复LinkExtractor。