Scrapy是为了爬取网站数据,提取结构性数据而编写的应用框架。
这篇文章将简要的介绍一下scrapy项目的基本结构,并且通过一个项目来演示整个开发流程。
scrapy的安装我们使用的是pip命令:
pip install Scrapy
首先在命令行中进入存储项目的目录中,运行如下代码:
scrapy startproject tutorial
随后自动创建一个初步的scrapy项目,项目的目录结构如下所示:
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
middlewares.py
settings.py
spiders/
__init__.py
...
- scrapy.cfg:项目配置文件
- tutorial/items.py:项目的item文件
- tutorial/pipelines.py:项目的管道文件
- tutorial/middlewares.py:项目的中间件
- tutorial/settings.py:项目的设置文件
- tutorial/spiders/:编写爬虫代码的地方
Scrapy项目需要进行代码编写的主要包括items.py、settings.py、pipelines.py、spiders这几个部分.
通过cd命令进入项目
定义Item
在tutorial/items.py中定义item。
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
text=scrapy.Field()
Item是一种简单的容器,用于保存爬取到的数据。
编写爬虫
我们在spiders下新建spider.py文件
import scrapy
from scrapy import Request
from ..items import TutorialItem
class TutorialSpider(scrapy.Spider):
name="csdn"
allowed_domains=["csdn.net"]
start_urls=["https://blog.csdn.net/dxk_093812/article/details/81197272"]
def parse(self,response):
item=TutorialItem()
text=response.xpath('//*[@id="article_content"]/div/p[1]/text()').extract()
item['text']=text
yield item
其中name是爬虫的名字,是唯一的,用于区别spider;start_urls表示爬虫启动时进行爬取的url列表;allow_domains用于过滤爬取的域名,不在内的域名不进行爬取。
在parse函数中,我们实例化了一个item对象,并且使用xpath表达式提取网页中的内容。关于xpath的内容今后细说。
在pipeline中处理item
在tutorial/pipelines.py下对item进行处理,在spider中获取的item对象会被传送到pipeline中进行后续的处理,可以将其持久化保存到数据库或者文件中。
我们在当前目录下创建了一个test.txt文件用于保存爬取到的文本数据。
import os
class TutorialPipeline(object):
def process_item(self, item, spider):
file_name='\\test'
file_path= os.getcwd()
with open(file_path+file_name+'.txt','wb') as fp:
fp.write(''.join(item['text']).encode('utf-8'))
设置
需要在tutorial/settings.py中启用pipeline组件。数值一般为0-1000。数值越小越先执行。
ITEM_PIPELINES = {
'tutorial.pipelines.TutorialPipeline': 300,
}
接下来,我们就可以启动项目,在命令行中执行
scrapy crawl csdn
然而发现并没有爬取到什么东西,看看运行结果发现
robots.txt 是遵循 Robot协议 的一个文件,它保存在网站的服务器中,它的作用是,告诉搜索引擎爬虫,本网站哪些目录下的网页不希望你进行爬取。在Scrapy启动后,会在第一时间访问网站的robots.txt 文件,然后决定该网站的爬取范围。
所以我们在settings.py中将ROBOTSTXT_OBEY = True修改为False。再次运行,项目下出现test.txt文件,打开可以看到我们需要获取的文本。程序的运行结果详情如下。
实现一个scrapy程序的步骤大概就是这样,当然中间涉及到的知识非常多,不仅仅是这些,这里只是简单的对scrapy程序进行初步的了解。后续会更加详细的学习scrapy。