最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python定時簡單爬取網頁新聞存入數據庫并發(fā)送郵件

 更新時間:2020年11月27日 10:47:04   作者:Andyren0126  
這篇文章主要介紹了python定時簡單爬取網頁新聞存入數據庫并發(fā)送郵件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本人小白一枚,簡單記錄下學校作業(yè)項目,代碼十分簡單,主要是對各個庫的理解,希望能給別的初學者一點啟發(fā)。

一、項目要求

1、程序可以從北京工業(yè)大學首頁上爬取新聞內容:http://www.bjut.edu.cn

在這里插入圖片描述

2、程序可以將爬取下來的數據寫入本地MySQL數據庫中。

3、程序可以將爬取下來的數據發(fā)送到郵箱。

4、程序可以定時執(zhí)行。

二、項目分析

1、爬蟲部分利用requests庫爬取html文本,再利用bs4中的BeaultifulSoup庫來解析html文本,提取需要的內容。

2、使用pymysql庫連接MySQL數據庫,實現建表和插入內容操作。

3、使用smtplib庫建立郵箱連接,再使用email庫將文本信息加工成郵件消息并發(fā)送。

4、使用schedule庫實現定時執(zhí)行該程序。

三、代碼分析

1、導入需要的庫:

# 爬蟲相關模塊
import requests
from bs4 import BeautifulSoup
import pymysql

# 發(fā)郵件相關模塊
import smtplib
from email.mime.text import MIMEText   
from email.header import Header 
import time

# 定時模塊
import schedule

2、獲取html文件:

# 連接獲取html文本
def getHTMLtext(url):
  try:
    headers={
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
      } # 瀏覽器請求頭
    r = requests.get(url, headers = headers, timeout = 30) # 獲取連接
    r.raise_for_status() # 測試連接是否成功,若失敗則報異常
    r.encoding = r.apparent_encoding # 解析編碼
    return r.text
  except:
    return ""

其中必須添加請求頭headers否則get請求時會返回錯誤頁面。
raise_for_status()可以根據狀態(tài)碼判斷連接對象的狀態(tài),如果成功便繼續(xù)執(zhí)行,若連接失敗則拋出異常,因此利用try-except捕獲。
apparent_encoding()方法可以解析判斷可能的編碼方式。

3、解析html提取數據:

首先觀察網頁源碼確定新聞標簽位置:

在這里插入圖片描述

# 解析html提取數據
def parseHTML(news, html):
  soup = BeautifulSoup(html, "html.parser") # 獲取soup
  for i in soup.find(attrs = {'class' : 'list'}).find_all('li'): # 存放新聞的li標簽
    date = i.p.string + '-' + i.h2.string # 日期
    href = i.a['href'] # 鏈接
    title = i.find('h1').string # 標題
    content = i.find_all('p')[1].string # 梗概
    news.append([date, href, title, content]) # 添加到列表中

可見所有新聞內容全部存放在class為”list”的div標簽中,而每條新聞又存放在li標簽中,因此利用find和find_all方法遍歷所有l(wèi)i標簽。

每個li標簽中a標簽的href屬性存放新聞鏈接,h1標簽存放新聞標題,h2標簽存放日期,第一個p標簽存放年、月,第二個p標簽存放新聞梗概。依次取出對應標簽中的文本內容,并將年月日拼接后依次存入news列表中。

4、存入數據庫

# 存入數據庫
def toMysql(news):
  conn = pymysql.connect(host = 'localhost', port = 3306, user = 'root', passwd = '數據庫密碼', db = '數據庫名稱',charset = 'gbk', connect_timeout = 1000)
  cursor = conn.cursor()
  
  sql = '''
  create table if not exists tb_news(
    日期 date, 
    鏈接 varchar(400),
    標題 varchar(400),
    梗概 varchar(400))
  '''
  
  cursor.execute(sql) # 建表
  
  for new in news: # 循環(huán)存入數據
    sql = 'insert into tb_news(日期, 鏈接, 標題, 梗概) values(%s, %s, %s, %s)'
    date = new[0]
    href = new[1]
    title = new[2]
    content = new[3]
    cursor.execute(sql, (date, href, title, content))
    
  conn.commit()
  conn.close()

由于新聞字數較多,存取時可能會有亂碼以及數據過長存儲失敗的問題,與數據庫編碼有關,可以在MySQL的my.ini配置文件中修改默認編碼為gbk。

5、發(fā)送郵件

