【初始scrapy框架下】——全栈开发——如桃花来

Scrapy配置文件说明:

第一部分:基本配置

#==>第一部分:基本配置<===
#1、项目名称,默认的USER_AGENT由它来构成,也作为日志记录的日志名
BOT_NAME = 'Amazon'

#2、爬虫应用路径
SPIDER_MODULES = ['Amazon.spiders']
NEWSPIDER_MODULE = 'Amazon.spiders'

#3、客户端User-Agent请求头
USER_AGENT = 'Amazon (+http://www.yourdomain.com)'

#4、是否遵循爬虫协议
 #Obey robots.txt rules
ROBOTSTXT_OBEY = False

#5、是否支持cookie,cookiejar进行操作cookie,默认开启
COOKIES_ENABLED = False

#6、Telnet用于查看当前爬虫的信息,操作爬虫等...使用telnet ip port ,然后通过命令操作
TELNETCONSOLE_ENABLED = False
TELNETCONSOLE_HOST = '127.0.0.1'
TELNETCONSOLE_PORT = [6023,]

#7、Scrapy发送HTTP请求默认使用的请求头
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
}

第二部分:并发与延迟

#===>第二部分:并发与延迟<===
#1、下载器总共最大处理的并发请求数,默认值16
CONCURRENT_REQUESTS = 32

#2、每个域名能够被执行的最大并发请求数目,默认值8
CONCURRENT_REQUESTS_PER_DOMAIN = 16

'''
#3、能够被单个IP处理的并发请求数,默认值0,代表无限制,需要注意两点
#I、如果不为零,那CONCURRENT_REQUESTS_PER_DOMAIN将被忽略,即并发数的限制是按照每个IP来计算,而不是每个域名
#II、该设置也影响DOWNLOAD_DELAY,如果该值不为零,那么DOWNLOAD_DELAY下载延迟是限制每个IP而不是每个域
'''
CONCURRENT_REQUESTS_PER_IP = 16

#4、如果没有开启智能限速,这个值就代表一个规定死的值,代表对同一网址延迟请求的秒数
DOWNLOAD_DELAY = 1

第三部分:智能限速

#一:介绍
from scrapy.contrib.throttle import AutoThrottle #http://scrapy.readthedocs.io/en/latest/topics/autothrottle.html#topics-autothrottle
设置目标:
1、比使用默认的下载延迟对站点更好
2、自动调整scrapy到最佳的爬取速度,所以用户无需自己调整下载延迟到最佳状态。用户只需要定义允许最大并发的请求,剩下的事情由该扩展组件自动完成


#二:如何实现?
在Scrapy中,下载延迟是通过计算建立TCP连接到接收到HTTP包头(header)之间的时间来测量的。
注意,由于Scrapy可能在忙着处理spider的回调函数或者无法下载,因此在合作的多任务环境下准确测量这些延迟是十分苦难的。 不过,这些延迟仍然是对Scrapy(甚至是服务器)繁忙程度的合理测量,而这扩展就是以此为前提进行编写的。

#三:限速算法
自动限速算法基于以下规则调整下载延迟
'''
#1、spiders开始时的下载延迟是基于AUTOTHROTTLE_START_DELAY的值
#2、当收到一个response,对目标站点的下载延迟=收到响应的延迟时间/AUTOTHROTTLE_TARGET_CONCURRENCY
#3、下一次请求的下载延迟就被设置成:对目标站点下载延迟时间和过去的下载延迟时间的平均值
#4、没有达到200个response则不允许降低延迟
#5、下载延迟不能变的比DOWNLOAD_DELAY更低或者比AUTOTHROTTLE_MAX_DELAY更高
'''

