## scrapy 依赖 twisted
  - twisted 是一个基于事件循环的 异步非阻塞 框架/模块

##  项目的创建 

1. 创建 project
scrapy startproject 项目名称 项目名称(项目结构)
- spiders # 爬虫文件
- q.py
- w.py
- items.py # 持久化
- pipelines # 持久化
- middlewares.py # 中间件
- settings.py # 配置文件(爬虫)
scrapy.cfg # 配置文件(部署) 2. 创建爬虫
cd 项目名称 scrapy genspider q q.com
scrapy genspider w w.com 3. 启动爬虫
scrapy crawl q --nolog # 不查看日志
scrapy crawl w # 默认查看日志

## pipeline 做持久化

    - pipeline 是所有爬虫公用的,如果想要给某个爬虫制定需要使用 spider 参数进行判断处理:
      if spider.name == 'xxx'

1. 自定义的爬虫文件中 将每次获取到的数据 传给 ScrapyDeom1Item 类方法
for item in item_list:
href = item.xpath('.//a/@href').extract_first()
txt = item.xpath('.//a/text()').extract_first()
yield ScrapyDeom1Item(text=txt, href=href) 2. items 中 ScrapyDeom1Item 类方法 将需要存储的数据接收到。
class ScrapyDeom1Item(scrapy.Item):
href = scrapy.Field()
text = scrapy.Field() 3. settings 中定义做持久化的类( ScrapyDeom1Pipeline ) 和 定义一个文件路径
ITEM_PIPELINES = {
'scrapy_deom1.pipelines.ScrapyDeom1Pipeline': 300,
# 文件路径 # 优先级( 1-1000 )
}
PATH = 'new.log' 4. 到 pipelines.py 文件中 找到 ScrapyDeom1Pipeline 类并做持久化
from scrapy.exceptions import DropItem
class ScrapyDeom1Pipeline(object): def __init__(self, path): # 初始化定义文件操作 和 文件要保存的路径
self.f = None
self.path = path @classmethod
def from_crawler(cls, crawler):
"""
初始化的时候,用来创建 pipeline 对象
:param crawler:
:return:
"""
# 去settings 寻找要保存的文件路径
path = crawler.settings.get('PATH')
return cls(path) def open_spider(self, spider):
"""
爬虫刚启动时调用 - 此处用来做打开文件操作
:param spider:
:return:
"""
self.f = open(self.path, 'a+') def process_item(self, item, spider):
"""
爬虫执行中调用 - 此处用来做将数据写入文件 操作
:param item:
:param spider:
:return:
"""
self.f.write(item['href']+'\n')
# raise DropItem() # 抛出异常,使后续的 pipeline 的 process_item 方法不执行
return item # 这个 item 是要返回给下个类的 def close_spider(self, spider):
"""
爬虫执行完毕后调用 - 此处用来做关闭文件操作
:param spider:
:return:
"""
self.f.close()

## 去重

1. 创建一个 dupefilters.py 文件(用于做去重操作):
from scrapy.dupefilters import BaseDupeFilter
from scrapy.utils.request import request_fingerprint class MyDupeFilter(BaseDupeFilter): def __init__(self):
self.visited_fd = set() @classmethod
def from_settings(cls, settings):
return cls() def request_seen(self, request):
"""
判断当前请求的URL是否存在 - 用于去重
- 如果存在则 pass
- 如不存在则 添加
:param request:
:return:
"""
# 将当前 URL 加密成一定位数的字符
print(request)
fd = request_fingerprint(request=request)
if fd in self.visited_fd:
return True
self.visited_fd.add(fd) def open(self): # can return deferred
"""
执行前的一些操作
:return:
"""
print('爬虫开始') def close(self, reason): # can return a deferred
"""
执行结束后的一些操作
:param reason:
:return:
"""
print('爬虫结束') def log(self, request, spider): # log that a request has been filtered
"""
访问的每一个 URL 的日志信息
:param request:
:param spider:
:return:
"""
pass 2. settings 中注册这个类
DUPEFILTER_CLASS = 'scrapy_demo1.dupefilters.MyDupeFilter' 3. 可以设置是否使用当前定义的去重方法
# True 表示不使用
# False 表示使用 (默认为False)
yield Request(url=page, callback=self.parse, dont_filter=True)

##  限制深度查询

配置文件中(settings):
DEPTH_LIMIT = 3 # 查询深度设置为三层

##  Cookie

