Python爬虫(九)

scrapy框架

  • 定义
异步处理框架,可配置和可扩展程度非常高,Python中使用最广泛的爬虫框架
  • 安装
# Ubuntu安装
1、安装依赖包
	1、sudo apt-get install libffi-dev
	2、sudo apt-get install libssl-dev
	3、sudo apt-get install libxml2-dev
	4、sudo apt-get install python3-dev
	5、sudo apt-get install libxslt1-dev
	6、sudo apt-get install zlib1g-dev
	7、sudo pip3 install -I -U service_identity
2、安装scrapy框架
	1、sudo pip3 install Scrapy
# Windows安装
cmd命令行(管理员): python -m pip install Scrapy
# Error: Microsoft Visual C++ 14.0 is required xxx
  • Scrapy框架五大组件
1、引擎(Engine)      :整个框架核心
2、调度器(Scheduler) :维护请求队列
3、下载器(Downloader):获取响应对象
4、爬虫文件(Spider)  :数据解析提取
5、项目管道(Pipeline):数据入库处理
**********************************
# 下载器中间件(Downloader Middlewares) : 引擎->下载器,包装请求(随机代理等)
# 蜘蛛中间件(Spider Middlewares) : 引擎->爬虫文件,可修改响应对象属性
  • scrapy爬虫工作流程
# 爬虫项目启动
1、由引擎向爬虫程序索要第一个要爬取的URL,交给调度器去入队列
2、调度器处理请求后出队列,通过下载器中间件交给下载器去下载
3、下载器得到响应对象后,通过蜘蛛中间件交给爬虫程序
4、爬虫程序进行数据提取:
   1、数据交给管道文件去入库处理
   2、对于需要继续跟进的URL,再次交给调度器入队列,依次循环
  • scrapy常用命令
# 1、创建爬虫项目(首字母大写)
scrapy startproject 项目名
# 2、创建爬虫文件(首字母小写)
scrapy genspider 爬虫名 域名
# 3、运行爬虫
scrapy crawl 爬虫名
  • scrapy项目目录结构
Baidu                   # 项目文件夹
├── Baidu               # 项目目录
│   ├── items.py        # 定义数据结构
│   ├── middlewares.py  # 中间件
│   ├── pipelines.py    # 数据处理
│   ├── settings.py     # 全局配置
│   └── spiders
│       ├── baidu.py    # 爬虫文件
└── scrapy.cfg          # 项目基本配置文件
  • 全局配置文件settings.py详解
# 1、定义User-Agent
USER_AGENT = 'Mozilla/5.0'
# 2、是否遵循robots协议,一般设置为False
ROBOTSTXT_OBEY = False
# 3、最大并发量,默认为16
CONCURRENT_REQUESTS = 32
# 4、下载延迟时间
DOWNLOAD_DELAY = 1
# 5、请求头,此处也可以添加User-Agent
DEFAULT_REQUEST_HEADERS={}
# 6、项目管道
ITEM_PIPELINES={
	'项目目录名.pipelines.类名':300
}
#7、蜘蛛中间件	(543:数字是优先级,优先级值:1~1000,数字越小优先级越高)
SPIDER_MIDDLEWARES = {
   'Baidu.middlewares.BaiduSpiderMiddleware': 543,
}
#8、下载器中间件
DOWNLOADER_MIDDLEWARES = {
   'Baidu.middlewares.BaiduDownloaderMiddleware': 543,
}
  • 创建爬虫项目步骤
1、新建项目 :scrapy startproject 项目名
2、cd 项目文件夹
3、新建爬虫文件 :scrapy genspider 文件名 域名
4、明确目标(items.py)
5、写爬虫程序(文件名.py)
6、管道文件(pipelines.py)
7、全局配置(settings.py)
8、运行爬虫 :scrapy crawl 爬虫名
  • pycharm运行爬虫项目
