Scrapy 框架基本了解以及Spiders爬虫,首先我们先了解下Scrapy 框架基本原理,然后我们用一个简单的案例来介绍Scrapy的使用。
Scrapy 框架基本了解:
1、Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。
2、框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。
3、Scrapy 使用了 Twisted'twɪstɪd异步网络框架来处理网络通讯,可以加快我们的下载速度,不用自己去实现异步框架,并且包含了各种中间件接口,可以灵活的完成各种需求。
4、Scrapy框架流程图
① Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
② Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
③ Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
④ Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
⑥ Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
⑦ Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
⑧ Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)。
Scrapy 框架Spiders步骤:
1、创建一个Scrapy项目scrapy startproject mySpider
2、定义提取的结构化数据(Item)
3、编写爬取网站的 Spider 并提取出结构化数据(Item)
scrapy genspider example example.com
scrapy.cfg :项目的配置文件
mySpider/ :项目的Python模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
4、编写 Item Pipelines 来存储提取到的Item(即结构化数据)
在mySpider目录下执行:scrapy crawl itcast
保存数据:
scrapy保存信息的最简单的方法主要有四种,-o 输出指定格式的文件,命令如下:
# json格式,默认为Unicode编码
scrapy crawl itcast -o teachers.json
# json lines格式,默认为Unicode编码
scrapy crawl itcast -o teachers.jsonl
# csv 逗号表达式,可用Excel打开
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml
5、Spiders爬取某个培训结构老师的信息
items.py
模型类
import scrapy
# Item 定义结构化数据字段,用来保存爬取到的数据
class TeacherinfoItem(scrapy.Item):
# 获取名字
name = scrapy.Field()
# 职称
position = scrapy.Field()
# 个人信息
info = scrapy.Field()
myteacher.py
爬虫文件
# -*- coding: utf-8 -*-
import scrapy
from teacherInfo.items import TeacherinfoItem
class MyteacherSpider(scrapy.Spider):
name = 'myteacher'
allowed_domains = ['itcast.cn']
# start_urls = ("http://www.itcast.cn/channel/teacher.shtml",) 元组也可以
start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ac',
'http://www.itcast.cn/channel/teacher.shtml#acloud',
'http://www.itcast.cn/channel/teacher.shtml#adesign',
'http://www.itcast.cn/channel/teacher.shtml#ads',
'http://www.itcast.cn/channel/teacher.shtml#ajavaee',
'http://www.itcast.cn/channel/teacher.shtml#anetmarket',
'http://www.itcast.cn/channel/teacher.shtml#aphp',
'http://www.itcast.cn/channel/teacher.shtml#apm',
'http://www.itcast.cn/channel/teacher.shtml#apython',
'http://www.itcast.cn/channel/teacher.shtml#astack',
'http://www.itcast.cn/channel/teacher.shtml#atest',
'http://www.itcast.cn/channel/teacher.shtml#aui',
'http://www.itcast.cn/channel/teacher.shtml#auijp',
'http://www.itcast.cn/channel/teacher.shtml#aweb']
# 爬虫的约束区域
def parse(self, response):
# 存放老师信息的集合
items = []
print(response.body)
for each in response.xpath("//div[@class='li_txt']"):
# 将我们得到的数据封装到一个 `ItcastItem` 对象
item = TeacherinfoItem()
# extract()方法返回的都是unicode字符串
name = each.xpath("h3/text()").extract()
position = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
# xpath返回的是包含一个元素的列表
item['name'] = name[0]
item['position'] = position[0]
item['info'] = info[0]
items.append(item)
yield item
# 直接返回最后数据
# return items
pipelines.py
管道
import json
import codecs
class TeacherinfoPipeline(object):
def __init__(self):
self.filename = codecs.open('teacher.json','wb','utf-8')
def process_item(self, item, spider):
print(item)
html = json.dumps(dict(item),ensure_ascii=False)
self.filename.write(html + '\n')
return item
def open_spider(self, spider):
pass
# self.filename.close()
settings.py
基本设置
BOT_NAME = 'teacherInfo'
SPIDER_MODULES = ['teacherInfo.spiders']
NEWSPIDER_MODULE = 'teacherInfo.spiders'
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0)'
ROBOTSTXT_OBEY = True
SPIDER_MIDDLEWARES = {
'teacherInfo.middlewares.TeacherinfoSpiderMiddleware': 543,
}
ITEM_PIPELINES = {
'teacherInfo.pipelines.TeacherinfoPipeline': 300,
}
begin.py
运行和调试文件
from scrapy import cmdline
cmdline.execute('scrapy crawl myteacher'.split())
配置begin.py文件请移步PyCharm运行和调试Scrapy
了解这么多,就可以使用Scrapy框架爬虫了,一起学习。