详解python定时简单爬取网页新闻存入数据库并发送邮件

下面我将详细讲解“详解python定时简单爬取网页新闻存入数据库并发送邮件”的完整攻略。

一、需求分析

本次需求分析,我们需要采集某个网站的新闻,并存储到数据库中,然后通过邮件发送给指定的邮箱,要求可以定时运行。

二、技术选型

  1. 采集:requests, Beautifulsoup4
  2. 存储:MySQLdb
  3. 发送邮箱:smtplib
  4. 定时运行:apscheduler

三、实现步骤

1. 采集

在采集数据之前,需要先确认采集的目标,并分析目标网站的页面结构,找到需要采集的数据。这里我们以新浪新闻为例。
首先导入我们需要的模块:

import requests
from bs4 import BeautifulSoup

发送请求获取页面代码:

url = "https://news.sina.com.cn/"
html = requests.get(url).text

使用BeautifulSoup解析获取到的页面代码:

soup = BeautifulSoup(html, 'html.parser')

通过分析页面,我们可以发现新闻的标题、链接、发布时间和正文内容分别在不同的标签中。使用BeautifulSoup的选择器,我们可以方便地找到这些标签。

以下是一个简单的示例,用于获取新闻的标题、链接和发布时间:

news_list = soup.select('#syncad_1 ul li a')
for news in news_list:
    title = news.get_text()
    link = news.get('href')
    pub_time = news.next_sibling.get_text()
    print(title, link, pub_time)

2. 存储

我们可以使用MySQL数据库,创建表来存储新闻的标题、链接、发布时间和正文内容等信息。这里我们使用Python的MySQLdb模块连接数据库,具体步骤如下:

首先导入数据库操作所需的模块:

import MySQLdb

# 连接数据库
db = MySQLdb.connect(host="localhost", user="root", passwd="password", db="test")
# 创建游标对象
cursor = db.cursor()

# 执行SQL,创建数据表
sql = """CREATE TABLE news (
         id INT PRIMARY KEY AUTO_INCREMENT,
         title  CHAR(200) NOT NULL,
         link CHAR(300),
         pub_time CHAR(50))"""
cursor.execute(sql)

# 插入新闻数据
sql = "INSERT INTO news(title, link, pub_time)  VALUES ('%s', '%s', '%s')"%('title', 'link', 'pub_time')
cursor.execute(sql)

# 提交到数据库执行
db.commit()

# 关闭数据库连接
db.close()

3. 发送邮箱

使用Python的smtplib模块,我们可以方便地发送邮件。

下面是一个简单的示例,用于发送包含新闻标题、链接和发布时间的邮件:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 发邮件的邮箱和密码
my_sender = 'xxx@qq.com'
my_pass = 'xxxxxx'

# 接收邮件的邮箱
my_receiver = 'xxxxx@163.com'

# 邮件内容
subject = '新闻推送'
content = '新闻标题:{},链接:{},发布时间:{}'.format(news_title, news_link, news_pubtime)

# 创建邮件
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(my_sender, 'utf-8')
message['To'] = Header(my_receiver, 'utf-8')
message['Subject'] = Header(subject, 'utf-8')

# 尝试发送邮件
try:
    smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
    smtpObj.login(my_sender, my_pass)
    smtpObj.sendmail(my_sender, my_receiver, message.as_string())
    smtpObj.quit()
    print("success")
except smtplib.SMTPException as e:
    print(e)
    print("error")

4. 定时运行

使用Python的apscheduler模块可以很方便地实现任务的定时执行。下面是一个示例,每10分钟运行一次爬虫并尝试发送邮件:

from apscheduler.schedulers.blocking import BlockingScheduler

def job():
    # 执行爬虫和邮件发送操作
    pass

# 创建调度器实例
sched = BlockingScheduler()
# 添加一个定时执行的任务
sched.add_job(job, 'interval', minutes=10)

# 启动调度器
sched.start()

四、示例说明

