之前接触scrapy本来是想也许scrapy能够让我的爬虫更快,但是也许是我没有掌握scrapy的要领,所以爬虫运行起来并没有我想象的那么快,看这篇文章就是之前使用scrapy的写得爬虫。然后昨天我又看到了pyspider,说实话本来只是想看看,但是没想到一看就让我喜欢上了pyspider。
先给大家看一下pyspider的后台截图:
安装pyspider:pip install pyspider
目测pyspider只支持32位系统,因为安装pyspider前需要先安装一个依赖库:pycurl,而pycurl只支持32位系统,虽然我也在csdn找到别人重新编译过的pycurl,能够在64位安装,然后pyspider也确实安装上去了,但是并不完美!!这里说一下,不完美处就是无法进行调试!!调试很重要吧?
抱着对pyspider的喜爱,我就果断的重装系统了!
如果你是32位系统,就这样安装:
pip install pycurlpip install pyspider
如果你是64位系统,且不是强迫症,能够接受不完美的事物,就这样安装:
下载重新编译过的pycurl,然后安装。
然后cmd输入:pip install pyspider
打开cmd,输入pyspider,然后打开浏览器输入:http://localhost:5000, 然后就可以进入pyspider的后台了。
第一次打开后台是一片空白的。(点开浏览器后cmd不要关了!)点击Create,随便输入一个名字(当然名字还是不要乱取)。
点击确定之后就进入一个脚本编辑器了
创建项目的时候也自动创建了一个脚本,这里我们只需要改动脚本OK。我们要爬豆瓣的所有电影,选择http://movie.douban.com/tag/为起始点,也就是从这里开始爬。首先是改动on_start
@every(minutes=24 * 60)def on_start(self): self.crawl('http://movie.douban.com/tag/', callback=self.index_page)
这里没什么讲的,改个网址而已,callback就是调用下一个函数开始这个起始网页。
5. 改动index_page函数
我们先来看一下启示网页张怎样?
index_page
我是怎么改的。@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('#content>div>div.article> table:nth-child(9)>tbody>tr>td>a').items(): a=each.attr.href.replace('www','movie') self.crawl(a,callback=self.list_page)
可以看到我们是从response.doc之中选择tag的,然后 #content>div>div.article> table:nth-child(9)>tbody>tr>td>a
熟悉css selector的朋友可能会很熟悉这种东西,然而我是第一次接触,所以讲不出个所以然来。其实css selector跟正则表达式、xpath一样,也是一种内容选择的方法,然后也很好理解这是什么意思。
这是分隔符,熟悉css selector的朋友可以不用看下面的部分
我们先看一下
http://movie.douban.com/tag/
for each in response.doc('#content>div>div.article> table:nth-child(9)>tbody>tr>td>a').items()
括号里面,告诉爬虫,我们要爬的部分在这个path下!
这就是一个得到css path的方法,就连我这个第一次接触css selector的人都可以找到
下面回归
接着是
a=each.attr.href.replace('www','movie')self.crawl(a,callback=self.list_page)
我们先把符合上面css path规则的部分进行了替换,把www替换为了movie。为什么这样做呢?我们分别打开
http://www.douban.com/tag/2013/?focus=movie
和
http://movie.douban.com/tag/2013/?focus=movie
来看。
self.crawl(a,callback=self.list_page)
这段代码就是把得到的类似http://movie.douban.com/tag/2013?focus=movie的网页交给了下一个函数去解析了!
改动list_page函数
@config(age=10*24*60*60)def list_page(self,response):#获得电影详细内容链接并交给下一个函数处理 for each in response.doc('td > .pl2 > a').items(): self.crawl(each.attr.href,callback=self.detail_page)#翻页,然后继续由list_page函数处理 for each in response.doc('.next > a').items(): self.crawl(each.attr.href,callback=self.list_page)
这里的css path我是有pyspider自带的css selector helper得到的。说到这里就再讲一下pyspider自带的css selector helper怎么用(当然这不是万能的,要不然上面我也不会用浏览器的审查元素进行获取css path)
我们先点击脚本编辑器的中间上方的run
@config(priority=2)def detail_page(self, response): return { "url": response.url, "title":response.doc('* > * > div#wrapper > div#content > h1 > span').text(), "rate":response.doc('.rating_num').text(), "导演":response.doc('#info > span:nth-child(1) > span.attrs > a').text() }
这个就简单了,已经到了电影详细内容网页,就看你要什么内容,然后利用css selector helper进行选择就可以了!我这里只返回了url、电影标题、评分和导演四项!
到这里,爬虫基本上写完了,点击save,返回dashboard,把爬虫的状态改成Running或者debug,然后再点击右方的run,爬虫就启动了!!
另外这里还有很多的demo哦!http://demo.pyspider.org/
联系客服