Scrapy爬虫框架

1. Scrapy简介

Scrapy 是一个基于 Twisted 实现的异步处理爬虫框架,用纯 Python 语言编写的,为了爬取网站数据、提取结构性数据。

注:Twisted 是一个基于事件驱动的异步网络引擎框架,同样采用 Python 实现。

Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

用户只需要定制几个模块就可以实现一个爬虫,用来抓取网页内容以及各种图片。

2. 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)

3. Scrapy安装

pip install --upgrade pip

pip install Scrapy

注:当pip的版本太低或者有问题可能会报错

4.Scrapy常用命令

命令格式说明
startprojectscrapy startproject <项目名>创建一个新项目。

genspider 

scrapy genspider <爬虫文件名> <域名>

新建爬虫文件。

runspiderscrapy runspider <爬虫文件>运行一个爬虫文件,不需要创建项目。

crawl

scrapy crawl <spidername>

运行一个爬虫项目,必须要创建项目。

listscrapy list列出项目中所有爬虫文件。
viewscrapy view <url地址>从浏览器中打开 url 地址。
shellcsrapy shell <url地址>命令行交互模式。

settings

scrapy settings 

查看当前项目的配置信息。

5.创建Scrapy项目

新建项目 (scrapy startproject xxx命令):新建一个新的爬虫项目

明确目标 (编写items.py):明确你想要抓取的目标

制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页

存储内容 (pipelines.py):设计管道存储爬取内容

5.1 新建项目

在cmd中切换到想要创建文件的盘符(cd xxx)

新建项目(scrapy startproject example)

进入项目(cd example)

创建爬虫程序(scrapy genspider maoyan www.maoyan.com)

文件结构:

example/

    scrapy.cfg

    example/

        __init__.py

        items.py

        pipelines.py

        settings.py

        spiders/

            __init__.py

           maoyan.py

5.2 明确目标

在 items.py 中定义要抓取的数据结构

class ExampleItem(scrapy.Item):
    name = scrapy.Field()
    star = scrapy.Field()
    time = scrapy.Field()

5.3修改解析模块

在pycharm中打开example项目

修改maoyan.py中的起始url(start_urls)

将解析函数写入parse函数中

示例:

def parse(self,response):
        # 基准xpath,匹配电影信息的dd节点对象列表
        dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
        # 给items.py 中的类:Maoyan100Item()实例化
        item = Maoyan100Item()
        for dd in dd_list:
            item['name'] = dd.xpath('./a/@title').get().strip()  # 1.6以后版本使用   原来用 extract_first()
            item['star'] = dd.xpath('.//p[@class="star"]/text()').get().strip()
            item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get().strip()
            yield item
        if self.offset < 90:  # 判断条件
            self.offset += 10
            url = 'https://maoyan.com/board/4?offset=' + str(self.offset)
            # 把url交给secheduer入队列
            # response会自动传给 callback 回调的 parse()函数 
            #Scrapy.request()向url发起请求,并将响应结果交给回调的解析函数
            yield scrapy.Request(url=url, callback=self.parse)  

5.4 数据存储

通过编写管道文件 pipelinse.py 文件实现数据的存储

import pymysql
#开始
    def open_spider(self, spider):
        # 爬虫项目启动,执行连接数据操作
        # 以下常量需要定义在settings配置文件中
        self.db = pymysql.connect(
            host=MYSQL_HOST,
            user=MYSQL_USER,
            password=MYSQL_PWD,
            database=MYSQL_DB,
            charset=MYSQL_CHARSET
        )
        self.cursor = self.db.cursor()
    # 向表中插入数据
    def process_item(self, item, spider):
        ins = 'insert into movieinfo values(%s,%s,%s)'
        L = [
            item['name'], item['star'], item['time']
        ]
        self.cursor.execute(ins, L)
        self.db.commit()
        return item
   # 结束存放数据,在项目最后一步执行
    def close_spider(self, spider):
        # close_spider()函数只在所有数据抓取完毕后执行一次,
        self.cursor.close()
        self.db.close()
        print('执行了close_spider方法,项目已经关闭')

5.5配置文件

最后修改配置文件setting.py,主要有修改以下内容:添加日志输出、激活管道 pipelines、定义数据库常量,以及其他一些常用选项

参数含义
DOWNLOAD_DELAY = 0.5下载延迟

DOWNLOADER_MIDDLEWARES= {

# 这里的优先级不能相同 ‘crawler.middlewares.my_useragent’: 544,}    

添加自己定义的伪装规则
ITEM_PIPELINES= { ‘crawler.pipelines.CrawlerPipeline’: 300,}

一定要开启pipeline

#设置 robots.txt 为False
ROBOTSTXT_OBEY = False
#设置日志级别: DEBUG < INFO < WARNING < ERROR < CRITICAL
#日志需要自己添加,配置文件中没有,在空白处添加即可
LOG_LEVEL='DEBUG'
#定义日志输出文件
LOG_FILE='maoyan.log'
#设置导出数据的编码格式
FEED_EXPORT_ENCODING='utf-8'
#设置下载器延迟时间,秒为单位
DOWNLOAD_DELAY = 1
#请求头,添加useragent等信息
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
#激活管道,并添加数据存放mysql的类,200为执行优先级
ITEM_PIPELINES = {
   'Maoyan100.pipelines.Maoyan100Pipeline': 300,
    # 执行数据存储mysql
   'Maoyan100.pipelines.Maoyan100MysqlPipeline': 200

}
#在配置文件末尾添加mysql常用变量
MYSQL_HOST='localhost'
MYSQL_USER='root'
MYSQL_PWD='123456'
MYSQL_DB='maoyandb'
MYSQL_CHARSET='utf8'

5.6启动文件

定义项目启动文件run.py

from scrapy import cmdline
#执行爬虫文件 -o 指定输出文件的格式
cmdline.execute('scrapy crawl maoyan -o maoyan.csv'.split()) #执行项目,并且将数据存csv文件格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值