1、创建begin.py(和scrapy.cfg文件同目录)
2、begin.py中内容:
	from scrapy import cmdline
	cmdline.execute('scrapy crawl maoyan'.split())

小试牛刀

  • 目标
打开百度首页,把 '百度一下,你就知道' 抓取下来,从终端输出
/html/head/title/text()
  • 实现步骤

1、创建项目Baidu 和 爬虫文件baidu

1、scrapy startproject Baidu
2、cd Baidu
3、scrapy genspider baidu www.baidu.com

2、编写爬虫文件baidu.py,xpath提取数据

# -*- coding: utf-8 -*-
import scrapy

class BaiduSpider(scrapy.Spider):
    name = 'baidu'
    allowed_domains = ['www.baidu.com']
    start_urls = ['http://www.baidu.com/']

    def parse(self, response):
        result = response.xpath('/html/head/title/text()').extract_first()
        print('*'*50)
        print(result)
        print('*'*50)

3、全局配置settings.py

USER_AGENT = 'Mozilla/5.0'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
	'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
	'Accept-Language': 'en',
}

4、创建run.py(和scrapy.cfg同目录)

from scrapy import cmdline

cmdline.execute('scrapy crawl baidu'.split())

5、启动爬虫

直接运行 run.py 文件即可

思考运行过程

猫眼电影案例

  • 目标
URL: 百度搜索 -> 猫眼电影 -> 榜单 -> top100榜
内容:电影名称、电影主演、上映时间
  • 实现步骤

1、创建项目和爬虫文件

# 1、创建爬虫项目
scrapy startproject Maoyan
# 2、创建爬虫文件
scrapy genspider maoyan maoyan.com
# https://maoyan.com/board/4?offset=0

2、定义要爬取的数据结构(items.py)

name = scrapy.Field()
star = scrapy.Field()
time = scrapy.Field()

3、编写爬虫文件(maoyan.py)

1、基准xpath,匹配每个电影信息节点对象列表
	dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
2for dd in dd_list:
	电影名称 = dd.xpath('./a/@title')
	电影主演 = dd.xpath('.//p[@class="star"]/text()')
	上映时间 = dd.xpath('.//p[@class="releasetime"]/text()')

代码实现一

# -*- coding: utf-8 -*-
import scrapy
from ..items import MaoyanItem


class MaoyanSpider(scrapy.Spider):
    name = 'maoyan'
    allowed_domains = ['maoyan.com']
    start_urls = ['https://maoyan.com/board/4']
    offset = 0

    # response为start_urls中的响应对象
    def parse(self, response):
        # 基准xpath,匹配电影信息的dd节点对象列表
        dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
        # 给items.py中的类:MaoyanItem()实例化
        item = MaoyanItem()
        for dd in dd_list:
            item['name'] = dd.xpath('./a/@title').get()
            item['star'] = dd.xpath('.//p[@class="star"]/text()').get()
            item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get()

            # 交给管道处理数据
            yield item

        if self.offset < 90:
            self.offset += 10
            url = 'https://maoyan.com/board/4?offset=' + str(self.offset)
            # 把url地址交给调度器入队列
            yield scrapy.Request(
                url=url,
                callback=self.parse
            )

代码实现二

# -*- coding: utf-8 -*-
import scrapy
from ..items import MaoyanItem


class MaoyanSpider(scrapy.Spider):
    name = 'maoyan2'
    allowed_domains = ['maoyan.com']
    start_urls = ['https://maoyan.com/board/4']

    #重写scrapy的start_requests()方法
    #拼接所有地址,交给调度器入队列
    def start_requests(self):
        for offset in range(0,91,10):
            url = 'https://maoyan.com/board/4?offset=' + str(offset)
            #交给调度器入队列
            yield scrapy.Request(
                url=url,
                callback=self.parse
            )
    # response为start_urls中的响应对象
    def parse(self, response):
        # 基准xpath,匹配电影信息的dd节点对象列表
        dd_list = response.xpath('//dl[@class="board-wrapper"]/dd')
        # 给items.py中的类:MaoyanItem()实例化
        item = MaoyanItem()
        for dd in dd_list:
            item['name'] = dd.xpath('./a/@title').get()
            item['star'] = dd.xpath('.//p[@class="star"]/text()').get()
            item['time'] = dd.xpath('.//p[@class="releasetime"]/text()').get()

            # 交给管道处理数据
            yield item

