Anaconda + scrapy

1.scrapy框架

scrapy框架的核心是scrapy引擎,负责调度各个组件和传递消息,运行时,爬虫文件读取数据,爬出url并发送新的请求,url由引擎交给调度器,调度器排队后返回引擎,引擎再交给下载器下载html源码交给引擎,引擎将数据交给管道文件处理,同时将响应给爬虫文件,爬虫会继续处理爬取这个响应中所有url,直至超出域名就停止。管道文件会将处理好的数据存储成文件(sql,csv,json)

2.安装

anaconda base环境被我弄坏了,搞了新的环境

 

 

 conda activate new,进入名为new的新环境

conda install scrapy 安装scrapy

安装完成后

scrapy bench 测试

scrapy startproject 名字  创建新工程,就是在磁盘创建好工程相关文件

 

每一个工程都是这样的结构,ITcast多了个__pycache__是因为运行产生了中间文件

工程生成文件:

scrapy.cfg(略重要)

setting.py(重要)

pipelines.py(定义处理item数据的方法,并存储进文件)

items.py(定义items数据结构,爬取的每一个目标都是一个item,item交由管道文件处理)

middlewares.py(暂时没有接触)

spider目录下没有爬虫文件,使用

scrapy genspider 名字 "域名" 添加,默认使用basic模板

所以可以添加多个爬虫(在spider下添加爬虫,才能使项目运行)

3.重要函数

setting.py

1 ROBOTSTXT_OBEY = False#不服从网站健壮性管理
2 
3 ITEM_PIPELINES = {
4     'ITcast.pipelines.ItcastPipeline': 300,#管道文件优先级,越小越优先,中间件也有优先级
5 }

 

pipeline.py

1     def __init__(self):
2         
3     def process_item(self, item, spider):#必须实现,且必须return item,这样引擎才知道这个item已经处理完毕,否则会一直处理,直至成功
4         return item
5         
6     def close_spider(self,spider):

 

item.py

1  class ItcastItem(scrapy.Item):
2         info1 = scrapy.Field()
3         info2 = scrapy.Field()

 

定义处理的item结构,由于info1相当于字典键,所以定义是不要加__init__,不要加self

 

myspider.py

1  name = 'ITcast'
2     allowed_domains = ['www.kayoudidai.com']
3     start_urls = ['http://www.kayoudidai.com/news/80#tab2']
4 
5  def parse(self, response):

 

 

以上必须实现

parse中必须实现yield item 否则循环中断

 

4.执行过程

爬虫文件myspider.py处理每一个响应,并按给定的xpath表达式处理过滤数据,存入item,通过 yield item传给pipeline.py处理并储存