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

效果演示图:

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

Python:新浪网分类资讯爬虫相关推荐

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

    (实战项目三)新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: ' items.py import scrapy import sys ...

  2. 尝试改写新浪网分类资讯爬虫2

    将已有的新浪网分类资讯Scrapy爬虫项目,修改为基于RedisSpider类的scrapy-redis分布式爬虫项目 注:items数据直接存储在Redis数据库中,这个功能已经由scrapy-re ...

  3. 新浪网首页新闻资讯爬虫项目

    一.项目简介 该爬虫是使用Python框架Scrapy开发,用来爬取新浪网首页分类的爬虫项目,适合新手用来学习Scrapy框架的使用及开发流程. 爬虫的目标网站地址:http://news.sina. ...

  4. 【浅谈爬虫】一名合格的Python爬虫工程师必须具备技能—具体了解四大Python爬虫分类以及爬虫基本原理实现

    一.网络爬虫概述 网络爬虫(又被称作为网络蜘蛛.网络机器人,在某社区中经常被称为网页追逐者),可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息,通过Python可以很轻松地编写爬虫程序或 ...

  5. 【实用工具系列之爬虫】python爬取资讯数据

    系列 1.[实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') 2.[实用工具系列之爬虫]python爬取资讯数据 前言 在大数据架构中,数据收集与数据存储占据了极为重要的地位,可以说 ...

  6. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

  7. python简单实践作业_【Python】:简单爬虫作业

    使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...

  8. 【Python笔记】网络爬虫——介绍

    初识网络爬虫 网络爬虫概述 网络爬虫的分类 通用式网络爬虫 聚焦网络爬虫 增量式网络爬虫 深层网络爬虫 网络爬虫的基本原理 随着大数据时代的来临,网络信息量也变得更多.更大.网络爬虫在互联网中的地位将 ...

  9. python官网学习爬虫资料_Python爬虫学习?

    1 爬虫是互联网上最常见的一种东西了吧. 爬虫这东西每天都在网上爬大量的信息,各大搜索引擎厂商每天都有上百万的爬虫在网络上活动,这些爬虫的作用就是给搜索引擎采集互联网上最新的内容,采集来的内容经过分类 ...

最新文章

  1. Xcode下 gdb 调试命令
  2. html制作滚动游戏,HTML标签marquee实现滚动效果的简单方法(必看)
  3. E - Code Parsing CodeForces - 255B(思维)
  4. Vue warn Failed to mount component: template or render function not defined
  5. jmx 复用 jmx_JMX:一些入门说明
  6. mysql5.7 至少需要1560,mysq5.7.28配置innodb_page_size错误引起的错误1071(42000)
  7. 安装配置文件共享协议(SAMBA)
  8. 基于matlab遗传算法工具箱的曲线拟合,基于Matlab遗传算法工具箱的曲线拟合
  9. MAC中配置SDK环境变量
  10. 开宗明义—UEFI介绍 (二)
  11. 安装打印机驱动步骤(win10)
  12. PS RGB通道抠图方法
  13. 搭建企业级数据治理体系指南
  14. 坯子库和suapp哪个好用_关于Sketchup插件安装使用,你应该知道的那些事
  15. 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
  16. git 知:贮藏与清理
  17. IT行业考证规划,从年薪3万到30万
  18. TAP---资料整合----Good Luck!
  19. 文本大数据挖掘项目(Go语言)
  20. 第16节 综合实验——在域中配置HDCP、WEB服务器及共享文件服务器(待完善)

热门文章

  1. UUID的使用及其原理
  2. 2022-2028年中国抗盐粘土行业发展现状调查及前景战略分析报告
  3. centos使用yum快速安装java的方法
  4. Redis集群管理方式
  5. 安装win下的Anaconda ----针对python3.6.4版本
  6. 堆栈,数据,文本,heap,bss,text data,stack
  7. CUDA运行时 Runtime(四)
  8. 深度学习数据特征提取:ICCV2019论文解析
  9. 2021年大数据Hadoop(三十):Hadoop3.x的介绍
  10. 2021年大数据Spark(十四):Spark Core的RDD操作