Scrapy 框架基本了解以及Spiders爬蟲已旧,首先我們先了解下Scrapy 框架基本原理,然后我們用一個(gè)簡(jiǎn)單的案例來介紹Scrapy的使用张咳。
Scrapy 框架基本了解:
1现柠、Scrapy是用純Python實(shí)現(xiàn)一個(gè)為了爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)而編寫的應(yīng)用框架谷暮,用途非常廣泛。
2、框架的力量企孩,用戶只需要定制開發(fā)幾個(gè)模塊就可以輕松的實(shí)現(xiàn)一個(gè)爬蟲,用來抓取網(wǎng)頁內(nèi)容以及各種圖片袁稽,非常之方便勿璃。
3、Scrapy 使用了 Twisted'tw?st?d異步網(wǎng)絡(luò)框架來處理網(wǎng)絡(luò)通訊推汽,可以加快我們的下載速度补疑,不用自己去實(shí)現(xiàn)異步框架,并且包含了各種中間件接口歹撒,可以靈活的完成各種需求莲组。
4、Scrapy框架流程圖
① Scrapy Engine(引擎): 負(fù)責(zé)Spider暖夭、ItemPipeline锹杈、Downloader、Scheduler中間的通訊迈着,信號(hào)竭望、數(shù)據(jù)傳遞等。
② Scheduler(調(diào)度器): 它負(fù)責(zé)接受引擎發(fā)送過來的Request請(qǐng)求寥假,并按照一定的方式進(jìn)行整理排列市框,入隊(duì),當(dāng)引擎需要時(shí)糕韧,交還給引擎枫振。
③ Downloader(下載器):負(fù)責(zé)下載Scrapy Engine(引擎)發(fā)送的所有Requests請(qǐng)求,并將其獲取到的Responses交還給Scrapy Engine(引擎)萤彩,由引擎交給Spider來處理粪滤。
④ Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù)雀扶,并將需要跟進(jìn)的URL提交給引擎杖小,再次進(jìn)入Scheduler(調(diào)度器)。
⑥ Item Pipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item愚墓,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析予权、過濾、存儲(chǔ)等)的地方浪册。
⑦ Downloader Middlewares(下載中間件):你可以當(dāng)作是一個(gè)可以自定義擴(kuò)展下載功能的組件扫腺。
⑧ Spider Middlewares(Spider中間件):你可以理解為是一個(gè)可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)。
Scrapy 框架Spiders步驟:
1村象、創(chuàng)建一個(gè)Scrapy項(xiàng)目scrapy startproject mySpider
2笆环、定義提取的結(jié)構(gòu)化數(shù)據(jù)(Item)
3攒至、編寫爬取網(wǎng)站的 Spider 并提取出結(jié)構(gòu)化數(shù)據(jù)(Item)
scrapy genspider example example.com
scrapy.cfg :項(xiàng)目的配置文件
mySpider/ :項(xiàng)目的Python模塊,將會(huì)從這里引用代碼
mySpider/items.py :項(xiàng)目的目標(biāo)文件
mySpider/pipelines.py :項(xiàng)目的管道文件
mySpider/settings.py :項(xiàng)目的設(shè)置文件
mySpider/spiders/ :存儲(chǔ)爬蟲代碼目錄
4躁劣、編寫 Item Pipelines 來存儲(chǔ)提取到的Item(即結(jié)構(gòu)化數(shù)據(jù))
在mySpider目錄下執(zhí)行:scrapy crawl itcast
保存數(shù)據(jù):
scrapy保存信息的最簡(jiǎn)單的方法主要有四種迫吐,-o 輸出指定格式的文件,命令如下:
# json格式账忘,默認(rèn)為Unicode編碼
scrapy crawl itcast -o teachers.json
# json lines格式志膀,默認(rèn)為Unicode編碼
scrapy crawl itcast -o teachers.jsonl
# csv 逗號(hào)表達(dá)式,可用Excel打開
scrapy crawl itcast -o teachers.csv
# xml格式
scrapy crawl itcast -o teachers.xml
5闪萄、Spiders爬取某個(gè)培訓(xùn)結(jié)構(gòu)老師的信息
items.py
模型類
import scrapy
# Item 定義結(jié)構(gòu)化數(shù)據(jù)字段,用來保存爬取到的數(shù)據(jù)
class TeacherinfoItem(scrapy.Item):
# 獲取名字
name = scrapy.Field()
# 職稱
position = scrapy.Field()
# 個(gè)人信息
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']
# 爬蟲的約束區(qū)域
def parse(self, response):
# 存放老師信息的集合
items = []
print(response.body)
for each in response.xpath("http://div[@class='li_txt']"):
# 將我們得到的數(shù)據(jù)封裝到一個(gè) `ItcastItem` 對(duì)象
item = TeacherinfoItem()
# extract()方法返回的都是unicode字符串
name = each.xpath("h3/text()").extract()
position = each.xpath("h4/text()").extract()
info = each.xpath("p/text()").extract()
# xpath返回的是包含一個(gè)元素的列表
item['name'] = name[0]
item['position'] = position[0]
item['info'] = info[0]
items.append(item)
yield item
# 直接返回最后數(shù)據(jù)
# 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
基本設(shè)置
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
運(yùn)行和調(diào)試文件
from scrapy import cmdline
cmdline.execute('scrapy crawl myteacher'.split())
配置begin.py文件請(qǐng)移步PyCharm運(yùn)行和調(diào)試Scrapy
了解這么多梧却,就可以使用Scrapy框架爬蟲了,一起學(xué)習(xí)败去。