要求:

  1. 存储文章的标题、作者、发布时间、正文、正文中的图片链接、文章链接、文章所属分类
  2. 根据网站的实时更新(周期1分钟)进行采集
  3. 时间格式保存为"yyyy-mm-dd HH:MM:SS"
  4. 存储到mysql数据库

代码实现如下:

新浪滚动的爬虫文件:

# spiders/sina_gundong.py
import timefrom scrapy_plus.core.spider import Spider
from scrapy_plus.http.request import Request
from scrapy_plus.item import Item
import js2pyclass SinaGunDong(Spider):name = "sina_gundong"headers = {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7","Cache-Control": "no-cache","Connection": "keep-alive","Cookie": "UOR=www.google.com,www.sina.com.cn,; SGUID=1520816292777_83076650; SINAGLOBAL=211.103.136.242_1520816292.736990; SUB=_2AkMt-V_2f8NxqwJRmPEQy2vmZYx_zwjEieKbpa4tJRMyHRl-yD83qnIJtRB6BnlxGSLw2fy6O04cZUKTsCZUeiiFEsZE; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WhpFUZmqbYYLueonGrZIL2c; U_TRS1=0000001a.e268c0.5aaa0d39.35b0731a; lxlrttp=1521688012; Apache=223.72.62.219_1522208561.132697; ULV=1522208952476:6:6:3:223.72.62.219_1522208561.132697:1522208561158; U_TRS2=000000db.81c2323e.5abca69b.ad269c11; ArtiFSize=14; rotatecount=1; hqEtagMode=1",# "Host": "roll.news.sina.com.cn",   这里host必须禁用掉"Pragma": "no-cache","Referer": "http://roll.news.sina.com.cn/s/channel.php?ch=01","User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",}def start_requests(self):while True:# 需要发起这个请求,才能获取到列表页数据,并且返回的是一个js语句url = "http://roll.news.sina.com.cn/interface/rollnews_ch_out_interface.php?col=89&spec=&type=&ch=&k=&offset_page=0&offset_num=0&num=120&asc=&page=1&r=0.5559616678192825"yield Request(url, parse='parse', filter=False)time.sleep(60)     # 每60秒发起一次请求def parse(self, response):'''响应体数据是js代码'''# 使用js2py模块,执行js代码,获取数据ret = js2py.eval_js(response.body.decode("gbk"))    # 对网站分析发现,数据编码格式是gbk的,因此需要先进行解码for news in ret.list:    #yield Request(news["url"], headers=self.headers, parse='parse_detail', meta={"type": news["channel"]["title"]})def parse_detail(self, response):response.body = response.body.decode("utf-8")    # 部分页面无法正确解码,因此在这里手动进行解码操作title = response.xpath("//h1[@class='main-title']/text()")[0]pub_date = response.xpath("//span[@class='date']/text()")[0]try:author = response.xpath("//div[@class='date-source']//a/text()")[0]    # 由于作者的提取,有两种格式,因此这里使用一个异常捕获来进行判断except IndexError:author = response.xpath("//div[@class='date-source']//span[contains(@class,'source')]/text()")[0]content = response.xpath("//div[@class='article']//text()")    # 多个  每一个代表一段image_links = response.xpath("//div[@class='article']//img/@src")    # 图片链接有多个yield Item({"content": content,    # 正文"image_links":image_links,    # 图片链接"title": title,    # 标题"pub_date":pub_date,    # 发布日期"author": author,    # 作者"url": response.url,    # 文章链接"type": response.request.meta["type"],    # 文章所属分类})

项目中新建db.py

# 项目文件夹下db.py
# 依赖:sqlalchemy  pymysql
from sqlalchemy import Column,Integer,Text,DateTime, String
from sqlalchemy.ext.declarative import declarative_base# 创建对象的基类:
Base = declarative_base()class Model(Base):__tablename__ = 'sina_news'id = Column(Integer, primary_key=True, autoincrement=True)    # 主键idtitle = Column(String(100), nullable=False)    # 标题author = Column(String(20), nullable=False)    # 作者pub_date = Column(DateTime, nullable=False)    # 发布时间content = Column(Text, nullable=False)    # 正文image_links = Column(Text, nullable=False)    # 图片链接url = Column(String(500), nullable=False)    # 文章链接type = Column(String(6), nullable=False)    # 文章分类news_tag = Column(String(40), nullable=False)    # 文章去重标记

管道文件:

# 项目下管道文件 pipelines.pyimport json
from datetime import datetime
from hashlib import sha1from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from scrapy_plus.core.scheduler import utf8_stringfrom db import Base, Modelclass Pipeline(object):'''数据入库前的清洗和格式化处理'''def process_item(self, item, spider):item.data['pub_date'] = datetime.strptime(item.data['pub_date'], '%Y年%m月%d日 %H:%M') # 将时间格式进行一个处理,转换为datetime类型item.data['content'] = [i for i in item.data['content'] if i.strip()]    # 去掉content中的空白字符item.data['content'] = "\n\n".join(item.data["content"])item.data['image_links'] = json.dumps(item.data['image_links'])  # 列表转换为json字符串# 数据去重标识生成:利用标题、作者、文章链接生成唯一keys1 = sha1()s1.update(utf8_string(item.data['title']))s1.update(utf8_string(item.data['author']))s1.update(utf8_string(item.data['url']))item.data['news_tag'] = s1.hexdigest()    # 数据去重标识return itemclass MysqlPipeline(object):def __init__(self):# 建立数据库链接self.conn = create_engine("mysql+pymysql://root:ryoma@127.0.0.1/test3?charset=utf8")Base.metadata.create_all(bind=self.conn)    # 创建表,如果有,就不在创建def _get_session(self):# 创建session对象Session = sessionmaker(bind=self.conn)return Session()def process_item(self, item, spider):session = self._get_session()   # 获取session# 先判断news_tag是否已经存在:如果存在,代表数据是重复的,否则才插入if not session.query(Model).filter_by(news_tag=item.data['news_tag']).all():obj = Model(**item.data)    # 创建模型类对象session.add(obj)    # 插入数据session.commit()    # 提交session.close() # 关闭sessionreturn item

项目配置文件:

# 更改默认的配置
DEFAULT_LOG_FILENAME = '滚动新闻采集.log'    # 默认日志文件名称SPIDERS = ["spiders.sina.SinaGunDong"
]PIPELINES = ["pipelines.Pipeline","pipelines.MysqlPipeline"
]SPIDER_MIDS = [
]DOWNLOADER_MIDS = [
]# 控制最大并发数
MAX_ASYNC_NUMBER = 1# 异步模式  thread, coroutine
ASYNC_TYPE = 'thread''''分布式配置'''# 执行角色
# None 代表非分布式,发起初始请求(_start_requests), 处理请求(_execute_request_response_item)
# master代表主,只负责发起初始请求(_start_requests),并维护请求队列
# slave代表从,只负责处理请求(_execute_request_response_item)
# ROLE = 'master'
# ROLE = 'slave'
ROLE = None# 最大重试次数
MAX_RETRY_TIMES = 3# redis 队列的配置
REDIS_QUEUE_NAME = 'request_queue'
REDIS_QUEUE_HOST = 'localhost'
REDIS_QUEUE_PORT = 6379
REDIS_QUEUE_DB = 10# reids 集合配置
REDIS_SET_NAME = 'filter_container'
REDIS_SET_HOST = 'localhost'
REDIS_SET_PORT = 6379
REDIS_SET_DB = 10# 利用redis进行请求备份 的配置
REDIS_BACKUP_NAME = 'request_backup'
REDIS_BACKUP_HOST = 'localhost'
REDIS_BACKUP_PORT = 6379
REDIS_BACKUP_DB = 10

