正文
scrapy
-
ctl
.py
shell
http
:
/
/
mindhacks
.cn
它会启动 crawler ,把命令行指定的这个页面抓取下来,然后进入 shell ,根据提示,我们有许多现成的变量可以用,其中一个就是
hxs
,它是一个
HtmlXPathSelector
,mindhacks 的 HTML 页面比较规范,可以很方便的直接用
XPath
进行分析。通过 Firebug 可以看到,到每篇 blog 文章的链接都是在
h1
下的,因此在 Shell 中使用这样的 XPath 表达式测试:
In
[
1
]
:
hxs
.x
(
'//h1/a/@href'
)
.extract
(
)
Out
[
1
]
:
[
u
'http://mindhacks.cn/2009/07/06/why-you-should-do-it-yourself/'
,
u
'http://mindhacks.cn/2009/05/17/seven-years-in-nju/'
,
u
'http://mindhacks.cn/2009/03/28/effective-learning-and-memorization/'
,
u
'http://mindhacks.cn/2009/03/15/preconception-explained/'
,
u
'http://mindhacks.cn/2009/03/09/first-principles-of-programming/'
,
u
'http://mindhacks.cn/2009/02/15/why-you-should-start-blogging-now/'
,
u
'http://mindhacks.cn/2009/02/09/writing-is-better-thinking/'
,
u
'http://mindhacks.cn/2009/02/07/better-explained-conflicts-in-intimate-relationship/'
,
u
'http://mindhacks.cn/2009/02/07/independence-day/'
,
u
'http://mindhacks.cn/2009/01/18/escape-from-your-shawshank-part1/'
]
这正是我们需要的 URL ,另外,还可以找到“下一页”的链接所在,连同其他几个页面的链接一同在一个
div
里,不过“下一页”的链接没有
title
属性,因此 XPath 写作
/
/
div
[
@
class
=
"wp-pagenavi"
]
/
a
[
not
(
@
title
)
]
不过如果向后翻一页的话,会发现其实“上一页”也是这样的,因此还需要判断该链接上的文字是那个下一页的箭头
u'\xbb'
,本来也可以写到 XPath 里面去,但是好像这个本身是 unicode escape 字符,由于编码原因理不清楚,直接放到外面判断了,最终
parse
函数如下:
def
parse
(
self
,
response
)
:
items
=
[
]
hxs
=
HtmlXPathSelector
(
response
)
posts
=
hxs
.
x
(
'//h1/a/@href'
)
.
extract
(
)
items
.
extend
(
[
self
.
make_requests_from_url