一.项目简介

该爬虫是使用Python框架Scrapy开发,用来爬取新浪网首页分类的爬虫项目,适合新手用来学习Scrapy框架的使用及开发流程。
爬虫的目标网站地址:http://news.sina.com.cn/guide/
项目一共要爬取三级内容,分别是大类,小类,小类中的资讯文章。如下图所示,新闻,体育是一个大类,新闻大类下有国内,国际,社会等几个小类

在国际小类中,有很多资讯文章,该爬虫的最终目标就是爬取这些资讯文章的内容。

我们需要做的工作是为每个大类创建一个文件夹,每个大类的文件夹下为其对应的小类再创建一个子文件夹,然后将资讯文件存储到对应的小类文件夹中
最终效果展示:


二.项目过程

1.使用命令创建Scrapy爬虫项目

首先要安装Scrapy框架,Scrapy的安装在我的另一篇博客:https://blog.csdn.net/eagleuniversityeye/article/details/80644804

scrapy startproject mySpider

2.使用命令创建sina爬虫

scrapy genspider sina

3.完善sina爬虫

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 = MySpiderItem()# 保存大类的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 = MySpiderItem()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

4.完善items文件

class MySpiderItem(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()

5.完善pipelines文件

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

6.在setting添加设置

BOT_NAME = 'mySpider'SPIDER_MODULES = ['mySpider.spiders']
NEWSPIDER_MODULE = 'mySpider.spiders'ITEM_PIPELINES = {'mySpider.pipelines.SinaPipeline': 300,
}LOG_LEVEL = 'DEBUG'

7.创建爬虫启动文件

在爬虫项目的根目录下创建一个文件名为main.py的文件
使用该文件设置命令启动爬虫,注意启动命令为:scrapy crawl 爬虫名,爬虫名就是你在第二步创建的爬虫的名字,注意两两个名称要对应

from scrapy import cmdline
cmdline.execute('scrapy crawl sina'.split())

8.设置启动项

在PyCharm中设置项目启动方式,如下图所示,主要配置这两点。该项目使用的是Python3,如果使用Python2还需要进行编码转换,这里不再赘述

新浪网首页新闻资讯爬虫项目相关推荐

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

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

  2. 【爬虫】Yhen带你用Python打造每日新闻资讯速达小工具。

    以下内容为本人原创,欢迎大家观看学习,禁止用于商业用途,转载请说明出处,谢谢合作! ·作者:@Yhen ·原文网站:CSDN ·原文链接:https://blog.csdn.net/Yhen1/art ...

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

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

  4. 基于Spark的新闻推荐系统,包含爬虫项目、web网站以及spark推荐系统

    下载地址:https://download.csdn.net/download/ouyangxiaobai123/22174377 项目介绍: 基于Spark的新闻推荐系统,包含爬虫项目.web网站以 ...

  5. 写一个简单的爬虫来批量爬取新浪网的新闻

    如标题,学习爬虫也有一段时间了,今天来爬取一下新浪网的新闻(其实之前自己爬过,但是隔了好久发现新浪网的网页结构有一些变化导致之前的爬虫失效了,这两天进行了一下代码更新),话不多说,进入正题. 工具:A ...

  6. Python新闻推荐系统+爬虫+可视化 大数据项目 源码下载

    Python新闻推荐系统+爬虫+可视化 大数据项目 源码下载 网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题.文本.图片.视频链接 推荐算法:权重衰减+标签推荐+区域推荐+热点推 ...

  7. 新闻资讯小程序app

    1.系统情况 该新闻资讯小程序 主要是用户可以查看各种各样的新闻资讯,并且可以进行注册,登录账号,搜索,评论,点赞,收藏,浏览新闻等操作,该小程序分为前台和后台管理系统.东西很多,非常值得学习,二次开 ...

  8. nodejs+vue+elementui游戏新闻资讯网站管理系统

    系统分为用户和管理员两个角色:     管理员功能:                 管理员登录系统后台                 资讯标签,管理员对资讯的标签进行添加删除等           ...

  9. 新闻资讯小程序开发实践

    新闻资讯小程序开发实践 在腾讯小程序上线一周年之际,公司又决定把App产品部分内容在小程序上实现.就在小程序刚上线的时候,公司也有一款产品进行了小程序的研发,但后续没有持续的维护.这过了一年的时间,微 ...

最新文章

  1. 15个创意的电梯广告
  2. 脑电数据分析工具汇总
  3. On Perseverance
  4. php5.1 facade,php设计模式 Facade(外观模式)
  5. tp5.0路由route.php,thinkphp5.1使用Route路由
  6. 每日一笑 | 床上还是桌上,你总得选一样~
  7. spring依赖注入_Spring的依赖注入陷阱
  8. VS2010安装异常中断后无法安装的解决方法(安装时发生严重错误)
  9. [你必须知道的.NET]第三十回:.NET十年(下)
  10. python自动化工具_AWD_Hunter, 一个基于Python2.7的AWD自动化工具
  11. soapUI(groovy脚本作用1)请不要问为什么系列1
  12. Springboot入门到精通(超详细文档)
  13. 前后端ajax分离如何做seo,前后端分离 seo
  14. python抓取下载https://unsplash.com/的图片
  15. 计算机为什么老是重启,为什么电脑开机后总是自动重启?电脑开机后自动重启怎么办?...
  16. Linux C编程一站式学习笔记2
  17. 讯飞智能录音笔SR302为职场人带来办公新体验
  18. 分治、CDQ分治小结
  19. 非全日制做JAVA,全日制与非全日制详解
  20. 在线抠图和换背景及擦除工具

热门文章

  1. 细菌基因组框架图+比较基因组学分析助力细菌耐药和毒力研究
  2. 【流量卡申请被拒】在网上申请电信流量卡没通过怎么办?
  3. RFID之linux下利用PN532对M1卡(饭卡,
  4. 最长公共子序列问题(C语言)
  5. (js)扁平数组树状化 树状数组扁平化
  6. RandomErasing代码讲解与使用
  7. excel vlookup函数进阶教程一
  8. SMAL2.0集成单点登录(SAP-SF)
  9. 设计模式:装饰模式 c++实现
  10. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形