## 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. [DevExpress] - 在 DataGrid 中添加多选复选框的方法

    设置方法 在 GridView 中设置 OptionSelection 属性如下: 效果 参考资料 https://stackoverflow.com/a/9078848http://blog.csd ...

  2. xsy 2412【BZOJ4569】【Scoi2016】萌萌哒

    Description Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2, ...

  3. django使用pyecharts(1)----django加入echarts

    Django 中使用 pyecharts.一.普通django加入echarts Django 模板渲染 Step 0: 新建一个 Django 项目 $ django-admin startproj ...

  4. Django模板语言中的Filters的使用方法

    Filters可以称为过滤器.下面我们简单介绍是如何使用他的. Filters的语法: {{ value|filter_name:参数 }} Django大概提供了六十个内置过滤器,下面我们简单介绍几 ...

  5. go 错误

    错误 Go 程序使用 error 值来表示错误状态. 与 fmt.Stringer 类似,`error` 类型是一个内建接口: type error interface { Error() strin ...

  6. Singer House CodeForces - 830D (组合计数,dp)

    大意: 一个$k$层完全二叉树, 每个节点向它祖先连边, 就得到一个$k$房子, 求$k$房子的所有简单路径数. $DP$好题. 首先设$dp_{i,j}$表示$i$房子, 分出$j$条简单路径的方案 ...

  7. 解决batik使用JScrollPane显示svg图滚动条不显示的问题

    // 必须使用batik提供的JSVGScrollPane,使用swing自己的组件JScrollPane初始化时滚动条不会显示. JSVGScrollPane svgJScrollPane = ne ...

  8. Synergy 一套键鼠同时控制多台电脑

    百度云(1.5是最后一个免费的版本,linux,mac,windows全有): 链接: https://pan.baidu.com/s/1A_qR8FHd8a0ILQXsSqjfCQ 密码: 9h8c

  9. sql 防注入(更新问题)

    一下这条语句虽然不会是数据表中的数据发生变化,但是会对数据库主从造成影响 update `article` where `article_id` = '40&n974742=v995656' ...

  10. php框架——laravel

    准备工作:见php语法篇末尾环境部署 一.[创建一个表+插入数据]:手动创建或者执行sql语句 DROP TABLE IF EXISTS `tb_business`; CREATE TABLE IF ...