windows定时执行百度新闻爬虫
想要做个新闻文本识别分类的项目,就先写了个爬取百度新闻的爬虫。
环境:win7 32 bit python3.4 若干第三方库
可以实现的功能:定期按照百度新闻的分类抓取新闻的标题,所属类别及文本内容,并自动存入数据库(MySQL),同时发邮件到自己邮箱提醒。
缺陷:因新闻来源不同,网页编码不同,会出现少量的乱码现象;存入数据库未添加自动去重功能(自己手动去重其实也并不难,所以没去研究这个)
STEP1: creat_dbtable.py链接数据库创建表(也可直接通过操作MySQL)
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 6 23:31:33 2016 @author: Administrator
""" #数据库创建操作
import MySQLdb #打开数据库链接
db = MySQLdb.Connect(host="localhost",user="root",passwd='你的密码',db="test",use_unicode=True, charset="utf8") cursor = db.cursor() #如果数据已经存在,使用excute()方法删除表
cursor.execute("DROP TABLE IF EXISTS news") #创建数据表 SQL语句
sql = """CREATE TABLE news(
class VARCHAR(10) NOT NULL,
title VARCHAR(100),
text VARCHAR(15000)
)""" cursor.execute(sql) #关闭数据库连接
db.close()
在MySQL看到表已经生成:
step2:为了了解每次的抓取情况,写一个send_email.py来实现发送邮件的功能,这个文件在spider主文件里面来调用。
NOTE:这个往自己的邮箱发送邮件要在相应邮箱开启服务获取一个password才可以,这个网上教程也比较多,之后有空会补充。
#coding:utf-8
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))
def send_ms(T):
from_addr = "1021550072@qq.com"
password = 'your-password'
to_addr = '1021550072@qq.com'
smtp_server = 'smtp.qq.com'
msg = MIMEText(T, 'plain', 'utf-8')
msg['From'] = _format_addr('Anyone')
msg['To'] = _format_addr('Echo')
msg['Subject'] = Header('The New Report', '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() # send_ms(T)
step3:创建spider.py文件,实现具体功能。
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 6 21:24:27 2016 @author: Administrator
""" import re
import time
import requests
import numpy as np
import send_email
from bs4 import BeautifulSoup
from collections import Counter
import MySQLdb start = time.time()
#打开数据库链接 db = MySQLdb.Connect(host="localhost",user="root",passwd='password',db="test",use_unicode=True, charset="utf8") cursor = db.cursor() headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"} # 获取首页数据head_data
def get_head_data():
head_url = 'http://internet.baidu.com/'
data = requests.get(head_url,headers=headers)
data.encoding = 'gbk'
# print(data.status_code)
head_data = data.text
return head_data # 获取各新闻分类的title及href
def get_class(head_data):
title_href = {}
pa = re.compile(r'<a href="(http.*?.com/).*?>.*?(\w+)</a></li>')
ma = re.findall(pa,head_data)[1:-7]
ma = list(set(ma))[:-1]
# print(len(ma))
for i in range(len(ma)):
key = ma[i][1]
value = ma[i][0]
title_href[key] = value
# print(title_href)
return title_href # 对于每个分类提取标题信息class_data
def get_class_data(class_url): class_data = requests.get(class_url, headers=headers)
pa = re.compile(r'charset=(.*?)">')
charset = re.findall(pa,class_data.text)[0]
class_data.encoding = charset
# class_data.encoding = 'gbk'
class_data =class_data.text
soup = BeautifulSoup(class_data, 'lxml')
data = soup.findAll('a',{'target':'_blank'})
class_data = {}
for i in range(len(data)):
title = data[i].get_text()
href = data[i].get('href')
if len(title) > 10:
if not '下载' in title:
class_data[title] = href
return class_data # 获取每条新闻的具体文本内容,粗略抓取
def get_news_text(href):
try:
data = requests.get(href,headers=headers)
# data.encoding = 'gbk'
pa = re.compile(r'charset=(.*?)">')
charset = re.findall(pa,data.text)[0]
data.encoding = charset
data = BeautifulSoup(data.text,'lxml').get_text()
text = re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\ \^\"\-\+\_\\&\\n\\t\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "", data)
except:
# print('get New Text fail...')
text = None
pass
return text head_data = get_head_data()
title_href = get_class(head_data)
count = 0
for class_title,class_href in dict(title_href).items():
print(class_title)
# try:
class_data = get_class_data(class_href)
# except:
# print('get Class data fail...')
# pass
for news_title, news_url in class_data.items():
# print(news_title)
text = get_news_text(news_url)
sql = """INSERT INTO news\
SET class=%s, title=%s, text=%s"""
try:
cursor.execute(sql,(class_title,news_title,text))
db.commit()
count += 1
except:
# print('Save fail...')
pass db.close() end = time.time()
total_time = end - start T1 = '本次抓取耗时%s'%str(total_time)
T2 = ' & 本次共抓取%s条新闻'%str(count)
T = T1+T2
# print(t1,t2) send_email.send_ms(T)
数据库存储情况:
邮件详情:
REMARK:关于windows定时任务,请参考这篇教程。
这是我自己计划任务的设置和运行情况
windows定时执行百度新闻爬虫的更多相关文章
- windows定时执行python脚本
from:http://blog.csdn.net/Gpwner/article/details/77882131
- Windows自动执行应用程序或脚本(可以通过写bat文件定时关机等)
1. Windows每天定时执行某个应用程序 1.1 右键我的电脑选择管理,并选择任务计划程序,如下 演示 --- 1.2 创建基本任务 演示 1.3 Windows每天定时关机设置参数 演示 1. ...
- 基于HttpClient实现网络爬虫~以百度新闻为例
转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/40891791 基于HttpClient4.5实现网络爬虫请訪问这里:http:/ ...
- 使用ASP.NET实现Windows Service定时执行任务
转载http://blog.csdn.net/yanghua_kobe/article/details/6937816 我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows ...
- .net 开发定时执行的windows服务
环境:win7+vs2010+Oracle11g+office2010(64位操作系统) 需求:开发定时执行的windows服务从数据库中查询数据下载到指定地址Excel中 一.添加新建项目——win ...
- Windows定时计划执行Python
先看下定时执行的py文件 #coding:gbk from selenium import webdriver import time,os driver = webdriver.PhantomJS( ...
- C# 编写windows服务及服务的安装、启动、删除、定时执行任务
一.编写windows服务 1.VS2017 - 创建服务Myservice 2.创建好项目之后 --- >> 双击 Service1.cs ---- >> 出现一个设计 ...
- Windows Server 2008中使用计划任务定时执行BAT bat进行PHP脚本的执行
Windows Server 2008中使用计划任务定时执行BAT bat进行PHP脚本的执行 2016年01月03日 17:36:00 持之以恒 阅读数:5520 标签: windows定时任务.b ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- 页面缩放对css的影响
昨天发现一个上线的项目css样式明显不对,但是查看别人的电脑上的页面样式都是没问题的,于是找了半天原因,原来是我的浏览器对这个页面缩放了,导致样式问题. 发现了页面缩放会作用在同一个域名下的所有页面, ...
- 【UML】如何记忆UML类图的画法
前言 UML类图形象反映系统类之间的关系,大家非常常用.小弟不才,偶尔使用,往往每次使用都得查询各种关系的表示方式.终于,这次认真看了几遍,打算记起来. 注意 记忆方法只是本人联想,用于加强记忆.与该 ...
- Xcode代码提示联想功能失效,按command键点不进去类库,提示“?”
参考文档:这两篇文章很好的解决了问题.可以很好的解决了问题 Xcode代码提示联想功能失效,按command键点不进去类库,提示“?”,代码全是白色 Xcode4中代码补全(Code Completi ...
- GZFramwork数据库层《前言》DLL项目引用
新建项目: 1. 项目引入GZFramwork.dll NuGet地址:Install-Package GZFramwork 每个项目都引用 2.BLL层 设置数据库连接维护类:继承于:GZFramw ...
- Consul Template的简单使用
Consul Template的使用 1安装 地址 https://github.com/hashicorp/consul-template/releases wget https://release ...
- iOS- iPhone App 如何运营?
在质量过硬的情况下,如何运营才能使APP冲上app store的推荐?如何获得公众认可?获得下载量? 睡前简单分享一下最近从书中.互联网中浏览到的一些信息,和自己的一点理解. 首先这个问题很大.就抛砖 ...
- 《BI项目笔记》多维数据集中度量值设计时的聚合函数
Microsoft SQL Server Analysis Services 提供了几种函数,用来针对包含在度量值组中的维度聚合度量值.默认情况下,度量值按每个维度进行求和.但是,通过 Aggrega ...
- 原生Ajax讲解
典型的http通信:浏览器向服务器发出请求,服务器向客户端返回响应,浏览器重新加载页面,这种不连续的页面加载方式导致用户的体验变得杂乱,缺乏连贯性. 如: 在一般的web应用程序中,用户填写表单字段然 ...
- CSS小三角制作
以下是参考资料: 好多种图形的:http://www.jb51.net/css/41448.html -------------------------------------15.11.12---- ...
- NPM 使用介绍
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...