# 發(fā)送郵件
def sendMail(news):
  from_addr = '發(fā)送郵箱' # 發(fā)送郵箱
  password = '16位授權碼' # 郵箱授權碼
  
  to_addr = '接收郵箱' # 接收郵箱
  
  mailhost = 'smtp.qq.com' # qq郵箱的smtp地址
  qqmail = smtplib.SMTP() # 建立SMTP對象
  qqmail.connect(mailhost, 25) # 25為SMTP常用端口
  qqmail.login(from_addr, password) # 登錄郵箱
  
  content = ''
  for new in news: # 拼接郵件內容字符串
    content += '新聞時間:' + new[0] + '\n' + '新聞鏈接:' + new[1] + '\n' + '新聞標題:' + new[2] + '\n' + '新聞梗概:' + new[3] + '\n'
    content += '======================================================================\n'
    
  # 拼接題目字符串
  subject = time.strftime('%Y-%m-%d %X', time.localtime(time.time())) + '時爬取的北工大首頁主要新聞\n'
  
  # 加工郵件message格式
  msg = MIMEText(content, 'plain', 'utf-8')
  msg['subject'] = Header(subject, 'utf-8')
  
  try:
    qqmail.sendmail(from_addr, to_addr, msg.as_string())
    print('發(fā)送成功')
  except:
    print('發(fā)送失敗')
  qqmail.quit()

注意其中的密碼不是指郵箱的登錄密碼,而是指郵箱的smtp授權碼,qq郵箱可以再設置中開啟smtp服務,并獲取授權碼。

在這里插入圖片描述

6、主函數

# 主函數
def main():
  news = []
  url = "http://www.bjut.edu.cn/"
  html = getHTMLtext(url)
	parseHTML(news, html)
	toMysql(news)
  print(news)
	sendMail(news)

輸入北京工業(yè)大學官網的url并新建一個列表news用來存放消息,然后依次調用函數爬取新聞存入數據庫并發(fā)到郵箱。為了檢驗上述程序是否可以完成任務,先調用依次main()函數并print(news)看看結果:

main() #測試需要,之后會刪除

結果如下:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

由此可見程序執(zhí)行正常。

7、定時執(zhí)行

# 定時執(zhí)行整個任務
schedule.every().monday.at("08:00").do(main) # 每周一早上八點執(zhí)行main函數
while True:
  schedule.run_pending()
  time.sleep(1)

用死循環(huán)保證schedule一直運行。設定的是每周一早上8:00執(zhí)行程序。

為了方便檢查效果,先將運行時間改為每5s運行一次:

schedule.every(5).seconds.do(main)

在這里插入圖片描述

每5s便可以收到一封郵件,由此可見滿足定時需求。至此程序結束。

四、完整代碼

# 爬蟲相關模塊
import requests
from bs4 import BeautifulSoup
import pymysql

# 發(fā)郵件相關模塊
import smtplib
from email.mime.text import MIMEText   
from email.header import Header 
import time

# 定時模塊
import schedule

# 連接獲取html文本
def getHTMLtext(url):
  try:
    headers={
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
    } # 瀏覽器請求頭
    r = requests.get(url, headers = headers, timeout = 30) # 獲取連接
    r.raise_for_status() # 測試連接是否成功,若失敗則報異常
    r.encoding = r.apparent_encoding # 解析編碼
    return r.text
  except:
    return ""


# 解析html提取數據
def parseHTML(news, html):
  soup = BeautifulSoup(html, "html.parser") # 獲取soup
  for i in soup.find(attrs = {'class' : 'list'}).find_all('li'): # 存放新聞的li標簽
    date = i.p.string + '-' + i.h2.string # 日期
    href = i.a['href'] # 鏈接
    title = i.find('h1').string # 標題
    content = i.find_all('p')[1].string # 梗概
    news.append([date, href, title, content]) # 添加到列表中

# 存入數據庫
def toMysql(news):
  conn = pymysql.connect(host = 'localhost', port = 3306, user = 'root', passwd = '數據庫密碼', db = '數據庫名稱',charset = 'gbk', connect_timeout = 1000)
  cursor = conn.cursor()
  
  sql = '''
  create table if not exists tb_news(
    日期 date, 
    鏈接 varchar(400),
    標題 varchar(400),
    梗概 varchar(400))
  '''
  
  cursor.execute(sql) # 建表
  
  for new in news: # 循環(huán)存入數據
    sql = 'insert into tb_news(日期, 鏈接, 標題, 梗概) values(%s, %s, %s, %s)'
    date = new[0]
    href = new[1]
    title = new[2]
    content = new[3]
    cursor.execute(sql, (date, href, title, content))
    
  conn.commit()
  conn.close()