爬虫框架开发(4)--- 项目实战——新浪滚动新闻资讯实时数据采集相关推荐

  1. 《Python爬虫开发与项目实战》——第3章 初识网络爬虫 3.1 网络爬虫概述

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第3章,第3.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第3章 初识网 ...

  2. python爬虫项目实例-Python爬虫开发与项目实战

    Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...

  3. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  4. Python编程:从入门到实践+爬虫开发与项目实战+网络编程基础+项目开发实战

    给还在苦苦自学Python的小伙伴们分享一波学习教程~有了它们,至少能节省50%的时间,少走一半的弯路. 书不在多,而在于精~ <Python编程:从入门到实践>豆瓣评分9.2 本书是针对 ...

  5. python爬虫基础项目教程_Python爬虫开发与项目实战_Python教程

    资源名称:Python爬虫开发与项目实战 内容简介: 随着大数据时代到来,网络信息量也变得更多更大,基于传统搜索引擎的局限性,网络爬虫应运而生,本书从基本的爬虫原理开始讲解,通过介绍Pthyon编程语 ...

  6. 《Python爬虫开发与项目实战》——1.6 小结

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第1章,第1.6节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.6 小结 ...

  7. 《Python爬虫开发与项目实战》——第1章 回顾Python编程 1.1 安装Python

    本节书摘来自华章计算机<Python爬虫开发与项目实战>一书中的第1章,第1.1节,作者:范传辉著,更多章节内容可以访问云栖社区"华章计算机"公众号查看 第1章 回顾P ...

  8. 笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫

    笨办法学Python(第四版)最新版+Python爬虫开发与项目实战+Python网络数据采集+精通Scrapy网络爬虫 本资料为最新整理高清带目录pdf,百度网盘下载~~~ 本资料为最新整理高清带目 ...

  9. Java高级开发0-1项目实战-青鸟商城-Day03

    作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...

  10. Android零基础开发到项目实战

    Android零基础开发到项目实战(目录) 前言:本教程适合零基础学习安卓开发的伙伴,下面是目录,本博主会每天定时更新每一章节的教程,未完..... 一.Java基础阶段 day01_Java语言概述 ...

