欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python—爬取并分析数据绘图发送到邮箱

程序员文章站 2022-04-09 12:50:56
...

实验目的:将51Job网上python不同职位的数量爬取出来,然后绘制成柱状图,发送到QQ邮箱

绘图技术介绍

python爬取数据的时候,需要对一些数据进行分析整合,使数据可视化。绘图过程中,需要导入matplotlib模块,matplotlib是一个Python 2维绘图库,已经成为python中公认的数据可视化工具,通过matplotlib我们可以很轻松地画一些或简单或复杂地图形,几行代码即可生成线图、直方图、功率谱、条形图、错误图、散点图等等。

绘图实例

如何绘制柱状图呢?
绘图的时候需要配置字体(matplotlib.rcParams[“font.sans-serif”]=[“simhei”] ,matplotlib.rcParams[“font.family”]=“sans-serif”)

import matplotlib   #绘图
import matplotlib.pyplot as plt  #数据可视化
matplotlib.rcParams["font.sans-serif"]=["simhei"]   #配置字体
matplotlib.rcParams["font.family"]="sans-serif"

plt.bar([1],[123],label=u"广东",color="y")    #柱状图
plt.bar([2],[113],label=u"江苏",color="r")
plt.bar([3],[133],label=u"北京",color="g")
plt.legend()    #绘制
plt.show()

Python—爬取并分析数据绘图发送到邮箱

selenium爬取51Job网上的数据

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait   #显示等待
from selenium.webdriver.support import expected_conditions as EC #条件
from selenium.webdriver.common.by import By
import time
from lxml import html
etree=html.etree
import re
class Spider():
    def __init__(self):
        self.login_url='https://login.51job.com/login.php'
        self.my_url='https://i.51job.com/userset/my_51job.php'
        self.job_url='https://www.51job.com/'
    def _wait_page(self):
        self.region=input('请输入地区:')
    def _login_page(self):
        driver.get(self.login_url)
        WebDriverWait(driver,1000).until(
            EC.url_to_be(self.my_url)
        )
        print('登录成功!')
    def position_page(self):
        driver.find_element_by_xpath('//*[@id="topIndex"]/div/p/a[1]').click()
        WebDriverWait(driver,1000).until(
            EC.url_to_be(self.job_url)
        )
        driver.find_element_by_xpath('//*[@id="kwdselectid"]').send_keys('python')
        WebDriverWait(driver,1000).until(
            EC.text_to_be_present_in_element_value((By.XPATH,'//p[@id="work_position_click"]/input'),self.region)
        )
        driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/button').click()
        time.sleep(0.5)
    def detail_position(self):
        for i in range(0,len(position_list)):
            WebDriverWait(driver, 1000).until(
                EC.text_to_be_present_in_element_value((By.XPATH, '//div[@id="funtype_click"]/input'),position_list[i])
            )
            driver.find_element_by_xpath('/html/body/div[2]/form/div/div[1]/button').click()
            response=driver.page_source
            res=etree.HTML(response)
            response_count=''.join(res.xpath('//div[@class="dw_tlc"]/div[4]/text()')).strip()
            position_count=''.join(re.findall('共(.*?)条职位',response_count))

            print(position_list[i]+''+position_count)
           



图片如何发送到邮箱

