Python 2.7
IDE Pycharm 5.0.3
Scrapy 1.0.3
Scrapy框架不多解释,这篇很详细,但是代码部分不适用于现在的Dmoz网站,什么是Scrapy框架,第一个小程序
请务必先看这个,不然看以下会云里雾里哒
昨天开始接触Scrapy框架,感觉还是挺新奇的,但是跟着例子做,基本上网上的教程,几乎完全一致的对Dmoz网站进行目录抓取,测试对其title对应的link,description进行抓取,而且!代码都特么是一样的,时间久远,Dmoz网站的编码和他们出教程的时候已经不一样了,虽然,现在看来只不过是对参数进行替换而已,但对于我们这种刚接触Scrapy的小白来说,首先得依瓢画葫芦,但是这个瓢,都特么是坏的!!
折腾了我差不多三个小时(见笑了),收获在于解决了:
1.IndentationError: unindent does not match any outer indentation level
问题原因:请不要使用Notepad++进行编辑,不是说不好,但是纠错能力显然没有Pycharm来得好,编辑过程中如果有拷贝代码的现象,请注意缩进!!!Python的灵魂在于缩进!
解决方案:使用Pycharm进行编辑,拷贝时候注意缩进!
2.ImportError: No module named tutorial.items
问题原因:执行路径中没有tutorial目录,所以找不到模块和包
解决方案:在dmoz_spider.py中开头加上路径的导入
import sys
try:
sys.path.append("C:\\Users\\MrLevo\\Desktop\\tutorial")
#每台电脑路径不一样,自己看tutorial项目在哪
except:
pass
#print sys.path
然后在此之后再尝试from tutorial.items import DmozItem
3.scrapy [boto] ERROR: Caught exception reading instance data
具体表现:
问题原因:未知(以后补充)
解决方案:
1.在setting.py中加入
DOWNLOAD_HANDLERS = {'s3': None,}
2如果问题还没解决:
尝试在dmoz_spider中加入:
from scrapy import optional_features
optional_features.remove('boto')
这只是不抛出错误而已,对后续爬内容没有影响,暂且只能这么解决,dmoz还是没有出现。如果有谁知道,麻烦留言告知,先谢过。
第一阶段代码
目的:初结识,测试shell,response
以下是dmoz_spider.py代码,放在spiders文件夹下,和 init.py同一级目录。
from scrapy.spiders import Spider
from scrapy.selector import Selector
import scrapy
from scrapy import optional_features
optional_features.remove('boto')
#为了解决scrapy [boto] ERROR: Caught exception reading instance data问题
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ['dmoz.org']
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename,'wb') as f:
f.write(response.body)
以下是items.py代码:
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class DmozlItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() link = scrapy.Field() desc = scrapy.Field()
最初一级目录是这样的:
这都是我跑完几次之后的,上面那张图刚开始之后cfg文件和tutorial文件夹而已!这个之后说
接下来是在cmd窗口开始爬:
这是title的目录结构
在cmd窗应该这样:
取出超链接应该这样操作:
这是desc的目录结构:
需要这样操作:
至于怎么操作,为什么是sel,//,@什么的,具体看开头给的超链接,那里很详细写,我这里只放更新后的实现代码!!!
dmoz_spider.py代码
目的:将title,link,desc存储在dict中,对应起来。
import sys
try:
sys.path.append("C:\\Users\\MrLevo\\Desktop\\tutorial")
except:
pass
#print sys.path
from tutorial.items import DmozItem
from scrapy.spiders import Spider
from scrapy.selector import Selector
import scrapy
from scrapy import optional_features
optional_features.remove('boto')
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ['dmoz.org']
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//div[@class="title-and-desc"]')
items = []
for site in sites:
item=DmozItem()
item['title'] = site.xpath('a/div/text()').extract()
item['link'] = site.xpath('a/@href').extract()
item['desc'] = site.xpath('div/text()').extract()
items.append(item)
return items
还有items代码
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
from scrapy.item import Item,Field
class DmozItem(Item): # define the fields for your item here like: # name = scrapy.Field() title = Field() link = Field() desc = Field()
items.py没怎么修改,就改规范了点。
正常爬应该是这样的;
很多,没截完,可以看出,对应存储在dict中了
之后就把它导出成json文件:
然后项目文件夹中会出现一个items.json文件,可以用编辑器打开,是这逼样的;
全部抓起来了,但是空格还没去,还有一些乱七八糟的/t/n什么的,我想用正则抓一下或者split试一下应该可以,主要是Scrapy的使用,累死宝宝了,再此更新下Dmoz的抓取代码。虽然很基础很基础,但是初学者需要瓢啊!!!给我们瓢啊!!不然怎么画葫芦!!!!(委屈脸)