最新文章

  1. OBS显示器捕获黑屏的解决方法
  2. LeetCode 744. 寻找比目标字母大的最小字母(二分查找)
  3. 将下载都是大写字母的网页里面的html转换为小写的简单方式
  4. 模糊搜索cell效果
  5. Activity调度机制
  6. Jenkins持续集成学习-搭建jenkins问题汇总
  7. 锐捷无线ap服务器怎么绑定mac,MacBook中的锐捷设置全攻略
  8. 海康威视球形摄像头激活,web二次开发
  9. 计算机与仪表通讯实例,MODBUS称重仪表与西门子PLC通讯实例
  10. 用python做题——PythonChallenge-1
  11. Android控件之TextView全解析
  12. k8s Dashboard 仪表盘
  13. 洛谷4455 [CQOI2018]社交网络 (有向图矩阵树定理)(学习笔记)
  14. 路由器密码忘记 五步暴力破解
  15. emui11是鸿蒙过渡,透过EMUI11看鸿蒙OS 将延续三大原则
  16. SQLite Qt 插件----sqlcipher
  17. CentOS 网口bond
  18. 1024短信盲盒 | 暖心短信陪你过节,还有更多好礼
  19. 基于 MINA 的 TLS/SSL NIO Socket 实现(二)
  20. Android实现简单的进度条功能

热门文章

  1. 刷了几千道算法题,这些我私藏的刷题网站都在这里了!
  2. 《Game说》| 揭秘百万DAU抖音现象级小游戏背后的故事
  3. java18天map和线程
  4. 文件夹正在使用,无法删除 无法重命名等操作怎么办?
  5. python 绝对值最小值的 正数_找出有序数组中绝对值最小的数
  6. android8.0系统 原生,羡慕原生安卓8.0?索尼XPZ系统占用11GB苦不堪言
  7. 林锐-《我的大学十年》
  8. HTTP之PUT请求
  9. hr面试性格测试30题_HR经典面试30题
  10. AGV-倍福beckhoff TWINCAT2及台达电机、传感器等使用总结