示例一:爬取某新闻网站并定时推送新闻到指定邮箱

代码示例:

import requests
from apscheduler.schedulers.blocking import BlockingScheduler
import MySQLdb
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from bs4 import BeautifulSoup

# 网站URL链接
URL = 'https://news.sina.com.cn/'

# MySQL数据库配置
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = 'passwd'
DB_DBNAME = 'test'

# 发送邮件配置
SENDER_EMAIL = 'xxx@qq.com'
SENDER_PASSWORD = 'xxxxxx'
RECEIVER_EMAIL = 'xxxxx@163.com'

def getNews():
    #发送请求获取页面代码
    html = requests.get(URL).text

    #使用BeautifulSoup解析获取到的页面代码
    soup = BeautifulSoup(html, 'html.parser')
    news_list = soup.select('#syncad_1 ul li a')
    for news in news_list:
        #从标签中获取新闻的标题、链接和发布时间
        title = news.get_text()
        link = news.get('href')
        pub_time = news.next_sibling.get_text()

        #将新闻数据插入到数据库中保存
        db = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWORD, db=DB_DBNAME)
        cursor = db.cursor()
        sql = "INSERT INTO news(title, link, pub_time)  VALUES ('%s', '%s', '%s')" % (title, link, pub_time)
        cursor.execute(sql)
        db.commit()
        db.close()

        #创建邮件,发送新闻到指定邮箱
        message = MIMEText('标题:{},链接:{},发布时间:{}'.format(title, link, pub_time), 'plain', 'utf-8')
        message['From'] = Header(SENDER_EMAIL, 'utf-8')
        message['To'] = Header(RECEIVER_EMAIL, 'utf-8')
        message['Subject'] = Header('每日新闻推送', 'utf-8')
        smtpObj = smtplib.SMTP_SSL('smtp.qq.com', 465)
        smtpObj.login(SENDER_EMAIL, SENDER_PASSWORD)
        smtpObj.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, message.as_string())
        smtpObj.quit()

if __name__ == '__main__':
    #使用apscheduler模块定时执行任务
    scheduler = BlockingScheduler()
    scheduler.add_job(getNews, 'interval', minutes=10)  #每10分钟执行一次任务
    scheduler.start()

示例二:爬取某网站数据存储到MongoDB,并定时清空数据

代码示例:

import requests
from apscheduler.schedulers.blocking import BlockingScheduler
from pymongo import MongoClient
from bs4 import BeautifulSoup

# 网站URL链接
URL = 'https://news.sina.com.cn/'

# MongoDB配置
MONGO_HOST = 'localhost'
MONGO_PORT = 27017
MONGO_DBNAME = 'test'
MONGO_COLLNAME = 'news'

def getNews():
    #发送请求获取页面代码
    html = requests.get(URL).text

    #使用BeautifulSoup解析获取到的页面代码
    soup = BeautifulSoup(html, 'html.parser')
    news_list = soup.select('#syncad_1 ul li a')
    for news in news_list:
        #从标签中获取新闻的标题、链接和发布时间
        title = news.get_text()
        link = news.get('href')
        pub_time = news.next_sibling.get_text()

        #将新闻数据插入到MongoDB中保存
        client = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
        db = client[MONGO_DBNAME]
        coll = db[MONGO_COLLNAME]
        coll.insert_one({'title':title, 'link':link, 'pub_time':pub_time})

def cleanData():
    #定时清空MongoDB中的数据
    client = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
    db = client[MONGO_DBNAME]
    coll = db[MONGO_COLLNAME]
    coll.remove()

if __name__ == '__main__':
    #使用apscheduler模块定时执行任务
    scheduler = BlockingScheduler()
    scheduler.add_job(getNews, 'interval', minutes=10)  #每10分钟执行一次任务
    scheduler.add_job(cleanData, 'interval', hours=24)  #每24小时执行一次任务
    scheduler.start()

