试图让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:如果我将解析函数移到课外,它没有问题 . 问题是我不能以那种方式输出任何东西 . 在类中具有parse函数(即使它只是填充了pass)导致只请求起始页和robot.txt
2 回答
我想当你使用 callback='parse' 时,它会回到内置的解析方法 . 您可以尝试使用 callback='self.parse' 吗?这可能会触发您的解析方法而不是默认方法
不确定为什么,但如果我将规则回调更改为callback ='parse_link'并重命名该函数以匹配,一切正常 . 代码看起来应该如下所示:
编辑:请参阅下面的Chetan mishra的评论以获得解释 . 我显然没有仔细查看文档 .