# 解析 cookie
cookie_jar = CookieJar()
cookie_jar.extract_cookies(response, response.request) # 去对象中将cookie解析到字典
for k, v in cookie_jar._cookies.items():
for i, j in v.items():
for m, n in j.items():
self.cookie_dict[m] = n.value # 获取 cookie cookies=self.cookie_dict,
 

python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)的更多相关文章

  1. Python Scrapy 爬虫框架实例(一)

    之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...

  2. Python Scrapy 爬虫框架实例

    之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...

  3. python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )

    1.  start_urls  --  起始URL 的内部实现(将迭代器转换为生成器) class QSpider(scrapy.Spider): name = 'q' allowed_domains ...

  4. python - scrapy 爬虫框架 ( redis去重 )

    1.  使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...

  5. python scrapy爬虫框架概念介绍(个人理解总结为一张图)

    python的scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架   python和scrapy的安装就不介绍了,资料很多 这里我个人总结一下,能更加快理解scrapy和快速上手一个简 ...

  6. [Python] Scrapy爬虫框架入门

    说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...

  7. Python Scrapy爬虫框架之初次使用

    此篇博客为本人对小甲鱼的课程的总结. 关于Scrapy的安装网上都有方法,这里便不再叙述. 使用Scrapy抓取一个网站一共需要四个步骤: 0.创建一个Scrapy项目: 1.定义Item容器: 2. ...

  8. scrapy 爬虫框架之持久化存储

    scrapy  持久化存储 一.主要过程: 以爬取校花网为例 : http://www.xiaohuar.com/hua/ 1.  spider    回调函数     返回item 时    要用y ...

  9. (1)python Scrapy爬虫框架

    部署 1.安装python3.6  64bit 2.下载pywin32 https://sourceforge.net/projects/pywin32/files/pywin32/ 双击安装 3.下 ...

随机推荐

  1. [转帖]MyCat教程【简单介绍】

    MyCat教程[简单介绍] 2019-10-15 10:27:23 波波烤鸭 阅读数 618 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...

  2. Java设计模式:23种设计模式(转)

    单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式. 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多 ...

  3. Python13之元组(带上枷锁的列表)

    一.元组定义 元组一旦建立,元组内的元素不允许修改和删除,这就是元组和列表最大的区别 当元组中仅有一个元素时,需要将元素后面加上逗号,或者不用括号也可以. tuple1 = (12,3234,5435 ...

  4. Linux01学习第一天 man

    Linux标准的读音:哩呐科斯 Linux是一种类UNIX的系统,具有以下特点: 1.免费开源 2.模块化程度高 3.广泛的硬件支持 4.安全稳定 5.多用户,多任务(所以常应用于系统运维,以及合作开 ...

  5. ORA-01618 ORA-19809: limit exceeded for recovery files

    由于DB_RECOVERY_FILE_DEST_SIZE 参数设置太小,导致redo只能创建一组,无法创建节点二的日志组,节点二数据库无法启动,如下图: 修改参数后,节点二无法启动到mount模式,无 ...

  6. 第二章 Python基础语法

    2.1 环境的安装 解释器:py2 / py3 (环境变量) 开发工具:pycharm 2.2 编码 编码基础 ascii ,英文.符号,8位为一个东西,2**8 unicode ,万国码,可以表示所 ...

  7. PB笔记之取项次最大值(即使用.describe(" evaluate('ITM_max',0) ") 获取列的最大值) 的条件

    dw_1.describe(" evaluate('ITM_max',0) ")  :使用 describe 配合 evaluate 取列的最大最小值(或其它表达式)时,必须在数据 ...

  8. Quartz入门以及相关表达式使用

    目的: 1.Quartz简介及应用场景 2.Quartz简单触发器 SimpleTrigger介绍 3.Quartz表达式触发器CronTirgger介绍 4.Quartz中参数传递 5.Spring ...

  9. "一起来捉妖"怎么从瘸腿中组合到最合心意的妖灵

    背景: 最近两天活动,黑鬼白鬼合体觉醒秋容,陆无名,聂小倩,作为一个非土豪玩家,没有超高资质妖灵的我,想要在瘸腿妖灵中选取两个最佳选择,合体觉醒. 初选: 备选妖灵从5个维度录入数据,进行选择,分别为 ...

  10. 关于window.location.hash的理解及其应用(转)

    原文1:https://blog.csdn.net/zhuchuji/article/details/50736360 原文2(window.location.href和window.location ...