scrapy框架的简介与使用
作者:互联网
Scrapy框架
-
-
crapy 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框架的使用
- 创建一个scrapy项目
- scrapy startproject 项目名
-
scrapy genspider 爬虫名 域名
- 运行爬虫项目
- scrapy crawl 爬虫名
- 创建完爬虫项目后会自动生成以下代码
-
import scrapy class TestSpider(scrapy.Spider): # 爬虫名称 name = 'test' # 设置允许爬取的域(可以指定多个) allowed_domains = ['baidu.com'] # 设置起始url(设置多个) start_urls = ['http://baidu.com/'] def parse(self, response): ''' 是一个回调方法,起始url请求成功后,会回调这个方法 :param response: 响应结果 :return: ''' pass
- 在parse中自定义解析方式
-
def parse(self, response): ''' 在parse回调方法中 step1;提取目标数据 step2;获取新的url :param response: 请求的响应结果 :return: ''' print(response.status) #response.xpath(): 使用xpath语法,得到的是selectorlist对象 # response.css(): 使用css选择器,得到的是selectorlist对象 # extract(): 将selector 序列化为unicode字符串 # step1;提取目标数据 # 获取分类列表 tags = response.xpath('//div[@class="Taright"]/a') # tags = response.css('.Taright a') for tag in tags: # 实例化一个item,用来存储数据 tag_item = ChinazspidertagItem() # 获取网站分类的名称 # tagname = tag.xpath('./text()')[0].extract() tagname = tag.xpath('./text()').extract_first('') tag_item['tagname'] = tagname # 使用css取值(文本) # tagname = tag.css('::text').extract_first('') # 获取网站分类的首页url地址 # first_url = tag.xpath('./@href')[0].extract() first_url = tag.xpath('./@href').extract_first('') tag_item['firsturl'] = first_url # css取值(属性) # first_url = tag.css('::attr(href)').extract_first('') print(tag_item) # print(type(tagname),type(first_url)) # print(tagname,first_url) # 将获取到的数据交给管道处理 yield tag_item # http://top.chinaz.com/hangye/index_yule_yinyue.html # http://top.chinaz.com/hangye/index_yule_yinyue_2.html ''' url,设置需要发起请求的url地址 callback=None,设置请求成功后的回调方法 method='GET',请求方式,默认为get请求 headers=None,设置请求头,字典类型 cookies=None,设置cookies信息,模拟登录用户,字典类型 meta=None,传递参数(字典类型) encoding='utf-8',设置编码 dont_filter=False, 是否去重,默认为false,表示去重 errback=None, 设置请求失败后的回调 ''' yield scrapy.Request(first_url,callback=self.parse_tags_page)
-
-
关于yeild函数介绍
-
简单地讲,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,带有yeild的函数遇到yeild的时候就返回一个迭代值,下次迭代时, 代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行, 直到再次遇到 yield。
-
通俗的讲就是:在一个函数中,程序执行到yield语句的时候,程序暂停,返回yield后面表达式的值,在下一次调用的时候,从yield语句暂停的地方继续执行,如此循环,直到函数执行完。
Item pipeline(管道文件)使用
- 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。
-
- 爬虫数据持久化
- 将数据存入mysql数据库
-
ITEM_PIPELINES = {
'douban.pipelines.DoubanPipeline': 300,
}关于数据库的相关配置
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = ''
MYSQL_PWD = ''
MYSQL_DB = ''
pipelines.py管道文件 -
往数据库里插数据 class ChinazspiderPipeline(object): def __init__(self): ''' 初始化方法 ''' # self.file = open('chinaz.json','a') # 创建数据库链接 self.client = pymysql.Connect( '127.0.0.1', 'root', 'czj1234', 'chinaz', 3306, charset='utf8' ) # 创建游标 self.cursor = self.client.cursor() def open_spider(self, spider): ''' 爬虫启动的时候回调用一次 :param spider: :return: ''' print('爬虫开启') pass def process_item(self, item, spider): ''' 这个方法必须实现,爬虫文件中所有的item 都会经过这个方法 :param item: 爬虫文件传递过来的item对象 :param spider: 爬虫文件实例化的对象 :return: ''' # 存储到本地json文件 data_dict = dict(item) # import json # json_data = json.dumps(data_dict,ensure_ascii=False) # self.file.write(json_data+'\n') # 使用isisinstance判断item要存储的表 # if isinstance(item,ChinazprojectWebInfoItem): # print('网站信息') # tablename = 'webinfo' # elif isinstance(item,ChinazspidertagItem): # print('网站分类信息') # tablename = 'tags' # # # # 往数据库里写 # sql = """ # insert into %s(%s) # values (%s) # """ % (tablename,','.join(data_dict.keys()), ','.join(['%s'] * len(data_dict))) sql,data = item.get_insert_sql_data(data_dict) try: self.cursor.execute(sql, list(data_dict.values())) self.client.commit() except Exception as err: self.client.rollback() print(err) # 如果有多个管道文件,一定要return item , 否则下一管道无法接收到item print('经过了管道') return item def close_spider(self, spider): ''' 爬虫结束的时候调用一次 :param spider: :return: ''' # self.file.close() self.client.close() self.cursor.close() print('爬虫结束')
标签:框架,url,简介,self,爬虫,Spider,item,scrapy,tag 来源: https://www.cnblogs.com/feiyuyu/p/15988025.html