1.python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
2.Python创建 SMTP 对象
3.port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可
4.msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。
5.发送图片需要添加(message_image.add_header(‘content-disposition’, ‘attachment’, filename=‘mytest.png’),文本类型为base64,不然邮箱中没有图片

import smtplib
from email.mime.text import MIMEText
from email.header import Header  #发邮箱
global mailbox,password,receiver         #设置为全局变量
mailbox = input('请输入你的邮箱:')
password = input('请输入你的密码:')
receiver = input('请输入收件人的邮箱:')
mailhost = 'smtp.qq.com'  # 发信服务器
qqmail = smtplib.SMTP()  # 开启发信服务,这里使用的是加密传输
qqmail.connect(mailhost, 25)  # 25是端口号
qqmail.login(mailbox, password)  # 登录发信邮箱
content = open('1.jpg', 'rb').read()  # 设定发送文本
message_image = MIMEText(content, 'base64', 'utf-8')  # 传入文本,文本类型(plain)、文本编码
message_image.add_header('content-disposition', 'attachment', filename='mytest.png')
subject = 'python职位数据分析'  # 设定邮件标题
message_image['subject'] = Header(subject, 'utf-8')  # 设定邮件头信息
# 使用异常捕捉机制
try:
    qqmail.sendmail(mailbox, receiver, message_image.as_string())  # 开始发送邮件
    print('邮件发送成功')
except:
    print('邮件发送失败')
qqmail.quit()  # 关闭服务器

项目代码汇总

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait   #显示等待
from selenium.webdriver.support import expected_conditions as EC #条件
from selenium.webdriver.common.by import By
import time
from lxml import html
etree=html.etree
import re
import smtplib
from email.mime.text import MIMEText
from email.header import Header  #发邮箱
import matplotlib   #绘图
import matplotlib.pyplot as plt  #数据可视化
matplotlib.rcParams["font.sans-serif"]=["simhei"]   #配置字体
matplotlib.rcParams["font.family"]="sans-serif"
global mailbox,password,receiver         #设置为全局变量
driver=webdriver.Chrome(executable_path="F:\\Download\\chromedriver.exe")
position_list=['后端开发','移动开发','前端开发','人工智能','游戏','数据','测试','运维/技术支持','设计','运营']
class Spider():
    def __init__(self):
        self.login_url='https://login.51job.com/login.php'
        self.my_url='https://i.51job.com/userset/my_51job.php'
        self.job_url='https://www.51job.com/'
    def _wait_page(self):
        self.region=input('请输入地区:')
    def _login_page(self):
        driver.get(self.login_url)
        WebDriverWait(driver,1000).until(
            EC.url_to_be(self.my_url)
        )
        print('登录成功!')
    def position_page(self):
        driver.find_element_by_xpath('//*[@id="topIndex"]/div/p/a[1]').click()
        WebDriverWait(driver,1000).until(
            EC.url_to_be(self.job_url)
        )
        driver.find_element_by_xpath('//*[@id="kwdselectid"]').send_keys('python')
        WebDriverWait(driver,1000).until(
            EC.text_to_be_present_in_element_value((By.XPATH,'//p[@id="work_position_click"]/input'),self.region)
        )
        driver.find_element_by_xpath('/html/body/div[3]/div/div[1]/div/button').click()
        time.sleep(0.5)
    def detail_position(self):
        for i in range(0,len(position_list)):
            WebDriverWait(driver, 1000).until(
                EC.text_to_be_present_in_element_value((By.XPATH, '//div[@id="funtype_click"]/input'),position_list[i])
            )
            driver.find_element_by_xpath('/html/body/div[2]/form/div/div[1]/button').click()
            response=driver.page_source
            res=etree.HTML(response)
            response_count=''.join(res.xpath('//div[@class="dw_tlc"]/div[4]/text()')).strip()
            position_count=''.join(re.findall('共(.*?)条职位',response_count))
            digital=eval(position_count)
            print(position_list[i]+''+position_count)
            a=i+1
            plt.bar([a], [digital], label=position_list[i])
        matplotlib.use("Agg")
        plt.legend()  # 绘制
        plt.savefig("1.jpg")   #保存图片
    def send_email(self):
        mailbox = input('请输入你的邮箱:')
        password = input('请输入你的密码:')
        receiver = input('请输入收件人的邮箱:')
        mailhost = 'smtp.qq.com'  # 发信服务器
        qqmail = smtplib.SMTP()  # 开启发信服务,这里使用的是加密传输
        qqmail.connect(mailhost, 25)  # 25是端口号
        qqmail.login(mailbox, password)  # 登录发信邮箱
        content = open('1.jpg', 'rb').read()  # 设定发送文本
        message_image = MIMEText(content, 'base64', 'utf-8')  # 传入文本,文本类型(plain)、文本编码
        message_image.add_header('content-disposition', 'attachment', filename='mytest.png')
        subject = 'python职位数据分析'  # 设定邮件标题
        message_image['subject'] = Header(subject, 'utf-8')  # 设定邮件头信息
        # 使用异常捕捉机制
        try:
            qqmail.sendmail(mailbox, receiver, message_image.as_string())  # 开始发送邮件
            print('邮件发送成功')
        except:
            print('邮件发送失败')
        qqmail.quit()  # 关闭服务器
    def run(self):
        self._wait_page()
        self._login_page()
        self.position_page()
        self.detail_position()
        self.send_email()
if __name__ == '__main__':
    spider=Spider()
    spider.run()

实验结果

Python—爬取并分析数据绘图发送到邮箱
Python—爬取并分析数据绘图发送到邮箱

相关标签: python爬虫