返回信息流RT,楼主拿自己的博客练手,想用Scrapy把自己博客下所有文章的标题和链接爬取下来。代码如下:
``` bash
# -*- coding:utf-8 -*-
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from BlogScrapy.items import BlogscrapyItem
class BlogScrapy(CrawlSpider):
name = "BlogScrapyXRQ"
#download_delay = 2
allowed_domains = ['hexo.rickyxu.me']
start_urls = ['http://hexo.rickyxu.me/2015/09/21/Python%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB%E5%85%A5%E9%97%A8%E7%AC%94%E8%AE%B0/']
rules = [
Rule(SgmlLinkExtractor(allow=('/2015'),restrict_xpaths=("//a[@id='article-nav-older']")),
callback='parse_item',
follow = True)
]
#print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
def parse_item(self, response):
#print "??????????????????????????????????????"
item = BlogscrapyItem()
sel = Selector(response)
blog_url = str(response.url)
blog_name = sel.xpath("//h1[@class='article-title']/text()").extract()
print str(blog_name)
item['article_name'] = [n.encode('utf-8') for n in blog_name]
item['article_url'] = blog_url.encode('utf-8')
yield item
```
但是在执行后发现起始链接start_url中的内容并没有爬下来。从第二篇日志才开始爬,这是为什么呢?
另外,在rules中restrict_xpaths=("//a[@id='article-nav-older']")这儿的XPath语句我一开始写的是"//a[@id='article-nav-older']//../@href",结果没法爬取。但是这个XPath语句对应的XPath Checker结果如下图:
按理说应该可以的呀。
反而可以爬到内容的XPath语句"//a[@id='article-nav-older']"对应的XPath Checker结果是这样:
按理说这个样子不是上一篇文章的链接啊,怎么反而给成功了?
另外,即使获取到下一篇的链接,但是也是仅仅有后半部分(“/2015/09/10/管理你的Linux桌面启动器/”这样的),没有加上我的http://hexo.rickyxu.me呀,为什么还能爬取成功呢?难道会自动加上allowed_domains吗?
刚开始接触Python和爬虫,基础比较差,遇到好多好多的问题,一直知道版上混迹的都是大神,特来求教,非常感谢!
这是一条镜像帖。来源:北邮人论坛 / python / #8788同步于 2015/9/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【求助】Scrapy应用Rules的一个问题
Pod
2015/9/23镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复