#四:配置使用
#开启True,默认False
AUTOTHROTTLE_ENABLED = True
#起始的延迟
AUTOTHROTTLE_START_DELAY = 5
#最小延迟
DOWNLOAD_DELAY = 3
#最大延迟
AUTOTHROTTLE_MAX_DELAY = 10
'''
#每秒并发请求数的平均值,不能高于 CONCURRENT_REQUESTS_PER_DOMAIN或CONCURRENT_REQUESTS_PER_IP,调高了则吞吐量增大强奸目标站点,调低了则对目标站点更加”礼貌“
#每个特定的时间点,scrapy并发请求的数目都可能高于或低于该值,这是爬虫视图达到的建议值而不是硬限制
'''
AUTOTHROTTLE_TARGET_CONCURRENCY = 16.0
#调试
AUTOTHROTTLE_DEBUG = True
CONCURRENT_REQUESTS_PER_DOMAIN = 16
CONCURRENT_REQUESTS_PER_IP = 16

第四部分:爬取深度与爬取方式

'''
#1、爬虫允许的最大深度,可以通过meta查看当前深度;0表示无深度
# DEPTH_LIMIT = 3

#2、爬取时,0表示深度优先Lifo(默认);1表示广度优先FiFo

# 后进先出,深度优先
# DEPTH_PRIORITY = 0
# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleLifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.LifoMemoryQueue'
# 先进先出,广度优先

# DEPTH_PRIORITY = 1
# SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'


#3、调度器队列
# SCHEDULER = 'scrapy.core.scheduler.Scheduler'
# from scrapy.core.scheduler import Scheduler

#4、访问URL去重
# DUPEFILTER_CLASS = 'step8_king.duplication.RepeatUrl'
'''

第五部分:中间件、Pipelines、扩展

'''
#1、Enable or disable spider middlewares
# 启用或禁用爬行器中间件
# See http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'Amazon.middlewares.AmazonSpiderMiddleware': 543,
#}

#2、Enable or disable downloader middlewares
# 启用或禁用下载中间件
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
'''
DOWNLOADER_MIDDLEWARES = {
   # 'Amazon.middlewares.DownMiddleware1': 543,
}
'''
#3、Enable or disable extensions
# 启用或禁用扩展
# See http://scrapy.readthedocs.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

#4、Configure item pipelines
# 配置项管道
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
'''
ITEM_PIPELINES = {
   # 'Amazon.pipelines.CustomPipeline': 200,
}

第六部分:缓存

"""
1. 启用缓存
    目的用于将已经发送的请求或相应缓存下来,以便以后使用
    
    from scrapy.downloadermiddlewares.httpcache import HttpCacheMiddleware
    from scrapy.extensions.httpcache import DummyPolicy
    from scrapy.extensions.httpcache import FilesystemCacheStorage
"""
'''
# 是否启用缓存策略
# HTTPCACHE_ENABLED = True

# 缓存策略:所有请求均缓存,下次在请求直接访问原来的缓存即可
# HTTPCACHE_POLICY = "scrapy.extensions.httpcache.DummyPolicy"
# 缓存策略:根据Http响应头:Cache-Control、Last-Modified 等进行缓存的策略
# HTTPCACHE_POLICY = "scrapy.extensions.httpcache.RFC2616Policy"

# 缓存超时时间
# HTTPCACHE_EXPIRATION_SECS = 0

# 缓存保存路径
# HTTPCACHE_DIR = 'httpcache'

# 缓存忽略的Http状态码
# HTTPCACHE_IGNORE_HTTP_CODES = []

# 缓存存储的插件
# HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
'''

DEBUG、INFO、WARN、ERROR、CRITICAL开发日志级别定义:

1、DEBUG
面向功能开发人员,一般在功能开发阶段使用,用来给开发人员检查功能是否正常的。
此类日志只在开发阶段使用,版本不输出。
2、INFO
内测 版可输出此日志,用来查看新开发特性或者 bugfix 是否正常。
上网版不输出。
3、WARN
不会对系统造成影响的非正常流程。
上网版本输出。
3、ERROR
会对系统造成影响的非正常流程,可自我修复,不影响系统稳定性。
上网版本输出。
5、CRITICAL
产生了不可逆的错误,系统无法正常工作。

配置文件settings.py中添加配置:

# scrapy 输出LOG日志的设置
import os
1.终端日志显示控制
在setting中添加一行(全部大写):LOG_LEVEL = "WARNING"
只有结果的展示
2.日志文件输出
日志级别:调试模式
LOG_LEVEL = 'DEBUG'
#
其他级别还有:CRITICAL, ERROR, WARNING, INFO, DEBUG
# 获取当前时间
import os, datetime