# 發(fā)送郵件
def sendMail(news):
  from_addr = '發(fā)送郵箱' # 發(fā)送郵箱
  password = '16位授權碼' # 郵箱授權碼
  
  to_addr = '接收郵箱' # 接收郵箱
  
  mailhost = 'smtp.qq.com' # qq郵箱的smtp地址
  qqmail = smtplib.SMTP() # 建立SMTP對象
  qqmail.connect(mailhost, 25) # 25為SMTP常用端口
  qqmail.login(from_addr, password) # 登錄郵箱
  
  content = ''
  for new in news: # 拼接郵件內容字符串
    content += '新聞時間:' + new[0] + '\n' + '新聞鏈接:' + new[1] + '\n' + '新聞標題:' + new[2] + '\n' + '新聞梗概:' + new[3] + '\n'
    content += '======================================================================\n'
    
  # 拼接題目字符串
  subject = time.strftime('%Y-%m-%d %X', time.localtime(time.time())) + '時爬取的北工大首頁主要新聞\n'
  
  # 加工郵件message格式
  msg = MIMEText(content, 'plain', 'utf-8')
  msg['subject'] = Header(subject, 'utf-8')
  
  try:
    qqmail.sendmail(from_addr, to_addr, msg.as_string())
    print('發(fā)送成功')
  except:
    print('發(fā)送失敗')
  qqmail.quit()



# 主函數
def main():
  news = []
  url = "http://www.bjut.edu.cn/"
  html = getHTMLtext(url)
  parseHTML(news, html)
  print(news)
  sendMail(news)
  
# 定時執(zhí)行整個任務
schedule.every().monday.at("08:00").do(main) # 每周一早上八點執(zhí)行main函數
while True:
  schedule.run_pending()
  time.sleep(1)

到此這篇關于詳解python定時簡單爬取網頁新聞存入數據庫并發(fā)送郵件的文章就介紹到這了,更多相關python定時爬取網頁內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 用 Python 連接 MySQL 的幾種方式詳解

    用 Python 連接 MySQL 的幾種方式詳解

    這篇文章主要介紹了用 Python 連接 MySQL 的幾種方式,大家可以根據實際情況選擇合理的連接方式,需要的朋友可以參考下
    2018-04-04
  • Python實現矩陣轉置的方法分析

    Python實現矩陣轉置的方法分析

    這篇文章主要介紹了Python實現矩陣轉置的方法,結合實例形式較為詳細的分析了Python實現矩陣轉置的相關操作技巧,需要的朋友可以參考下
    2017-11-11
  • pygame中blit()參數的使用及臟矩形動畫形成的說明

    pygame中blit()參數的使用及臟矩形動畫形成的說明

    這篇文章主要介紹了pygame中blit()參數的使用及臟矩形動畫形成的說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • tensorflow 1.0用CNN進行圖像分類

    tensorflow 1.0用CNN進行圖像分類

    這篇文章主要為大家詳細介紹了tensorflow 1.0用CNN進行圖像分類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python3.5面向對象與繼承圖文實例詳解

    Python3.5面向對象與繼承圖文實例詳解

    這篇文章主要介紹了Python3.5面向對象與繼承,結合圖文與實例形式詳細分析了Python3.5面向對象與繼承的相關概念、原理、實現方法及操作注意事項,需要的朋友可以參考下
    2019-04-04
  • python實現圖片,視頻人臉識別(dlib版)

    python實現圖片,視頻人臉識別(dlib版)

    這篇文章主要介紹了python實現圖像,視頻人臉識別(dlib版)的相關資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-11-11
  • 詳解python-docx處理Word必備工具

    詳解python-docx處理Word必備工具

    這篇文章主要介紹了python-docx處理Word必備工具,我主要講講自己用到的幾個內容是怎么設置的,對python-docx處理Word的相關知識感興趣的朋友一起看看吧
    2021-10-10
  • Flask搭建一個API服務器的步驟

    Flask搭建一個API服務器的步驟

    Flask真是一個強大且簡介的web框架,能夠快速搭建web服務器,本文主要介紹了Flask搭建一個API服務器的步驟,分享給大家,感興趣的可以了解一下
    2021-05-05
  • Python timer定時器兩種常用方法解析

    Python timer定時器兩種常用方法解析

    這篇文章主要介紹了Python timer定時器兩種常用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • python二維碼操作:對QRCode和MyQR入門詳解

    python二維碼操作:對QRCode和MyQR入門詳解

    今天小編就為大家分享一篇python二維碼操作:對QRCode和MyQR入門詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論

双牌县| 即墨市| 普兰店市| 上思县| 杂多县| 富裕县| 泰兴市| 玉门市| 江孜县| 晋州市| 平塘县| 葫芦岛市| 从化市| 九江市| 富宁县| 丰县| 宜城市| 板桥市| 容城县| 永丰县| 临高县| 皋兰县| 方山县| 太和县| 措美县| 张家口市| 新建县| 盐源县| 壤塘县| 揭西县| 淮滨县| 永济市| 渭南市| 和硕县| 信宜市| 乐东| 巩留县| 茂名市| 象山县| 手机| 宣恩县|