高级深入--day39

(实战项目三)新浪网分类资讯爬虫

爬取新浪网导航页所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。

效果演示图:

items.py
import scrapy
import sys
reload(sys)
sys.setdefaultencoding("utf-8")class SinaItem(scrapy.Item):# 大类的标题 和 urlparentTitle = scrapy.Field()parentUrls = scrapy.Field()# 小类的标题 和 子urlsubTitle = scrapy.Field()subUrls = scrapy.Field()# 小类目录存储路径subFilename = scrapy.Field()# 小类下的子链接sonUrls = scrapy.Field()# 文章标题和内容head = scrapy.Field()content = scrapy.Field()
spiders/sina.py
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-from Sina.items import SinaItem
import scrapy
import osimport sys
reload(sys)
sys.setdefaultencoding("utf-8")class SinaSpider(scrapy.Spider):name= "sina"allowed_domains= ["sina.com.cn"]start_urls= ["http://news.sina.com.cn/guide/"]def parse(self, response):items= []# 所有大类的url 和 标题parentUrls = response.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()parentTitle = response.xpath("//div[@id=\"tab01\"]/div/h3/a/text()").extract()# 所有小类的ur 和 标题subUrls  = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()subTitle = response.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()#爬取所有大类for i in range(0, len(parentTitle)):# 指定大类目录的路径和目录名parentFilename = "./Data/" + parentTitle[i]#如果目录不存在,则创建目录if(not os.path.exists(parentFilename)):os.makedirs(parentFilename)# 爬取所有小类for j in range(0, len(subUrls)):item = SinaItem()# 保存大类的title和urlsitem['parentTitle'] = parentTitle[i]item['parentUrls'] = parentUrls[i]# 检查小类的url是否以同类别大类url开头,如果是返回True (sports.sina.com.cn 和 sports.sina.com.cn/nba)if_belong = subUrls[j].startswith(item['parentUrls'])# 如果属于本大类,将存储目录放在本大类目录下if(if_belong):subFilename =parentFilename + '/'+ subTitle[j]# 如果目录不存在,则创建目录if(not os.path.exists(subFilename)):os.makedirs(subFilename)# 存储 小类url、title和filename字段数据item['subUrls'] = subUrls[j]item['subTitle'] =subTitle[j]item['subFilename'] = subFilenameitems.append(item)#发送每个小类url的Request请求,得到Response连同包含meta数据 一同交给回调函数 second_parse 方法处理for item in items:yield scrapy.Request( url = item['subUrls'], meta={'meta_1': item}, callback=self.second_parse)#对于返回的小类的url,再进行递归请求def second_parse(self, response):# 提取每次Response的meta数据meta_1= response.meta['meta_1']# 取出小类里所有子链接sonUrls = response.xpath('//a/@href').extract()items= []for i in range(0, len(sonUrls)):# 检查每个链接是否以大类url开头、以.shtml结尾,如果是返回Trueif_belong = sonUrls[i].endswith('.shtml') and sonUrls[i].startswith(meta_1['parentUrls'])# 如果属于本大类,获取字段值放在同一个item下便于传输if(if_belong):item = SinaItem()item['parentTitle'] =meta_1['parentTitle']item['parentUrls'] =meta_1['parentUrls']item['subUrls'] = meta_1['subUrls']item['subTitle'] = meta_1['subTitle']item['subFilename'] = meta_1['subFilename']item['sonUrls'] = sonUrls[i]items.append(item)#发送每个小类下子链接url的Request请求,得到Response后连同包含meta数据 一同交给回调函数 detail_parse 方法处理for item in items:yield scrapy.Request(url=item['sonUrls'], meta={'meta_2':item}, callback = self.detail_parse)# 数据解析方法,获取文章标题和内容def detail_parse(self, response):item = response.meta['meta_2']content = ""head = response.xpath('//h1[@id=\"main_title\"]/text()')content_list = response.xpath('//div[@id=\"artibody\"]/p/text()').extract()# 将p标签里的文本内容合并到一起for content_one in content_list:content += content_oneitem['head']= headitem['content']= contentyield item
pipelines.py
from scrapy import signals
import sys
reload(sys)
sys.setdefaultencoding("utf-8")class SinaPipeline(object):def process_item(self, item, spider):sonUrls = item['sonUrls']# 文件名为子链接url中间部分,并将 / 替换为 _,保存为 .txt格式filename = sonUrls[7:-6].replace('/','_')filename += ".txt"fp = open(item['subFilename']+'/'+filename, 'w')fp.write(item['content'])fp.close()return item
settings.py
BOT_NAME = 'Sina'SPIDER_MODULES = ['Sina.spiders']
NEWSPIDER_MODULE = 'Sina.spiders'ITEM_PIPELINES = {'Sina.pipelines.SinaPipeline': 300,
}LOG_LEVEL = 'DEBUG'
在项目根目录下新建main.py文件,用于调试
from scrapy import cmdline
cmdline.execute('scrapy crawl sina'.split())
执行程序
py2 main.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/118716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAD notes

