scrapy框架:(Scrapy,Pyspider)
高定制性,高性能(异步网络框架twisted),所以数据下载速度非常快,提供了数据存储,数据下载,提取规则
分布式策略:
scrapy-redis,在scrapy基础上添加了一套以Redis数据库为核心的组件,让scrapy框架支持分布式的功能,主
要在Redis里做请求指纹去重、请求分配、数据临时存储。
scrapy框架的工作流程:
1.首先Spiders(爬虫)将需要发送请求的url(requests)经ScrapyEngine(引擎)交给Scheduler(调度器)。
2.Scheduler(排序,入队)处理后,经ScrapyEngine,DownloaderMiddlewares(可选,主要有User_Agent, Proxy代理)交给Downloader。
3.Downloader向互联网发送请求,并接收下载响应(response)。将响应(response)经ScrapyEngine,SpiderMiddlewares(可选)交给Spiders。
4.Spiders处理response,提取数据并将数据经ScrapyEngine交给ItemPipeline保存(可以是本地,可以是数据库)。
提取url重新经ScrapyEngine交给Scheduler进行下一个循环。直到无Url请求程序停止结束。
1,创建一个scrapy项目
scrapy startproject mySpider
2,生成一个爬虫
scrapy genspider itcast “itcast.cn”
3,提取数据
完善spider,使用xpath等方法
4,保存数据
pipeline中保存数据
示例:
itcast.py
import scrapy
class ItcastSpider(scrapy.Spider):
name = 'itcast'
allowed_domains = ['itcast.cn']
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
def parse(self, response):
#ret1 = response.xpath("//div[@class='tea_con']//h3/text()").extract()
#print(ret1)
#分组
li_list = response.xpath("//div[@class='tea_con']//li")
for li in li_list:
item = {}
item["name"] = li.xpath(".//h3/text()").extract()[0]
item["title"] = li.xpath(".//h4/text()").extract()[0]
#print(item)
yield item #传给pipelines.py,需要在setting中开启
配置setting
ITEM_PIPELINES = {
'myspider.pipelines.MyspiderPipeline': 300,
'myspider.pipelines.MyspiderPipeline1': 301,
}
#优先级后面跟的数字较小先执行
pipelines.py
class MyspiderPipeline(object):
def process_item(self, item, spider):
item["hello"] = "world"
#print(item)
return item
class MyspiderPipeline1(object):
def process_item(self, item, spider):
print(item)
return item