首页 > 代码库 > 一个咸鱼的python爬虫之路(五):scrapy 爬虫框架
一个咸鱼的python爬虫之路(五):scrapy 爬虫框架
介绍一下scrapy 爬虫框架
安装方法 pip install scrapy 就可以实现安装了。我自己用anaconda 命令为conda install scrapy。
1 Engine从Spider处获得爬取请求(Request)
2Engine将爬取请求转发给Scheduler,用于调度
3 Engine从Scheduler处获得下一个要爬取的请求
4 Engine将爬取请求通过中间件发送给Downloader
5 爬取网页后,Downloader形成响应(Response)通过中间件发给Engine
6 Engine将收到的响应通过中间件发送给Spider处理Engine将爬取请求转发给Scheduler,用于调度
7 Spider处理响应后产生爬取项(scraped Item)
和新的爬取请求(Requests)给Engine
8 Engine将爬取项发送给Item Pipeline(框架出口)
9 Engine将爬取请求发送给Scheduler
Engine控制各模块数据流,不间断从Scheduler处
获得爬取请求,直至请求为空
框架入口:Spider的初始爬取请求
框架出口:Item Pipeline
Engine
(1) 控制所有模块之间的数据流
(2) 根据条件触发事件
不需要用户修改
Downloader
根据请求下载网页
不需要用户修改
Scheduler
对所有爬取请求进行调度管理
不需要用户修改
Downloader Middleware
目的:实施Engine、Scheduler和Downloader
之间进行用户可配置的控制
功能:修改、丢弃、新增请求或响应
用户可以编写配置代码
Spider
(1) 解析Downloader返回的响应(Response)
(2) 产生爬取项(scraped item)
(3) 产生额外的爬取请求(Request)
需要用户编写配置代码
Item Pipelines
(1) 以流水线方式处理Spider产生的爬取项
(2) 由一组操作顺序组成,类似流水线,每个操
作是一个Item Pipeline类型
(3) 可能操作包括:清理、检验和查重爬取项中
的HTML数据、将数据存储到数据库
需要用户编写配置代码
了解了基本概念之后我们开始写第一个scrapy爬虫吧。
首先要新建一个爬虫项目scrapy startproject xxx(项目名)
这个爬虫就简单的爬取一个小说网站的书名与作者吧。
我们现在创建了爬虫项目book现在来编辑他的配置
二级book目录下这些就是配置文件上面已经介绍过了,在修改这些之前
我们现在一级book目录下创建一个start.py 来用于scrapy爬虫能在IDE里
面运行。文件里面写下如下代码。
前两个参数是固定的,第三个参数是你spider的名字
接下来我们就在items里面填写字段:
然后在spider中创建爬虫主程序book.py
我们要爬取的网站为http://book.km.com/
通过点击网站不同种类小说会发现网站地址是http://book.km.com/+小说种类拼音.html
通过这个我们来写读取网页的内容
得到这个之后我们通过parse 函数来解析所获取的网页并提取所需信息。
网页分析提取数据是通过BeautifulSoup库来的,这里就略了。自己分析2333~
程序写好我们要存储所爬取的信息就要编辑Pipelines.py 了
这里提供两个保存方式
1保存为txt文本
2 存入数据库
要让这个成功运行我们还需要在setting.py中配置
ITEM_PIPELINES = { ‘book.pipelines.xxx‘: 300,}
xxx为存储方法的类名,想用什么方法存储就改成那个名字就好运行结果没什么看头就略了
第一个爬虫框架就这样啦期末忙没时间继续完善这个爬虫之后有时间将这个爬虫完善成把小说内容等一起爬下来的程序再来分享一波。
附一个book的完整代码:
import scrapy from bs4 import BeautifulSoup from book.items import BookItem class Bookspider(scrapy.Spider): name = ‘book‘ #名字 allowed_domains = [‘book.km.com‘] #包含了spider允许爬取的域名(domain)列表(list) zurl=‘http://book.km.com/‘ def start_requests(self): D=[‘jushi‘,‘xuanhuan‘] #数组里面包含了小说种类这里列举两个有需要可以自己添加 for i in D: #通过循环遍历 url=self.zurl+i+‘.html‘ yield scrapy.Request(url, callback=self.parse) def parse(self, response): imf=BeautifulSoup(response.text,‘lxml‘) b=imf.find_all(‘dl‘,class_=‘info‘) for i in b: bookname=i.a.string author = i.dd.span.string item = BookItem() item[‘name‘] = bookname item[‘author‘] = author yield item
一个咸鱼的python爬虫之路(五):scrapy 爬虫框架