Scrapy
概述
架构
引擎:负责数据流
数据流
引擎(向爬虫器请求第一个要抓取的url)
-爬虫器(提供url给引擎)
-引擎(接受网址,交给调度器排序入队)
-调度器(处理成请求给引擎)
-引擎(接受请求并通过下载器中间件给下载器下载)
-下载器
-引擎(收到response并通过爬虫器中间件给爬虫器处理)
-爬虫器(处理response,返回结果item给引擎,如有跟进的请求request也会给引擎)-引擎(接收到item,交给管道;新的request给调度器)-管道(存储数据)
创建一个Scrapy项目
进入一个自定义目录 cd C:…
运行命令:scrapy startproject blogSpider
可以看到目录下有一个文件夹。
在开始定义爬虫前我们需要定义爬虫的目标字段,如标题、链接等等就需要在items.py文件中进行适当修改
Import scrapy
Class BlogspiderItem(scrapy.Item)
title= scrapy.Field()
link= scrapy.Field()
content=scrapy.Field()
获取博客网址并保存
在当前目录下输入
scrapy genspider santostang www.santostang.com
这就建立了一个santostang.py的文件,规定了爬取的网址。这就是爬虫器。
修改parse()中的内容获取网页并保存在本地:
def parse(self,response):
filename=”index.html”
with open(filename,’w’,encoding=”utf-8”) as f:
f.write(response.text)
运行并在cmd的blogSpider目录下执行:
scrapy crawl santostang
进入文件夹可以看到出现了index.html文件,这就是爬的源代码。
接下来需要提取数据,虽然Scrapy自带了Xpath和CSS选择器,但我们为方便还是采用BeautifulSoup来获取数据。修改santostang.py:
def parse(self,response):
soup=BeautiulSoup(response.text,“lxml”)
first_title=soup.find(“h1”,class_=”post-title”).a.text.strip()
print(first_title)
for i in range(len(title_list)):
title=title_list[i].a.text.strip()
print(…)
如想用Scrapy处理item的方法,可以用之前定义的BlogspiderItem类
存储博客标题和链接数据
打开pipelines.py,修改代码:
file_path=...
...
def process_item(self,item,spider):
...
self.article.write(output)
修改设置文件,去注释后输入
scrapy crawl santostang
获取文章内容
yield?
回调函数
Scrapy设置文件
ROBOTSTXT_OBEY=True
取消5行注释。