在写之前 先来一张图片
一、简介
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)
二、创建项目
1. 普通爬虫 :
scrapy startproject 项目名称
cd /项目名称/spider/
scrapy genspider baidu baidu.com
2.通用爬虫
scrapy startproject 项目名称
cd /项目名称/spider/
scrapy genspider-t crawl baidu baidu.com
三、用法
- spider/ 爬虫文件
name = 'bdly' # 爬虫名称
allowed_domains = ['lvyou.baidu.com'] #域名
start_urls = ['https://lvyou.baidu.com/scene/t-all_s-all_a-all_l-all'] # 起始url
def parse(self, response):
con_url_list = response.xpath('//ul[@class="filter-result"]/li')
for con_url in con_url_list:
ful_url = 'https://lvyou.baidu.com' + con_url.xpath('.//div[@class="img-wrap"]/a/@href').extract_first()
# print("--->>",ful_url)
yield scrapy.Request(url=ful_url, callback=self.con_parse) # 再次请求 并回调 下一个函数做解析
def con_parse(self, response):
con_item = BdlyprojectItem()
con_item['title'] = response.xpath('//span[@class="main-name clearfix"]/a/text()').extract_first()
con_item['pingfen'] = ''.join(response.xpath('//div[@class="main-score"]/text()').extract()).replace('\n', '')
con_item['intor'] = response.xpath('//div[@class="main-desc"]/p/text()').extract_first().replace(' ', '')
con_item['pinglun'] = response.xpath('//div[@class="main-score"]//a/text()').extract_first()
con_item['jianyi'] = response.xpath(
'//div[@class="main-intro"]/span[@class="main-besttime"]/span/text()').extract_first()
con_item['days'] = response.xpath(
'//div[@class="main-intro"]/span[@class="main-dcnt"]/span/text()').extract_first()
yield con_item # 返回给 piplines.py
在这里必须要用yield 因为该函数会变成生成器
- items.py
class BdlyprojectItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
pingfen = scrapy.Field()
类似于 model 的作用 是你存数据的字段 在爬虫文件导入类 并赋值
- piplines
class BdlyprojectPipeline(object):
def process_item(self, item, spider):
item.write_to_file(str(dict(item)))
item 是爬虫文件给返回的解析完的 数据
在这里可以做数据的 过滤 和 持久化
- middlewares.py
class BdlyprojectSpiderMiddleware(object):
# Not all methods need to be defined. If a method is not defined,
# scrapy acts as if the spider middleware does not modify the
# passed objects.
@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
中间件模块 可以加如请求头,拦截....
!!共勉!!