scrapy框架的使用

scrapy共分为8部分

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(下载中间件):可以自定义扩展下载功能的组件(代理、cokies等)。
Spider Middlewares(Spider中间件):可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

流程图

image.png

scrapy框架如何使用

1.创建一个新的Scrapy项目(scrapy startproject 爬虫项目名称)

2.新建爬虫文件(scrapy genspider 爬虫文件名称 域名 )

打开创建的爬虫文件下的item.py文件item 定义结构化数据字段,用来保存爬取到的数据,有点像Python中的dict,但是提供了一些额外的保护减少错误。可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field的类属性来定义一个Item(可以理解成类似于ORM的映射关系)

打开你创建的爬虫文件 里面会有一下代码:

-- coding: utf-8 --

import scrapy
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
def parse(self, response):
pass

* name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。
* allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。
* start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。
* parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:

    * 负责解析返回的网页数据(response.body),提取结构化数据(生成item)
    * 生成需要下一页的URL请求。

请求头

response.request.headers

xpath使用

response.xpath(‘xpath路径’)
遵循xpath语法规则
/text() 获取文本
/@属性名  获取属性
extract()
    我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。返回的是一个list
extract_first('')
    我们解析到的内容被封装在了Selector对象中,需要调用extract()函数将解析的内容从Selecor中取出。并返回列表中的第一个元素

css使用
response.xpath(‘css选择器’)
遵循css使用规则
. 表示class
# 表示id
::text 获取标签的文本
::attr(属性名) 获取标签的属性
新增请求
yield scrapy.Request()
url, :要请求的url地址
callback=None, 请求成功的回调函数
method='GET', 设置请求的方式
headers=None, 设置请求头,dict类型
cookies=None, 设置用户的cookies信息 dict类型
meta=None, 传递参数 dict类型
encoding='utf-8', (编码类型,一般不需要改变)
dont_filter=False, (是否过滤url,False表示过滤,True:表示不过滤)
errback=None ,设置请求错误的回调函数

items.py

在这里定义想要获取的字段
 例如: title = scrapy.Field()

管道文件

 def process_item(self, item, spider):
    item:爬虫文件中传递过来的item数据 (是一个对象)
    spider: 爬虫文件实例化的对象
def open_spider(self,spider):
def close_spider(self,spider):
def from_crawler(cls,crawler):
def from_settings(cls,settings):

settings.py设置
1. 要在 ITEM_PIPELINES 中激活图片管道
2. IMAGES_STORE 设置图片下载后的存储路径

图片下载管道文件

class MyImagesPipeline(ImagesPipeline):

# def file_path(self, request, response=None, info=None):
#     # 可以返回一个图片的路径
#     #return 'full/%s.jpg' % (image_guid)
#     return 'full/%s.jpg' % (图片的名称)

def get_media_requests(self, item, info):
    # 第一步从item中获取要下载的图片地址
    # for image_url in item['image_urls']:
    #     #根据图片的 url地址构建一个Request对象,
    #     #最终交给调度器
    #     yield scrapy.Request(image_url)
    yield scrapy.Request(item['coverImage'])

def item_completed(self, results, item, info):
    #图片请求完毕后会有一个回调结果, item_completed就是
    #我们的回调函数,results
    image_paths = [x['path'] for status, x in results if status]
    if not image_paths:
        #丢弃item
        raise DropItem("Item contains no images")
    else:
        #修改图片的文件名称
        new_image_paths = []
        for img_path in image_paths:
            os.rename(image_store + '/' + img_path, image_store + '/' + 'full/' + item['title'] + '.jpg')
            new_image_paths.append(image_store + '/' + 'full/' + item['title'] + '.jpg')
    #将获取到的图片存储路径赋值给 item
    print('66666666666666',new_image_paths)
    item['image_paths'] = ','.join(new_image_paths)
    return item

pipeline.py 与 items.py 解藕(数据持久化优化方案)
思路:在item类中定义方法返回sql语句和数据,在管道文件中使用item对象进行调用,执行数据插入操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容