尝试让Scrapy抓取多个域。我让它工作了很短时间,但有些东西改变了,我不知道是什么。我的理解是,带有规则的"CrawlSpider“应该遵循任何允许的链接,直到深度设置或域名耗尽。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class BbcSpider(CrawlSpider):
name = 'bbcnews'
allowed_domains = [
'www.bbc.com']
start_urls = [
'http://www.bbc.com/news']
rules = (Rule(LinkExtractor(allow=()), callback='parse', follow=True),)
def parse(self, response):
print(response.url)
如果我想抓取多个域,我会修改"allowed_domains“和"start_urls”
allowed_domains = [
'www.bbc.com',
'www.voanews.com']
start_urls = [
'http://www.bbc.com/news',
'https://www.voanews.com/p/6290.html']
然而,在这两种情况下,当我运行"scrapy crawl bbcnews“时,爬虫只检索源站点,然后退出。
编辑:
好的,只要只有1个域和1个起始URL,这个代码就可以工作。如果我添加了两个以上的页面,爬行器只会爬行起始页面。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class BbcfarsiSpider(CrawlSpider):
name = 'bbcfarsi'
allowed_domains = ['bbc.com']
start_urls = ['http://bbc.com/persian']
rules = (Rule(LinkExtractor(allow=('persian'),), callback='parse', follow=True), )
def parse(self, response):
pass
编辑#2:如果我将解析函数移到类之外,它可以正常工作。这样做的问题是我无法以这种方式输出任何内容。在类中使用解析函数(即使只是用pass填充)会导致只请求起始页和robot.txt
发布于 2018-06-04 06:57:40
不知道为什么,但是如果我把回调规则改为callback='parse_link‘并重命名函数以匹配,一切都会正常工作。代码应该类似于下面的代码:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class BbcSpider(CrawlSpider):
name = 'bbcnews'
allowed_domains = [
'www.bbc.com',
'www.voanews.com',]
start_urls = [
'http://www.bbc.com/news',
'https://www.voanews.com/p/6290.html',]
rules = (Rule(LinkExtractor(allow=()), callback='parse_link', follow=True),)
def parse_link(self, response):
yield {
'url' : response.url ,
}
编辑:参见下面Chetan mishra的评论以获得解释。很明显,我没有仔细查看文档。
https://stackoverflow.com/questions/50667184
复制相似问题