08 scrapy框架

scrapy介绍

通用的网络爬虫框架

架构介绍(框架)

一、scrapy执行流程

五大组件

-引擎(EGINE):大总管,负责控制数据的流向
-调度器(SCHEDULER):由它来决定下一个要抓取的网址是什么,去重
-下载器(DOWLOADER):用于下载网页内容, 并将网页内
        容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
-爬虫(SPIDERS):开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求request
-项目管道(ITEM PIPLINES):在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作

两大中间件

-爬虫中间件:位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入和输出(用的很少)
-下载中间件:引擎和下载器之间,加代理,加头,集成selenium 

二、scrapy的安装

pip3 install scrapy

三、scrapy创建项目,创建爬虫,运行爬虫

创建项目

scrapy startproject 项目名
scrapy startproject firstscrapy
# cd到指定目录,再创

创建爬虫

scrapy genspider 爬虫名 爬虫地址
scrapy genspider chouti dig.chouti.com
一执行就会在spider文件夹下创建出一个py文件,名字叫chouti

运行爬虫

scrapy crawl chouti   # 带运行日志
scrapy crawl chouti --nolog  # 不带日志

-在项目路径下新建一个main.py,再运行main.py即可
from scrapy.cmdline import execute
execute(['scrapy','crawl','chouti','--nolog'])

四、目录介绍

# 目录介绍
firstscrapy  # 项目名字
    firstscrapy # 包
        -spiders # 所有的爬虫文件放在里面
            -baidu.py # 一个个的爬虫(以后基本上都在这写东西)
            -chouti.py
        -middlewares.py # 中间件(爬虫,下载中间件都写在这)
        -pipelines.py   # 持久化相关写在这(items.py中类的对象)
        -main.py        # 自己加的,执行爬虫
        -items.py       # 一个一个的类,
        -settings.py    # 配置文件
    scrapy.cfg          # 上线相关

五、settings简单介绍

1 默认情况,scrapy会去遵循爬虫协议
2 修改配置文件参数,强行爬取,不遵循协议
	-ROBOTSTXT_OBEY = False
3 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
4 LOG_LEVEL='ERROR'

六、scrapy的数据解析

#xpath:
    -response.xpath('//a[contains(@class,"link-title")]/text()').extract()  # 取文本
    -response.xpath('//a[contains(@class,"link-title")]/@href').extract()  #取属性
#css
    -response.css('.link-title::text').extract()  # 取文本
    -response.css('.link-title::attr(href)').extract_first()  # 取属性

七、持久化储存

#1 方案一:parser函数必须返回列表套字典的形式(了解)
	scrapy crawl chouti -o chouti.csv
#2 方案二:高级,pipline item存储(mysql,redis,文件)
	-在Items.py中写一个类
    -在spinder中导入,实例化,把数据放进去
    	    item['title']=title
            item['url']=url
            item['photo_url']=photo_url
            yield item
            
    -在setting中配置(数字越小,级别越高)
    	ITEM_PIPELINES = {
   		'firstscrapy.pipelines.ChoutiFilePipeline': 300,
		}
    -在pipelines.py中写ChoutiFilePipeline
    	-open_spider(开始的时候)
        -close_spider(结束的时候)
        -process_item(在这持久化)

实战:爬取抽屉热点新闻网

chouti.py
import scrapy
from firstscrapy.items import ChoutiItem

class ChoutiSpider(scrapy.Spider):
    name = 'chouti'
    allowed_domains = ['dig.chouti.com']
    start_urls = ['http://dig.chouti.com/']
    
    
    def parse(self, response):
        # 获取div列表
        div_list = response.xpath('//div[contains(@class,"link-item")]')
        for div in div_list:
            # 从item中导入 并实例化(类似于django中的models)
            item = ChoutiItem()
            title = div.css('.link-title::text').extract()[0]  # 由于extract得到的是一个列表
            url = div.css('.link-title::attr(href)').extract()[0]  # 两种方法都可以
            photo_url = div.css('.image-scale::attr(src)').extract_first()
            # 由于有些热点没有图片
            if not photo_url:
                photo_url = ''
            item['url'] = url
            item['title'] = title
            item['photo_url'] = photo_url
            yield item   
piplines.py
import pymysql


class ChoutiMysqlPipeline:
    def open_spider(self, spider):
        self.conn = pymysql.connect(host='127.0.0.1', user='root', password="123",
                                    database='news', port=3306)

    def process_item(self, item, spider):
        cursor = self.conn.cursor()
        sql = 'insert into article (title,url,photo_url)values(%s,%s,%s)'
        cursor.execute(sql, [item['title'], item['url'], item['photo_url']])
        self.conn.commit()
        return item

    def close_spider(self, spider):
        self.conn.close()
items.py
import scrapy


class ChoutiItem(scrapy.Item):
    # define the fields for your item here like:
    title = scrapy.Field()
    url = scrapy.Field()
    photo_url = scrapy.Field()
原文地址:https://www.cnblogs.com/bailongcaptain/p/13446297.html