Python爬蟲練習二-定時抓取網站的更新內容

前言:

通過第一階段的學習,接下來簡單的抓取一下網站更新的內容並且以郵件的方式提醒

代碼:

一、簡單抓取網站以郵件進行通知:
 

原理:

1、將需要使用的包導入

2、編寫郵件發送模板,

3、分析需要抓取的網站

4、藉助文件讀寫操作將對比抓取到的第一條與文件中存在的一條去比較

5、如果有則更新,則發送郵件

實現代碼:

郵件模板:

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

def email(csdn_article_title,csdn_article_url):

    sender = ' '#填寫發件人
    pwd = ' '#登錄密碼,是郵件第三方登錄的那個密碼
    receivers = [' ']#填寫收件人

    mainText="網站有內容更新,更新題目爲:"+csdn_article_title+"更新網址爲:"+csdn_article_url
    message = MIMEText(mainText,"plain",'utf-8')
    # 三個參數:第一個爲文本內容,第二個爲plain設置文本格式,第三個爲utf-8設置編碼
    message ['From'] = "XXX <[email protected]>"
    message ['To'] = "XXX <[email protected]>"

    subject = "CSDN網站有內容更新"
    #郵件主題
    message["Subject"] = subject

    try:
        # 使用非本地服務器,需要建立ssl連接
        smtpObj = smtplib.SMTP_SSL("smtp.qq.com",465)
        #發件箱郵件服務器
        smtpObj.login(sender,pwd)
        smtpObj.sendmail(sender,receivers,message.as_string())
        print("郵件發送成功")
    except smtplib.SMTPException as e:
        print("Error:無法發送郵件.Case:%s"%e)

郵件測試模板:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender = '@qq.com'  # 發件人郵箱賬號
my_pass = 'as'  # 發件人郵箱密碼
my_user = '[email protected]'  # 收件人郵箱賬號,我這邊發送給自己


def mail():
    ret = True
    try:
        msg = MIMEText('填寫郵件內容', 'plain', 'utf-8')
        msg['From'] = formataddr(["FromRunoob", my_sender])  # 括號裏的對應發件人郵箱暱稱、發件人郵箱賬號
        msg['To'] = formataddr(["FK", my_user])  # 括號裏的對應收件人郵箱暱稱、收件人郵箱賬號
        msg['Subject'] = "菜鳥教程發送郵件測試"  # 郵件的主題,也可以說是標題

        server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 發件人郵箱中的SMTP服務器,端口是25
        server.login(my_sender, my_pass)  # 括號中對應的是發件人郵箱賬號、郵箱密碼
        server.sendmail(my_sender, [my_user, ], msg.as_string())  # 括號中對應的是發件人郵箱賬號、收件人郵箱賬號、發送郵件
        server.quit()  # 關閉連接
    except Exception:  # 如果 try 中的語句沒有執行,則會執行下面的 ret=False
        ret = False
    return ret


ret = mail()
if ret:
    print("郵件發送成功")
else:
    print("郵件發送失敗")

抓取分析模板:

import requests
from lxml import etree
import time
import os
from sendEmail import email

while True:
    # 博主名字
    author_name = input("請輸入博主的名字: ")
    # 博主博文頁數
    page_num = int(input("請輸入博客頁數: "))
    url = "https://blog.csdn.net/"+author_name+"/article/list/"+str(page_num)  #目標跟蹤網頁
    content = requests.get(url).content
    html = etree.HTML(content)
    # 博客文章的標題


    # 博客文章的標題
    title = html.xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/text()") #取0爲空 暫時不清粗爲什麼
    csdn_article_url = html.xpath("//div[@class='article-item-box csdn-tracking-statistics']//h4//a/@href")[0]
    # 處理換行問題
    csdn_article_title = []
    for i in range(0, len(title)):
        csdn_article_title.append(title[i].strip())
    while "" in csdn_article_title:
        csdn_article_title.remove("")

    #獲取第一篇文章標題
    print("當前的標題爲:%s"%csdn_article_title[0]) #取第一個
    print("當前的鏈接爲:%s" %csdn_article_url)
    #屏幕打印獲取的第一篇文章標題

    #文件打印 轉換爲字符換類型
    csdn_article_title[0]=str(csdn_article_title[0])
    csdn_article_url=str(csdn_article_url)

    if not os.path.isfile("D:\\title_temp.txt"):
    #判斷title_temp.txt文件是否存在,不存在則創建,並寫入獲取的第一篇文章標題
        f = open("D:\\title_temp.txt", "w")
        f.write(csdn_article_title[0])
        f.write(csdn_article_url)
        print("將當前標題、url記錄在D:\title_temp.txt中,等待檢測")
        f.close()
    else:
    #title_temp.txt文件存在的話,提取裏面標題,和獲取的標題對比
        with open("D:\\title_temp.txt", "r+") as f:
            old_url = f.read()
            if old_url !=csdn_article_url:
            #如果讀取內容和獲取的網站第一篇文章標題不一致,則表明網站更新
                #email(csdn_article_title[0],csdn_article_url)#發送qq郵件
                f.seek(0)
                f.truncate()
                print("網站有更新,需通知")
                f.write(csdn_article_title[0])
                f.write(csdn_article_url)
                #寫入最新的標題內容,方便下一次比對
                break
                #退出循環
            else:
            #否則的話,表明網站沒有更新
                print("網站暫時沒有更新\n")
    time.sleep(5)
    #檢測網頁內容時間間隔,單位爲秒(s)