以上就是参考文献《详解Python定时简单爬取网页新闻存入数据库并发送邮件》的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解python定时简单爬取网页新闻存入数据库并发送邮件 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • mysql 触发器语法与应用示例

    下面是一份关于“mysql 触发器语法与应用示例”的攻略: 什么是mysql触发器 MySQL触发器是一种特殊的存储过程,当特定的事件(如对一张表进行的 INSERT、UPDATE 和 DELETE 等操作)发生时,MySQL触发器会自动执行一个已经定义好的SQL语句集,因此它可以在数据库发生某些操作时进行响应并执行指定的操作。 触发器语法 其基本语法如下:…

    database 2023年5月22日
    00
  • springboot实现将自定义日志格式存储到mongodb中

    下面是关于“Spring Boot实现将自定义日志格式存储到MongoDB中”的完整攻略: 1. 准备工作 在开始操作之前,需要先安装相关软件和工具: JDK:Java开发环境,需要安装1.8及以上版本; MongoDB:一个NoSQL数据库,用于存储日志数据; Maven:Java项目管理工具,用于构建项目。 2. 创建Spring Boot项目 使用Sp…

    database 2023年5月22日
    00
  • linux下安装mysql及mysql.sock问题

    Linux下安装MySQL的完整攻略 步骤1: 下载MySQL 首先,从MySQL官网下载适合自己的MySQL版本,如5.7或8.0等。也可以使用包管理器(如yum)安装官方提供的MySQL版本。 步骤2: 安装MySQL 在安装MySQL之前,需要先安装系统的依赖库。在CentOS中,可以使用以下命令安装: sudo yum install -y wget…

    database 2023年5月22日
    00
  • 详解CentOS 6.5如何安装Realtek无线网卡驱动

    下面是详解CentOS 6.5如何安装Realtek无线网卡驱动的完整攻略。 环境准备 确认CentOS 6.5版本正确安装; 确认 Realtek 无线网卡型号。 下载驱动程序 在Realtek官网下载适合Linux系统的驱动程序。 将下载的驱动程序解压缩,得到文件夹,进入文件夹查看里面的内容。确保该目录中有 Makefile 文件。 安装编译环境 在终端…

    database 2023年5月22日
    00
  • 讲解MySQL中<=>操作符的用法

    MySQL中<=>操作符用法 简介 MySQL中的<=>操作符是一种特殊的比较操作符,它用于比较两个值是否相等,但是与普通的=操作符不同的是,<=>操作符可以处理空值。如果其中一个比较的值是NULL,那么<=>操作符会返回0,否则返回1或0。下面让我们来看看<=>操作符的具体用法。 示例一 我们可以…

    database 2023年5月22日
    00
  • 解决Mysql收缩事务日志和日志文件过大无法收缩问题

    针对“解决Mysql收缩事务日志和日志文件过大无法收缩问题”的问题,我可以提供以下攻略: 攻略一:通过清空事务日志文件解决 首先查看当前的事务日志文件(通常为mysql-bin.xxxxxx),可以通过show binary logs命令查看。 使用以下命令清空最新的事务日志文件: mysqlbinlog –read-from-remote-server …

    database 2023年5月22日
    00
  • MySQL使用聚合函数进行单表查询

    MySQL是一个关系型数据库管理系统,使用聚合函数进行单表查询可方便地对表中数据进行统计和计算,本文将详细讲解使用聚合函数进行单表查询的完整攻略。 一、概述 聚合函数是MySQL中的一种特殊函数,可以对表中的数据进行统计和计算,如求最大值、最小值、平均值、求和等操作。在聚合函数的使用过程中,需要注意以下几点: 聚合函数可以用于单列或多列的数据。 使用聚合函数…

    database 2023年5月22日
    00
  • redis数据库的数据导入到SQLServer数据库中

    1./. #!/usr/bin/python# -*-coding:utf-8-*- “””@author: yugengde@contact: yugengde@163.com@file : redis_sqlserver.py@time: 2017/11/11 16:50″””import redisimport pymssqlimport jsonfr…

    Redis 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部