昊天SEO

如何自动发每日数据邮件

而这次要抓的信息里面,许多 数据项都是 JS 的,无法直接用 BeautifulSoup 直接抓取到,所以我们要使用更强大的库和工具来应对 JS。

首先介绍一下我们今天要用到的工具:

Python想必已经不用我介绍了,这里选用Python3是因为它对中文的支持更加强大;

PhantomJS可以理解成是一个模拟的浏览器,在你输入网址后跟真正的浏览器一样,执行页面上的JS语句生成我们看到的页面;

selenium用来读取PhantomJS解析出来的页面。

安装PhantomJS

PhantomJS的安装十分简单,去官网(http://phantomjs.org/)下载回来最新版的PhantomJS,然后随便找个地方解压缩就好了。

解压缩后如图:

phantomjs.exe

打开bin文件夹,我们会看到我们要用的phantomjs.exe文件,请记住这个文件的路径

PhantomJS

安装selenium

selenium是Python的一个库,所以它可以通过pip安装,只要在命令行输入:

pip install selenium

就可以完成安装啦!如下图:

第一步:简单的动态网页抓取

首先,我们要抓取报表中的各项数据,包括:云课堂销量、优酷播放量、腾讯播放量、知乎点赞量。

直接上代码(复制的时候注意不要复制上行号哦):

1 from selenium import webdriver
2 import time
3 driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
4 driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")
5 time.sleep(5)
6 data = driver.find_element_by_id('j-coursehead').text
7 a = data.find('\n')
8 b = data[a + 1:].find('\n')
9 num = data[a + 1:a + 1 + b]
10 driver.quit()
11 print('网易云课堂的销量为:',num)

下面我们来逐行讲解每行代码的意思:

第一行:

from selenium import webdriver

导入selenium库中的webdriver

第二行:

import time

导入Python的内建库——time。time主要实现与时间有关的功能。

第三行:

driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")

这行的格式是:

变量名 = webdriver.PhantomJS(executable_path="刚才说的phantomjs.exe的地址")

即我们指定调用PhantomJS来解析网页。

第四行:

driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")

这行的格式是:

第三行定义的变量名.get("目标网址")

显然,这行的功能是使用PhantomJS来解析我们指定的网址,这里网址使用网易云课堂上我们爬虫课的网址。

第五行:

time.sleep(5)

这行的格式是:

time.sleep(你希望推迟的秒数)

使用time函数推迟调用线程的运行,可以理解成使程序暂停若干秒。在这里我们使用它的目的是确保上一步网页加载完成

第六行:

data = driver.find_element_by_id('j-coursehead').text

这一行的格式是:

第三行定义的变量名.查找方法(‘查找的内容’).text

这一行用于在PhantomJS解析出来的网页上查找我们需要的内容,这里我选用的是find_element_by_class_name()的方法,即通过class的名称来查找元素,而提供的方法还有很多,常见的有:

find_element_by_id()通过ID来查找

find_element_by_css_selector()通过CSS选择器查找

find_element_by_xpath()通过xpath查找

find_element_by_link_text()通过连接文字查找

find_element_by_tag_name()通过tag的名称查找

有了查找方法,那我们如何获取想查找的内容呢?

用IE浏览器打开我们的目标网址,这里使用http://study.163.com/course/courseMain.htm?courseId=1002810012。

在我们想抓取的内容上(这里用课程销量)点鼠标右键,选“检查元素”,如图:

640

然后就会出现DOM资源管理器,并且自动定位到我们想抓取的内容所在位置上。
如图:

dom

 

可以看到,上图的两个箭头处,我们既可以通过第一个箭头位置的ID进行查找,也可以通过第二个箭头处的class名称查找。

第七行、第八行、第九行:

a = data.find('\n')
b = data[a + 1:].find('\n')
num = data[a + 1:a + 1 + b]

这三行用于整理我们抓取到的数据,使用的方法是字符串的分段,在之前的教程中我们已经讲过了。

第十行

driver.quit()

在程序结束后,退出,否则会在后台一直占用系统性能的。

第十一行

print('网易云课堂的销量为:',num)

程序运行一下,结果为:

(使用的IDE是Pycharm)

显然,我们成功的完成了动态内容的抓取。

刚才的演示是云课堂的销量,其他的数据爬取,比如:优酷播放量、腾讯播放量、知乎点赞量等等也是类似的,就不重复说明了。

第二步:发送邮件

每天晚上12点,把数据自动发邮件汇报,这个也交给程序来自动运行,就不用熬夜刷数据了。

代码如下:

from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)    
    return formataddr((Header(name, 'utf-8').encode(), addr))
    
