学习scrapy并不需要自己python基础多么好(我就是吃果果的例子),相反其实只要浏览过一遍python基础知识,就可以学习scrapy框架了,因为框架都是将比较复杂的内容封装,提供给用户一些简单的API。所以完全可以在学习scrapy框架的时候强化python基础。
环境
python : 3.5
scrapy: 1.5(当前最新)
pycharm: community(社区版,免费)
1.安装scrapy
pip install scrapy
//可能会报错 error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools
错误大概意思,就是缺少编译工具,需要下载virtual C++什么的。但是呢我是学python的下载c编译工具干嘛。所以直接下载twisted组件(事件驱动的网络引擎),scrapy是基于twisted的,找到和自己python版本对应的文件下载就可以了。详情请参考
安装twistwd组件并再次安装scrapy
pip install twistwd文件路径
pip install scrapy
2.新建scrapy项目
scrapy startproject projectName
//--------------------------------------
E:\>scrapy startproject firstScrapy
New Scrapy project 'firstScrapy', using template directory 'd:\\software1\\python\\lib\\site-packages\\scrapy\\templates\\project', created in:
E:\firstScrapy
You can start your first spider with:
cd firstScrapy
scrapy genspider example example.com
需要说明的是项目名称不能是*路径*,也就是需要在本路径下新建项目,并且名称只能为字母
项目目录结构
firstScrapy/
scrapy.cfg
firstScrapy/
__init__.py
items.py
pipelines.py
settings.py
spidders/
__init__.py
- spidders 存放spiders文件(自定义爬虫)的目录
- scrapy.cfg 项目配置文件,用于配置部署信息和项目配置文件路径
- settings.py 爬虫的配置文件,用于配置一些公共特性。例:图片存储路径,数据管道,自定义中间件等
- items.py 项目中的自定义item类存放该模块下(需要继承scrapy.Item),Item就类似于与数据库表所对应的实体类,毕竟面向对象操作更容易些
- pipelines.py 项目中自定义pipelines类,独立的类 用于对item中的数据做进一步处理 比如去重,数据保存
3.使用默认模板新建一个爬虫
切换到项目根路径下。因为新建一个scrapy项目,
cd firstScrapy
---------------------------------
scrapy genspider spiderName domain
-
spiderName 爬虫的名字,自定义
-
domain要爬取的网页 的域名,自定义
比如我要爬取伯乐在线的博客scrapy genspiser jobbole blog.jobbole.com/all-posts/
firstScrapy/firstScrapy/spiders 下会发现多了一个jobbole .py文件
class JobboleSpider(scrapy.Spider):
name = 'jobbole' //爬虫的名字
allowed_domains = ['blog.jobbole.com'] //允许爬取网页的域名
start_urls=['http://blog.jobbole.com/all-posts/']//爬取的路径
def parse(self, response): //网页解析数据处理的核心方法
pass
现在我们写一点具体的逻辑,比如我想获取该页所有文章的标题
def parse(self,response):
titles= response.xpath("//a[@class='archive-title']/text()").extract()
print("文章标题 %s"%titles)
#####4.启动爬虫
scrapy crawl spiderName //启动指定名称的爬虫
----------------------------------------
scrapy crawl jobbole
运行效果如下
上面的输出其实是在scrapy 终端中,使用内置对象response输出的。顺便提一句很多时候定位元素的时候不能一次就成功,这样就需要修改一次运行一次项目。所以可以使用scrapy终端,方便进行xpath,css等表达式的测试。
调用上面的命令实际上,Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。
Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。
#####启动scrapy 终端
上面也提到了,scrapy终端方便进行测试。
启动终端
scrapy shell url //url是需要测试的网页的具体路径
注意: scrapy crawl spiderName 命令需要在项目目录下使用。
可能出现的问题:
KeyError: 'Spider not found: jobble'
大概意思就是名字为jobble的爬虫找不到,可能的原因有两种或者说是一种,就是还没有创建改名字爬虫或者创建了但是爬虫的名字拼写错误。在spidders目录下检查是否存在jobble.py,结合实际情况找到对应的解决方法。