我正在尝试使用Scrapy收集域下的所有网址。我试图使用CrawlSpider从主页开始并抓取他们的网站。对于每个页面,我想使用Xpath来提取所有href。并以键值对的格式存储数据。
键:当前的Url 值:此页面上的所有链接。
class MySpider(CrawlSpider):
name = 'abc.com'
allowed_domains = ['abc.com']
start_urls = ['http://www.abc.com']
rules = (Rule(SgmlLinkExtractor()), )
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
item = AbcItem()
item['key'] = response.url
item['value'] = hxs.select('//a/@href').extract()
return item
我定义我的AbcItem()如下所示:
来自scrapy.item import Item,Field
class AbcItem(Item):
# key: url
# value: list of links existing in the key url
key = Field()
value = Field()
pass
当我像这样运行我的代码时:
nohup scrapy crawl abc.com -o output -t csv &
机器人似乎开始爬行,我可以看到nohup.out文件被所有配置日志填充但是我的输出文件中没有信息..这是我想要收集的,任何人都可以帮助我有了这个?我的机器人可能出了什么问题?
答案 0 :(得分:4)
您应该为规则定义回调。以下是从twitter.com
主页(follow=False
)获取所有链接的示例:
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.item import Item, Field
class MyItem(Item):
url= Field()
class MySpider(CrawlSpider):
name = 'twitter.com'
allowed_domains = ['twitter.com']
start_urls = ['http://www.twitter.com']
rules = (Rule(SgmlLinkExtractor(), callback='parse_url', follow=False), )
def parse_url(self, response):
item = MyItem()
item['url'] = response.url
return item
然后,在输出文件中,我看到:
http://status.twitter.com/
https://twitter.com/
http://support.twitter.com/forums/26810/entries/78525
http://support.twitter.com/articles/14226-how-to-find-your-twitter-short-code-or-long-code
...
希望有所帮助。
答案 1 :(得分:0)
如果您没有明确设置回调函数,scrapy将使用方法parse
来处理已爬网页面。所以,您应该将parse_item添加为回调,或者将其名称更改为parse。