## 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. php密码正则匹配

    <?php /** * @param $pwd * @return string */ function isPwd($pwd){ $pattern= '/^[0-9a-z_$]{6,16}$/ ...

  2. 串的两种模式匹配方式(BF/KMP算法)

    前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最重要的操作之一,而不同的算法实现有着不同的 ...

  3. RocketMq 集群方式搭建 步骤教学包教包会

    mq集群方式搭建 有段时间没写这些技术文章了, 今天抽空写一点,不然自己都快忘记了 这篇文章记录了rocketmq 集群方式搭建的过程, 也是自己半天的成果记录吧! 感兴趣的朋友点个赞在走呗! 好了, ...

  4. Hbuilder环境下配置php

    XAMPP的安装 https://blog.csdn.net/qing666888/article/details/81914389 安装并配置好Xampp后,在Hbuilder中下载php插件,工具 ...

  5. C++ 数组和vector的基本操作

    1.静态数组的基本操作 int a[5] = {0, 3, 4, 6, 2}; 1.1 数组的遍历 1.1.1 传统的for循环遍历 int size = sizeof(a) / sizeof(*a) ...

  6. Linux 进程控制

    分享知乎上看到的一句话,共勉: 学习周期分为学习,思考,实践,校正四个阶段,周期越短,学习效率越高. 前面讲的都是操作系统如何管理进程,接下来,看看用户如何进行进程控制. 1.进程创建 先介绍一下函数 ...

  7. java 读取文件流

    搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...

  8. AVOSCloud入门教程:Android Parse云服务的Hello World

    本文时间戳:2013年8月30日 AVOSCloud(万象云)才刚刚推出来不久的咯,其背后创业的推动者据说是Youtube的华人老大陈士骏(SteveChen,貌似手头有很多创业,美味,玩拍,都是,开 ...

  9. PLSQL登录的时候Warning提示:Using a filter for all users can lead to poor performance!

    转自: https://blog.csdn.net/athena2015/article/details/81811908

  10. 三:MySQL系列之SQL查询

    本篇主要介绍使用SQL查询数据库的操作,包括条件查询.排序.聚合函数.分组.分页.连接查询.自关联.子查询等命令操作. 首先我们先创建一个数据库.数据表.插入字段: --------这部分在上篇以及介 ...