4、定义管道文件(pipelines.py)

    def process_item(self, item, spider):

        return item

5、全局配置文件(settings.py)

BOT_NAME = 'Maoyan'

SPIDER_MODULES = ['Maoyan.spiders']
NEWSPIDER_MODULE = 'Maoyan.spiders'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Language': 'zh-CN,zh;q=0.9',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
ITEM_PIPELINES = {
    'Maoyan.pipelines.MaoyanPipeline': 300,
}
LOG_LEVEL = 'WARNING'
  1. 创建并运行文件(run.py)
from scrapy import cmdline
cmdline.execute('scrapy crawl maoyan'.split())

知识点汇总

  • 节点对象.xpath(’’)
1、列表,元素为选择器 ['<selector data='A'>]
2、列表.extract() :序列化列表中所有选择器为Unicode字符串 ['A','B','C']
3、列表.extract_first() 或者 get() :获取列表中第1个序列化的元素(字符串)
  • 日志变量及日志级别(settings.py)
# 日志相关变量
LOG_LEVEL = ''	#填写日志级别
如:
LOG_LEVEL = 'WARNING'#只打印输出结果与警告信息
LOG_FILE = '文件名.log'


# 日志级别
5 CRITICAL :严重错误
4 ERROR    :普通错误
3 WARNING  :警告
2 INFO     :一般信息
1 DEBUG    :调试信息
# 注意: 只显示当前级别的日志和比当前级别日志更严重的

  • 管道文件使用
1、在爬虫文件中为items.py中类做实例化,用爬下来的数据给对象赋值
	from ..items import MaoyanItem
	item = MaoyanItem()
2、管道文件(pipelines.py)
3、开启管道(settings.py)
	ITEM_PIPELINES = { '项目目录名.pipelines.类名':优先级 }

数据持久化存储(MySQL)

实现步骤

1、在setting.py中定义相关变量
2、pipelines.py中导入settings模块
	def open_spider(self,spider):
		# 爬虫开始执行1次,用于数据库连接
	def close_spider(self,spider):
		# 爬虫结束时执行1次,用于断开数据库连接
3、settings.py中添加此管道
	ITEM_PIPELINES = {'':200}

# 注意 :process_item() 函数中一定要 return item ***

保存为csv、json文件

  • 命令格式
scrapy crawl maoyan -o maoyan.csv
scrapy crawl maoyan -o maoyan.json
# settings.py中设置导出编码
FEED_EXPORT_ENCODING = 'utf-8'

总结

  • 流程
  1. 创建项目 + 爬虫文件

  2. items.py:定义数据结构

  3. spider.py:解析数据

  4. pipelines.py:处理数据

  5. setting.py:全局配置

  6. run.py:运行爬虫

    • respone的方法
  7. response.xpath(“”)

  8. response.text:字符串

  9. response.body:字节串

  • 选择器对象列表
  1. xxx.xpath(“”).extract()
  2. xxx.xpath(“”).extract_first()
  3. xxx.xpath(“”).get()
  • 重写start_requests()方法
  1. 去掉start_urls变量
  2. def start_requests():
  • settings.py中常用变量
  1. LOG_LEVEL = ‘’
  2. LOG_FILE = ‘’
  3. FEED_EXPORT_ENCODING = ‘’
  • 保存csv或json文件

scrapy crawl spider -o xxx.csv

  • 存数据库
class xxxPipeline(object):

	def open_spider(self,spider):

		pass

	def process_item(self,item,spider):

		#必须返回item

		return item

	def close_spider(self,spider):

		pass
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值