結果:

二、抓取存到EXCEL進行分析:
 

原理:

1、將需要使用的包導入

2、編寫EXCEL存儲模板,

3、分析需要抓取的網站

4、存入excel

Notes:

查了很多資料!!! 評論和閱讀自從改成圖片 類屬性都是read-num後 一直抓不到閱讀數和評論數

 

實現代碼:

import requests
import xlrd
import xlwt
from lxml import etree
from lxml import html
from xlutils.copy import copy


# 爬蟲實戰: 爬取CSDN博客的所有博客文章鏈接

# 第1頁: https://blog.csdn.net/cnds123321/article/list/1
# 第2頁: https://blog.csdn.net/cnds123321/article/list/2
# 第3頁: https://blog.csdn.net/cnds123321/article/list/3
# 故可以得出公式: url="https://blog.csdn.net/"+author_name+"/article/list/"+page_index
# author_name指的是博主的名字,page_index指的是頁碼當前是第幾頁

# path指的是excel文件的路徑;sheet_name指的是工作簿的名字;value指的是數據,是一個嵌套列表
def write_excel_xls(path, sheet_name, value):
    """創建excel文件,並初始化一定的數據"""
    index = len(value)  # 獲取需要寫入數據的行數
    workbook = xlwt.Workbook()  # 新建一個工作簿
    sheet = workbook.add_sheet(sheet_name)  # 在工作簿中新建一個表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            sheet.write(i, j, value[i][j])  # 像表格中寫入數據(對應的行和列)
    workbook.save(path)  # 保存工作簿


# path指的是excel文件的路徑;value指的是數據,是一個嵌套列表
def write_excel_xls_append(path, value):
    """向excel表中增加數據"""
    index = len(value)  # 獲取需要寫入數據的行數
    workbook = xlrd.open_workbook(path)  # 打開工作簿
    sheets = workbook.sheet_names()  # 獲取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 獲取工作簿中所有表格中的的第一個表格
    rows_old = worksheet.nrows  # 獲取表格中已存在的數據的行數
    new_workbook = copy(workbook)  # 將xlrd對象拷貝轉化爲xlwt對象
    new_worksheet = new_workbook.get_sheet(0)  # 獲取轉化後工作簿中的第一個表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            new_worksheet.write(i + rows_old, j, value[i][j])  # 追加寫入數據,注意是從i+rows_old行開始寫入
    new_workbook.save(path)  # 保存工作簿


# 請求頭

# 博主名字
author_name = input("請輸入博主的名字: ")
# 博主博文頁數
page_num = int(input("請輸入博客頁數: "))
# 寫入表頭數據
write_excel_xls("CSDN-" + author_name + ".xls", author_name, [["文章類型", "文章標題", "文章鏈接", "發表日期", "閱讀數", "評論數"], ])
# 循環每頁
for index in range(1, page_num + 1):
    # 拼接URL !!!不能有空格
    page_url = "https://blog.csdn.net/"+author_name+"/article/list/"+str(page_num)
    # 發送請求,獲取響應
    content = requests.get(page_url).content
    page_html = etree.HTML(content)
    # 博客文章的標題
    title_list = page_html.xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/text()")
    # 處理換行問題
    csdn_article_title_list = []
    for i in range(0, len(title_list)):
        csdn_article_title_list.append(title_list[i].strip())
    while "" in csdn_article_title_list:
        csdn_article_title_list.remove("")


    # 博客文章的類型
    csdn_article_type_list = page_html.xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/span")
    # 博客文章的鏈接
    csdn_article_link_list = page_html.xpath("//div[@class='article-item-box csdn-tracking-statistics']//h4//a/@href")
    # 博客文章的發表日期
    csdn_article_publishDate_list = page_html.xpath(
        "//div[@class='info-box d-flex align-content-center']/p/span[@class='date']")
    # 博客文章的閱讀數
    csdn_article_readerCount_list = page_html.xpath(
            "//div[@class='info-box d-flex align-content-center']/p/span[@class='read-num'][1]")
    # 博客文章的評論數
    csdn_article_commentCount_list = page_html.xpath(
            "//div[@class='info-box d-flex align-content-center']/p/span[@class='read-num'][2]")

    for i in range(0, len(csdn_article_title_list)):
        print(csdn_article_type_list[i].text, csdn_article_title_list[i],csdn_article_publishDate_list[i].text,
              csdn_article_readerCount_list[i].text)

    # 將數據保存到excel表格中
    for i in range(0, len(csdn_article_title_list)):
        data = [[csdn_article_type_list[i].text, csdn_article_title_list[i], csdn_article_link_list[i],
                 csdn_article_publishDate_list[i].text, csdn_article_readerCount_list[i].text,
                 csdn_article_commentCount_list[i].text], ]
        print("正在保存: " + csdn_article_title_list[i] + "......")
        write_excel_xls_append("CSDN-" + author_name + ".xls", data)
print("CSDN-" + author_name + ".xls保存成功!")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章