ESKF 总结 prediction 更新误差先验 F F F通过3.42来算 得到 这里有点绕的一点是: 误差状态的 F F F牵涉到名义状态, 而名义状态又需要在时间上推进更新 其中, F中的名义状态的推进通过公式3.41得到, (名义状态不考虑误差, 这一点从3.41d, 3.41e可以看出, 误差状态只考虑…

React-Redux总结含购物车案例

React-Redux总结含购物车案例 reduc简介 redux是react全家桶的一员,它为react给i共可预测化的状态管理机制。redux是将整个应用状态存储到一个地方,成为store,里面存放着一颗树状态(state,tree),组件可以派发dispatch行为action给store,而不是直接通知其…

Spring Authorization Server 1.1 扩展 OAuth2 密码模式与 Spring Cloud Gateway 整合实战

目录 前言无图无真相创建数据库授权服务器maven 依赖application.yml授权服务器配置AuthorizationServierConfigDefaultSecutiryConfig 密码模式扩展PasswordAuthenticationTokenPasswordAuthenticationConverterPasswordAuthenticationProvider JWT 自定义字段自定义认证响应认…

SpringCloud 微服务全栈体系(四)

第六章 Nacos 配置管理 Nacos 除了可以做注册中心,同样可以做配置管理来使用。 一、统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案…

ubuntu执行普通用户或root用户执行apt-get update时报错Couldn‘t create temporary file /tmp/...

apt-get update无法更新,报错: Couldnt create temporary file /tmp/apt.conf.GSzv74 for passing config to,,, 这是由于/tmp目录没有权限导致的,解决办法: chmod 777 /tmp

Redis 配置文件(redis.conf)中文注释及说明

文章目录 一、概述二、觉见基础配置1.1 导入另一个配置文件1.2 添加Redis扩展1.3 绑定Redis服务在那些网卡上,也就是远程可以通过那个的IP地址访问。1.2 指定Redis服务监听端口1.2 最大分配内容大小1.2 后台服务方式运行1.2 日志记录文件1.2 添加扩展 三、完整配置文…

Photoshop(PS)安装教程(图文教程超详细)

目录 一.简介 二.安装步骤 软件:PS版本:2023语言:简体中文大小:3.20G系统要求:Win10(1903)及以上版本,64位操作系统硬件要求:CPU2.0GHz 内存8G(或更高,不支…

Open3D(C++) 最小二乘拟合平面(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 平面方程的一般表达式为: A x + B y + C

力扣每日一题74:搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。…

Zabbix安装与部署

前言 Zabbix是一个开源的网络监控和系统监控解决方案,用于监控服务器、网络设备、应用程序和服务。它基于客户端-服务器体系结构,使用多种监控选项来监控不同类型的设备和应用程序。Zabbix支持数据收集、处理和存储,以及报警和可视化等功能。…

科技资讯|苹果穿戴新专利,表带、服装等织物可变身柔性屏幕或扬声器

根据美国商标和专利局(USPTO)本周公示的清单,苹果公司获得了一项新的技术专利,可以在 Apple Watch 表带、服装等物品上,引入基于织物的柔性扬声器。 根据专利描述,通过在织物中嵌入声学组件(例…

【Linux】CentOS8.4 安装docker

🦄 🎐个人主页 🎐✨🍁 🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油!🪁🍁🪁&…

达芬奇MacOS最新中文版 DaVinci Resolve Studio 18中文注册秘钥

DaVinci Resolve Studio 18是一款专业的视频编辑软件,它具有多种强大的功能。首先,它提供了丰富的视频剪辑工具,如剪切、复制、粘贴、剪辑、缩放和移动等,使用户可以轻松地剪辑和组合视频素材。其次,该软件还支持多个轨…

Python第三方库 - Flask(python web框架)

1 Flask 1.1 认识Flask Web Application Framework( Web 应用程序框架)或简单的 Web Framework( Web 框架)表示一个库和模块的集合,使 Web 应用程序开发人员能够编写应用程序,而不必担心协议,线…

定档11月2日,YashanDB 2023年度发布会即将启航

数据库作为支撑核心业务的关键技术,对数字经济的发展有着重要的支撑作用,随着云计算、AI等技术的迅猛发展和数据量的爆发式增长,推动着数据库技术的加速创新。 为了应对用户日益复杂的数据管理需求,赋能行业国产化建设和数字化转型…

unity 一键替换 UI上所有字体,批量替换字体(包括:Text和Text (TMP))

前言:在开发中会遇到这种情况,开发完了,发现UI字体没有替换,特别是需要发布到WebGL端的同学,突然发现无法显示汉字了。下面一个非常方便的方法完美解决。 1.解压出来的脚本放在Edit文件下,没有的创建一个 2…

2016年亚太杯APMCM数学建模大赛A题基于光学信息数据的温度及关键元素含量预测求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 A题 基于光学信息数据的温度及关键元素含量预测 原题再现 光含有能量,在一定条件下可以转化为热。燃烧是一种常见的现象,既能发光又能发热。光和热通常是同时存在的,一般来说,光强度越高&#xf…

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下,“Z世代”作为当下我国的消费主力,正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”,这和香水、香氛为代表的“嗅觉经济”的特性充分契合,因此&#…

【计算机网络笔记】网络应用对传输服务的需求

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

USB学习(2):USB端点和传输协议(数据包、事物)详解

接着上一篇文章USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式,继续介绍一下USB的相关知识。 文章目录 1 USB端点(Endpoints)1.1 基本知识1.2 四种端点 2 传输协议2.1 数据包类型2.1.1 令牌数据包(Token packets)2.1.2 数据数…