os_path = os.getcwd() + '/log/'
if not os.path.exists(os_path):
	os.mkdir(os_path)
to_day = datetime.datetime.now()
# 需要创建log文件夹
log_file_path = 'log/scrapy_{}_{}_{}.log'.format(to_day.year, to_day.month, to_day.day)
# 文件生成的路径
LOG_FILE = log_file_path

代码演示:

目标:爬取链家租房里每一项的名字、价格、链接

items代码:

import scrapy


class LianjiaWjjItem(scrapy.Item):
    # define the fields for your item here like:
    name = scrapy.Field()
    price = scrapy.Field()
    link = scrapy.Field()

对我们想要获取的字段进行数据建模

lianjia_spider代码:

import scrapy


class LianjiaSpiderSpider(scrapy.Spider):
    name = "lianjia_spider"
    allowed_domains = ["hz.lianjia.com"]
    start_urls = ["https://hz.lianjia.com/zufang/"]

    def parse(self, response):
        # 标题
        name = response.xpath('//div[@class="content__list--item--main"]//p[@class="content__list--item--title"]/a/text()').extract()  # 是去对Selector对象取值
        # 价格
        price = response.xpath('//div[@class="content__list--item--main"]//em/text()').extract()
        # 链接
        link = response.xpath('//div[@class="content__list--item--main"]//a[@class="twoline"]/@href').extract()
        print(name)  # 正式解析想要的数据 将会返回一个为列表的Selector选择器对象
        # 所以需要将列表遍历成字符串再通过.extract()取选择器里的所有值,.extract_first()取出选择器里的第一个值
               for names,prices,links in zip(name,price,link):
            l = response.urljoin(links)  # 默认拼接不完整链接
            # 实例化item模板类 键名要求和字段名统一
            item = MyspiderItem()  # 实例化之后可以直接使用 目前是一个空字典
            item['name'] = names.strip()
            item['price'] = prices
            item['link'] = l
            # 将组建好的dict形式的数据通过yield返回给引擎  再由引擎返回给pipeliene文件
            yield item
  • response里面内置了xpath语法,所以可以直接使用。
  • 别忘了在每个对象后面加上.==extract()==方法,该方法可以对对象取值
  • 需要实例化Item模板类
  • urljoin可以拼接不完整的链接
  • 要使用yield返回数据

管道代码:

import json


class MyspiderPipeline:
    def __init__(self):
        self.file = open('lianjia.json','w')

    # 该process_item方法为固定名称函数 不可修改其名字
    def process_item(self, item, spider):
        # 参数item:是爬虫文件中yield的返回的数据对象(引擎会把这个交给管道中的这个item参数)
        # 参数item默认是一个 <class 'mySpider.items.MyspiderItem'>类信息,需要处理成字典
        dict_item = dict(item)
        print(type(item),type(dict_item))

        # 将返回的字典数据转为JSON数据
        json_data = json.dumps(dict_item,ensure_ascii=False)+',\n'
        self.file.write(json_data)

        print("建模之后的数据:",dict_item)
        return item  # 必须返回给引擎,不然后面的数据没法保存

    def __del__(self):
        self.file.close()

Scrapy shell的使用:

我们想要爬虫中使用 xpath,Bs4,正则,css选择器等来提取想要的数据时,由于 Scrapy是一个重量级框架,毎次运行起来都要等待段时间,因此要去验证我们书写的规则是否正确,是—个比较麻烦的事情,因此 Scrapy提供了一个shell,用起来方便测试规则

打开:

打开cmd终端,进入到 Scrapy项目所在目录,进入到 Scrapy框架所在的环境中,输入命令

scrapy shell url,就会进入到 scrapy的shell环境中,在这个环境中,你可以跟在爬虫的 parse法中一样使用了

cd Myspider
scrapy shell https://xy.lianjia.com/zufang/
测试执行爬虫中要写的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

如桃花来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值