python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)
## 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)的更多相关文章
- Python Scrapy 爬虫框架实例(一)
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- Python Scrapy 爬虫框架实例
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )
1. start_urls -- 起始URL 的内部实现(将迭代器转换为生成器) class QSpider(scrapy.Spider): name = 'q' allowed_domains ...
- python - scrapy 爬虫框架 ( redis去重 )
1. 使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...
- python scrapy爬虫框架概念介绍(个人理解总结为一张图)
python的scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架 python和scrapy的安装就不介绍了,资料很多 这里我个人总结一下,能更加快理解scrapy和快速上手一个简 ...
- [Python] Scrapy爬虫框架入门
说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...
- Python Scrapy爬虫框架之初次使用
此篇博客为本人对小甲鱼的课程的总结. 关于Scrapy的安装网上都有方法,这里便不再叙述. 使用Scrapy抓取一个网站一共需要四个步骤: 0.创建一个Scrapy项目: 1.定义Item容器: 2. ...
- scrapy 爬虫框架之持久化存储
scrapy 持久化存储 一.主要过程: 以爬取校花网为例 : http://www.xiaohuar.com/hua/ 1. spider 回调函数 返回item 时 要用y ...
- (1)python Scrapy爬虫框架
部署 1.安装python3.6 64bit 2.下载pywin32 https://sourceforge.net/projects/pywin32/files/pywin32/ 双击安装 3.下 ...
随机推荐
- 创建线程的三种方式(Thread、Runnable、Callable)
方式一:继承Thread类实现多线程: 1. 在Java中负责实现线程功能的类是java.lang.Thread 类. 2. 可以通过创建 Thread的实例来创建新的线程. 3. 每个线程都是通过某 ...
- Redis--set类型操作命令
集合类型 set redis 的 Set 是 string 类型的无序集合,集合成员是唯一的,即集合中不能出现重复的数据 集合类型 set ——常用命令 sadd /smembers /sismemb ...
- AVR单片机教程——随机点亮LED
之前我们做的闪烁LED和流水灯,灯效都是循环的.这次我们来尝试一些不一样的——每一次随机选择一个LED并点亮. 要实现随机的效果,我们要用C语言标准库中的相关设施: #define RAND_MAX ...
- Linux Nginx的权限——访问本地目录报错403
在安装好FastDFS并成功上传图片文件后,根据FastDFS返回的文件地址无法通过HTTP(即浏览器)访问到,报错404或者403. 不管是Error 404还是Error 403,基本都是Ngin ...
- 表单送件按钮代码(一)cs(C#)(未完)
protected void BtnRequest_Clich(object sender, EventArgs e) { lblMsg.Text= " " ; lblfmsg.T ...
- django css
1. settings.py最下方STATIC_URL下面补上 STATIC_URL = '/home/wjg/code/wblog/static/' STATIC_ROOT = os.path.jo ...
- iview的table组件中加入超链接组件,可编辑组件,选择组件,日期组件
这篇文章主要介绍了iview的table组件中使用选择框,日期,可编辑表格,超链接等组件. 1.select选择组件 // tableColumn数组响应对象需要传入一个固定的option数组,如果该 ...
- javascript -- 把按钮变成读秒倒计时
$('#btn').click(function(){ //设置按钮倒计时 $(this).addClass('disabled'); //把按钮变灰 $(this).attr('disabled', ...
- linux环境下jdk安装
1,下载jdk版本 jdk-7u25-linux-x64.tar.gz 和windows jdk一致,jvm有区别: 2,拷贝到 /home目录下.通过tar -zxvf jdk-7u25-linu ...
- PyCharm 占用过大 C 盘空间,system 配置文件迁移
随着 PyCharm 的持续使用,对应 C:\Users\<username>\.PyCharm<2018.3> 下的文件大小会持续增大,且通常为 system 文件夹下的内容 ...