from_addr = '寄信的邮箱地址'
password = '邮箱密码'
to_addr = '收信的邮箱'
smtp_server = '发信邮箱的stmp服务器地址'
msg = MIMEText(要发送的内容, 'plain', 'utf-8')
msg['From'] = _format_addr('发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('邮件标题', 'utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server, smtp端口, timeout=10)
server.set_debuglevel(0)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

这里应用到了 python 的内建库:email 和 smtplib,通过 email 构建邮件,通过 smtplib 发送邮件。

这段代码只要套用就好,不做详细解释。

重点说一下三个地方:

1、邮箱密码:比如QQ和163邮箱,这里输入的并不是你的邮箱密码,而是“授权码”,在邮箱设置中可以查询到。

2、发信邮箱的smtp服务器:搜索一下很容易找到,一般类似smtp.qq.com

3、smtp端口:通常为25,但QQ邮箱为465,请根据实际情况修改,也很容易搜索到。

第三步:完整代码

注意:最后发邮件部分的代码,需要根据你自己的信息来填写替换。

from selenium import webdriver
import time
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def neteasy_crawler():
    driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
    driver.get("http://study.163.com/course/courseMain.htm?courseId=1002810012")
    time.sleep(5)
    data = driver.find_element_by_id('j-coursehead').text
    a = data.find('\n')
    b = data[a + 1:].find('\n')
    num = data[a + 1:a + 1 + b]
    driver.quit()    
    return ('网易云课堂的销量为:'+str(num))
def tencent_crawler():
    driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
    driver.get("http://v.qq.com/vplus/8bfeadf782010957b865a967fcf9e3f7/videos")
    time.sleep(5)
    data = driver.find_elements_by_class_name('info_inner')
    data_num=[]    
    for i in data :
        j = int(i.text)
        data_num.append(j)
    num = sum(data_num)
    driver.quit()    
    return ('腾讯视频上的观看量为:'+str(num))
def youku_crawler():
    driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
    driver.get("http://i.youku.com/i/UMTQ0MjEyMTgw")
    time.sleep(5)
    data = driver.find_element_by_class_name('vnum').get_attribute('title')
    num = data
    driver.quit()    
    return ('优酷视频上的观看量为:'+str(num))
def zhihu_crawer():
    driver = webdriver.PhantomJS(executable_path="C:/phantomjs-2.1.1-windows/bin/phantomjs.exe")
    driver.get("https://www.zhihu.com/people/lin-qian-qian")
    time.sleep(5)
    data = driver.find_element_by_class_name('zm-profile-header-user-agree').text
    num = data[:-2]
    driver.quit()    
    return ('知乎上的点赞为:'+str(num))

report_data = neteasy_crawler()+'\n'+tencent_crawler()+'\n'+youku_crawler()+'\n'+zhihu_crawer()
    
def _format_addr(s):
    name, addr = parseaddr(s)    
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = '******@qq.com'
password = '******'
to_addr = '******@qq.com'
smtp_server = 'smtp.qq.com'
msg = MIMEText(report_data, 'plain', 'utf-8')
msg['From'] = _format_addr('员工 <%s>' % from_addr)
msg['To'] = _format_addr('老板 <%s>' % to_addr)
msg['Subject'] = Header('每日汇报', 'utf-8').encode()
server = smtplib.SMTP_SSL(smtp_server, 465, timeout=10)
server.set_debuglevel(0)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

第四步:自动运行

保存python文件为report.py

windows系统下:

进入命令提示符cmd
Win7及以下:使用at命令

net start schedule    这行命令用来启用Windows的计划任务
at  0:00 /every:Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday python report.py

(Win8、Win10使用 SCHTASKS   命令)

linux系统下:

修改时区:

sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

设置NTP服务器

sudo ntpdate cn.pool.ntp.org

显示时间,检查是否正确

date

每天 0:00,用Python执行/root/report.py文件。
编辑定时任务:

#crontab -e
0 0 * * * python /opt/aa.py

保存,退出
执行

/etc/init.d/cron restart

重启服务才能使用

到了这里,所有代码就都完成啦!开始享受程序为你工作的感觉吧~

本文地址官网    新乡网站建设,seo

本文网址:http://www.168seo.cn/python/1846.html
分享到:更多 ()
a