下面我将详细讲解“详解python定时简单爬取网页新闻存入数据库并发送邮件”的完整攻略。
一、需求分析
本次需求分析,我们需要采集某个网站的新闻,并存储到数据库中,然后通过邮件发送给指定的邮箱,要求可以定时运行。
二、技术选型
- 采集:requests, Beautifulsoup4
- 存储:MySQLdb
- 发送邮箱:smtplib
- 定时运行: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技术站