高级深入--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,一经查实,立即删除!

相关文章

SQL[游标+动态SQL+表函数]返回指定表名的某行的所有列合并后的值,主要提供给数据库表的更新记录事件

Create PROCEDURE [dbo].[SysGetTableFieldsCombine] -- -- Description: <返回指定表名的某行的所有列合并后的值,主要提供给数据库表的更新记录事件> -- Return 0- 成功&#xff0c; -1- 没有这个表 -- Rev: 1.00 -- ObjectName Nvarchar(100) , ObjectPKId cha…

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全家桶的一员&#xff0c;它为react给i共可预测化的状态管理机制。redux是将整个应用状态存储到一个地方&#xff0c;成为store,里面存放着一颗树状态(state,tree),组件可以派发dispatch行为action给store,而不是直接通知其…

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

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

SpringCloud 微服务全栈体系(四)

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

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

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

MySQL外键,表与表的关系,多表查询,Navicat软件

外键 MySQL可以使用外键来保持表之间的关系完整性。 要设置外键&#xff0c;可以按照以下步骤进行操作&#xff1a; 在创建表时&#xff0c;使用FOREIGN KEY关键字来指定外键列&#xff1a; CREATE TABLE table1 (id INT PRIMARY KEY,name VARCHAR(50),table2_id INT,FOREI…

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

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

优化AIDL回调接口调用代码

RemoteCallbackList 是 Android 中的一个类&#xff0c;用于管理跨进程的回调接口。它提供了一种安全和高效的方式来管理多个回调对象&#xff0c;并避免因为进程间通信 (IPC) 导致的内存泄漏问题。RemoteCallbackList 的主要作用是在客户端和服务端之间传递回调对象&#xff0…

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

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

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

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

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

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

Zabbix安装与部署

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

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

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

React-hooks有哪些用法?

React Hooks 是 React 16.8 引入的一种新的特性,用于在函数组件中使用状态和其他 React 特性。下面列举了一些常见的 React Hooks 的用法: 1:useState:用于在函数组件中添加状态。: import React, { useState } from react;function MyComponent() {const [count, setCou…

【Linux】CentOS8.4 安装docker

&#x1f984; &#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&#x1fa81;&#x1f341;&#x1fa81;&…

C++模版进阶

一、非类型模版参数 之前学习的模版&#xff0c;参数一般是某种类型&#xff0c;但其实非类型的参数也可以定义在模版里面&#xff0c;但也有一定的限制&#xff0c;只可以定义整形家族的参数&#xff0c;而且具有常量性 注意&#xff1a; 1. 浮点数、类对象以及字符串是不允…

Spring Boot 为什么会出现 ?

Spring Boot出现的背景和原因有以下几个方面&#xff1a; 简化Spring应用的开发和部署&#xff1a;Spring Framework 是一个功能强大但相对复杂的框架&#xff0c;它需要进行繁琐的配置和设置。Spring Boot的目标之一是简化Spring应用的开发过程&#xff0c;减少开发的工作量&a…

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

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

数据结构:二叉搜索树

目录 1、二叉搜索树概念 2、 二叉搜索树的插入 3、二叉搜索树的查找 4、二叉搜索树的删除 5、二叉搜索树的中序遍历 实现 1、二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#…