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.下 ...
随机推荐
- 自定义注解扩展springMvc的validation注解
文章目录 前言 自定义校验注解 使用 后记 前言 我们都知道 springMvc 的检验框架使用的是 hibernate 的 validator ,检验数据,是有那么一点小爽快: 但是,validat ...
- C#中使用XML存储数据
创建XML文档 首先引用System.Xml命名空间 1.初始化一个实例 XmlDocument xd = new XmlDocument(); 2.创建XML头文件声明 XmlDeclaration ...
- 机器学习之主成分分析PCA原理笔记
1. 相关背景 在许多领域的研究与应用中,通常需要对含有多个变量的数据进行观测,收集大量数据后进行分析寻找规律.多变量大数据集无疑会为研究和应用提供丰富的信息,但是也在一定程度上增加了数据采集的 ...
- Hadoop 完全分布式搭建
搭建环境 https://www.cnblogs.com/YuanWeiBlogger/p/11456623.html 修改主机名------------------- 1./etc/hostname ...
- 使用UltraISO制作Centos7 U盘启动盘遇到的坑
下载.安装UltraISO软件 安装好以后,打开软件 击菜单栏的"文件"选项,再点击"打开"按钮,选择要刻录的系统镜像 点击菜单栏的"启动" ...
- springboot 使用consul 读取配置文件(遇到的坑太多,没记录)
最终成功版. pom引入mavn依赖: <!--consul--> <dependency> <groupId>org.springframework.cloud& ...
- js按钮频繁提交解决方案:
1.封装js: /// 函数节流 xhz.canRun = true; xhz.Throttling = function () { if (!xhz.canRun) { layer.msg('处理中 ...
- VS.NET(C#)--2.1认识控件
Web控件 四种控件 1.HTML控件 2.HTML服务器控件 在服务器端执行 3.ASP.NET服务器控件 在服务器端执行 4.用户控件和自定义控件 用户自定义控件在服务器端执行 注意: ...
- css 点击样式,水波纹(记录备用)
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...
- SpringBoot启动流程与源码
一 main方法作为程序的入口,执行SpringApplication.run(),传入参数是启动类的class对象@SpringBootApplication注解 二 run中首先new Sprin ...