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

yizhihongxing

下面我将详细讲解“详解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日

相关文章

  • Redis Zset类型跳跃表算法实现(JAVA)

      Redis 有序集合类型(zset) 底层核心实现的机制就是跳跃表   最近公司搞了技术分享的活动,正好快到我了,最近在研究Redis就说说redis实现的原理吧. 发现还是晚上脑子比较好使,建议看代码时候边看边画图 推荐画图工具 http://draw.io/ 首先定义一个双向链表的类       双向链表的流程图    跳跃表的结构图        …

    Redis 2023年4月12日
    00
  • spring boot jpa写原生sql报Cannot resolve table错误解决方法

    下面我来给你详细讲解“spring boot jpa写原生sql报Cannot resolve table错误解决方法”的完整攻略。 问题简介 在使用Spring Boot和JPA的过程中,如果我们在写原生SQL的时候,有时会遇到“Cannot resolve table”的错误。这种错误一般是由于数据库的表名和实体类名称不匹配导致的。解决这个问题其实很简单…

    database 2023年5月18日
    00
  • MySQL 的 20+ 条最佳实践

    MySQL 是目前应用范围最广的关系型数据库之一,因此对于 MySQL 的最佳实践有着非常重要的意义。以下是 MySQL 的 20+ 条最佳实践的详细攻略: 一、安全性 1. 避免使用root账户 MySQL创建时会默认生成root用户,但是为了安全起见,建议避免使用root账号登录MySQL,因为root拥有超级权限,如果被黑客攻破MySQL,将有可能造成…

    database 2023年5月19日
    00
  • 二元关系操作:JOIN和DIVISION

    二元关系操作包括交、并、差、笛卡尔积、选择、投影、连接和除法等操作。其中JOIN和DIVISION操作是非常重要的关系操作。下面将对这两个操作进行详细讲解,并且会提供一些实例来帮助理解。 JOIN操作 JOIN操作是关系代数中的一种操作,它用于合并两个或多个表中的行,根据两个表之间的某种关联关系来判断要合并哪些行。JOIN操作有很多种类型,常见的有内连接、外…

    database 2023年3月27日
    00
  • Java的redis 操作类-优化通用版本

    java操作redis多节点处理方式;http://blog.itpub.net/29254281/viewspace-1188644/首先maven引入依赖包<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifact…

    Redis 2023年4月13日
    00
  • mysql批量删除大量数据

    当需要删除 MySQL 数据库中大量数据时,手动逐个删除显然是不可行的。因此,需要使用批量删除语句进行操作,以提高效率。下面是 MySQL 批量删除大量数据的完整攻略。 1. 确定数据删除条件 在运行删除语句之前,需要明确要删除哪些数据。可以使用 SELECT 语句来筛选出符合条件的数据,例如: SELECT * FROM table_name WHERE …

    database 2023年5月22日
    00
  • 在Java的JDBC使用中设置事务回滚的保存点的方法

    为了在Java的JDBC使用中设置事务回滚的保存点,我们需要按照以下步骤进行操作: 1.创建连接对象 我们需要使用DriverManager来获取数据库连接,获取方式如下: String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC"; String user = &…

    database 2023年5月21日
    00
  • Sql在多张表中检索数据的方法详解

    下面我将详细讲解“Sql在多张表中检索数据的方法详解”的攻略。 一、使用Join语句连接多张表 首先最常用的方法就是使用Join语句连接多张表来获取所需数据。Join语句是通过建立两张或多张表之间的关系,将这些表的数据连接起来,然后进行检索。 在使用Join语句的时候,我们需要明确两个方面: 连接条件:确定多张表之间连接的字段。连接条件是Join语句的核心,…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部