Python:新浪网分类资讯爬虫
爬取新浪网导航页所有下所有大类、小类、小类里的子链接,以及子链接页面的新闻内容。
效果演示图:
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:新浪网分类资讯爬虫相关推荐
- (实战项目三)新浪网分类资讯爬虫
(实战项目三)新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: ' items.py import scrapy import sys ...
- 尝试改写新浪网分类资讯爬虫2
将已有的新浪网分类资讯Scrapy爬虫项目,修改为基于RedisSpider类的scrapy-redis分布式爬虫项目 注:items数据直接存储在Redis数据库中,这个功能已经由scrapy-re ...
- 新浪网首页新闻资讯爬虫项目
一.项目简介 该爬虫是使用Python框架Scrapy开发,用来爬取新浪网首页分类的爬虫项目,适合新手用来学习Scrapy框架的使用及开发流程. 爬虫的目标网站地址:http://news.sina. ...
- 【浅谈爬虫】一名合格的Python爬虫工程师必须具备技能—具体了解四大Python爬虫分类以及爬虫基本原理实现
一.网络爬虫概述 网络爬虫(又被称作为网络蜘蛛.网络机器人,在某社区中经常被称为网页追逐者),可以按照指定的规则(网络爬虫的算法)自动浏览或抓取网络中的信息,通过Python可以很轻松地编写爬虫程序或 ...
- 【实用工具系列之爬虫】python爬取资讯数据
系列 1.[实用工具系列之爬虫]python实现爬取代理IP(防 '反爬虫') 2.[实用工具系列之爬虫]python爬取资讯数据 前言 在大数据架构中,数据收集与数据存储占据了极为重要的地位,可以说 ...
- python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3
利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...
- python简单实践作业_【Python】:简单爬虫作业
使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...
- 【Python笔记】网络爬虫——介绍
初识网络爬虫 网络爬虫概述 网络爬虫的分类 通用式网络爬虫 聚焦网络爬虫 增量式网络爬虫 深层网络爬虫 网络爬虫的基本原理 随着大数据时代的来临,网络信息量也变得更多.更大.网络爬虫在互联网中的地位将 ...
- python官网学习爬虫资料_Python爬虫学习?
1 爬虫是互联网上最常见的一种东西了吧. 爬虫这东西每天都在网上爬大量的信息,各大搜索引擎厂商每天都有上百万的爬虫在网络上活动,这些爬虫的作用就是给搜索引擎采集互联网上最新的内容,采集来的内容经过分类 ...
最新文章
- Xcode下 gdb 调试命令
- html制作滚动游戏,HTML标签marquee实现滚动效果的简单方法(必看)
- E - Code Parsing CodeForces - 255B(思维)
- Vue warn Failed to mount component: template or render function not defined
- jmx 复用 jmx_JMX:一些入门说明
- mysql5.7 至少需要1560,mysq5.7.28配置innodb_page_size错误引起的错误1071(42000)
- 安装配置文件共享协议(SAMBA)
- 基于matlab遗传算法工具箱的曲线拟合,基于Matlab遗传算法工具箱的曲线拟合
- MAC中配置SDK环境变量
- 开宗明义—UEFI介绍 (二)
- 安装打印机驱动步骤(win10)
- PS RGB通道抠图方法
- 搭建企业级数据治理体系指南
- 坯子库和suapp哪个好用_关于Sketchup插件安装使用,你应该知道的那些事
- 蚂蚁课堂 - springboot入门(非常详细)讲解人:(余胜军)
- git 知:贮藏与清理
- IT行业考证规划,从年薪3万到30万
- TAP---资料整合----Good Luck!
- 文本大数据挖掘项目(Go语言)
- 第16节 综合实验——在域中配置HDCP、WEB服务器及共享文件服务器(待完善)