Python 网络爬虫(新闻采集脚本)
=====================爬虫原理=====================
通过Python访问新闻首页,获取首页所有新闻链接,并存放至URL集合中。
逐一取出集合中的URL,并访问链接获取源码,解析出新的URL链接添加到集合中。
为防止重复访问,设置一个历史访问,用于对新添加的URL进行过滤。
解析DOM树,获取文章相关信息,并将信息存储到Article对象中。
将Article对象中的数据通过pymysql保存到数据库中。
每完成一次数据的存储,计数器增加并打印文章标题,否则打印错误信息。
如果集合中的URL全部读取完或数据数量达到设定值,程序结束。
=====================存储结构=====================
CREATE TABLE `news` (
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
`url` varchar(255) NOT NULL,
`title` varchar(45) NOT NULL,
`author` varchar(12) NOT NULL,
`date` varchar(12) NOT NULL,
`about` varchar(255) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url_UNIQUE` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
=====================脚本代码=====================
'''
百度百家新闻收集
''' import re # 网络连接模块
import bs4 # DOM解析模块
import pymysql # 数据库连接模块
import urllib.request # 网络访问模块 # 配置参数
maxcount = 1000 # 数据数量
home = 'http://baijia.baidu.com/' # 起始位置
# 数据库连接参数
db_config = {
'host': 'localhost',
'port': '',
'username': 'woider',
'password': '',
'database': 'python',
'charset': 'utf8'
} url_set = set() # url集合
url_old = set() # 过期url # 获取首页链接
html = urllib.request.urlopen(home).read().decode('utf8')
soup = bs4.BeautifulSoup(html, 'html.parser')
pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+'
links = soup.find_all('a', href=re.compile(pattern))
for link in links:
url_set.add(link['href']) # 文章类定义
class Article(object):
def __init__(self):
self.url = None
self.title = None
self.author = None
self.date = None
self.about = None
self.content = None # 连接数据库
connect = pymysql.Connect(
host=db_config['host'],
port=int(db_config['port']),
user=db_config['username'],
passwd=db_config['password'],
db=db_config['database'],
charset=db_config['charset']
)
cursor = connect.cursor() # 处理URL信息
count = 0
while len(url_set) != 0:
try:
# 获取链接
url = url_set.pop()
url_old.add(url) # 获取代码
html = urllib.request.urlopen(url).read().decode('utf8')
# DOM解析
soup = bs4.BeautifulSoup(html, 'html.parser')
pattern = 'http://\w+\.baijia\.baidu\.com/article/\w+' # 链接匹配规则
links = soup.find_all('a', href=re.compile(pattern)) # 获取URL
for link in links:
if link['href'] not in url_old:
url_set.add(link['href']) # 数据防重
sql = "SELECT id FROM news WHERE url = '%s' "
data = (url,)
cursor.execute(sql % data)
if cursor.rowcount != 0:
raise Exception('Data Repeat Exception: ' + url) # 获取信息
article = Article()
article.url = url # URL信息
page = soup.find('div', {'id': 'page'})
article.title = page.find('h1').get_text() # 标题信息
info = page.find('div', {'class': 'article-info'})
article.author = info.find('a', {'class': 'name'}).get_text() # 作者信息
article.date = info.find('span', {'class': 'time'}).get_text() # 日期信息
article.about = page.find('blockquote').get_text()
pnode = page.find('div', {'class': 'article-detail'}).find_all('p')
article.content = ''
for node in pnode: # 获取文章段落
article.content += node.get_text() + '\n' # 追加段落信息 # 存储数据
sql = "INSERT INTO news( url, title, author, date, about, content ) "
sql = sql + " VALUES ('%s', '%s', '%s', '%s', '%s', '%s') "
data = (article.url, article.title, article.author, article.date, article.about, article.content)
cursor.execute(sql % data)
connect.commit() except Exception as e:
print(e)
continue
else:
print(article.title)
count += 1
finally:
# 判断数据是否收集完成
if count == maxcount:
break # 关闭数据库连接
cursor.close()
connect.close()
=====================运行结果=====================
设置参数 maxcount = 10 , home = 'http://baijia.baidu.com/'
查询数据 SELECT title, author FROM python.news;
Python 网络爬虫(新闻采集脚本)的更多相关文章
- 利用Python网络爬虫采集天气网的实时信息—BeautifulSoup选择器
相信小伙伴们都知道今冬以来范围最广.持续时间最长.影响最重的一场低温雨雪冰冻天气过程正在进行中.预计,今天安徽.江苏.浙江.湖北.湖南等地有暴雪,局地大暴雪,新增积雪深度4-8厘米,局地可达10-20 ...
- 一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取
前几天小编给大家分享了数据可视化分析,在文尾提及了网易云音乐歌词爬取,今天小编给大家分享网易云音乐歌词爬取方法. 本文的总体思路如下: 找到正确的URL,获取源码: 利用bs4解析源码,获取歌曲名和歌 ...
- python网络爬虫学习笔记
python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...
- Python网络爬虫
http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...
- 《精通python网络爬虫》笔记
<精通python网络爬虫>韦玮 著 目录结构 第一章 什么是网络爬虫 第二章 爬虫技能概览 第三章 爬虫实现原理与实现技术 第四章 Urllib库与URLError异常处理 第五章 正则 ...
- Python 网络爬虫 001 (科普) 网络爬虫简介
Python 网络爬虫 001 (科普) 网络爬虫简介 1. 网络爬虫是干什么的 我举几个生活中的例子: 例子一: 我平时会将 学到的知识 和 积累的经验 写成博客发送到CSDN博客网站上,那么对于我 ...
- 《实战Python网络爬虫》- 感想
端午节假期过了,之前一直在做出行准备,后面旅游完又休息了一下,最近才恢复状态. 端午假期最后一天收到一个快递,回去打开,发现是微信抽奖中的一本书,黄永祥的<实战Python网络爬虫>. 去 ...
- Python网络爬虫与信息提取
1.Requests库入门 Requests安装 用管理员身份打开命令提示符: pip install requests 测试:打开IDLE: >>> import requests ...
- Python网络爬虫之Scrapy框架(CrawlSpider)
目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) ...
- Python网络爬虫实战(一)快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
随机推荐
- [LeetCode] Shortest Word Distance 最短单词距离
Given a list of words and two words word1 and word2, return the shortest distance between these two ...
- Ubuntu安装Hadoop与Spark
更新apt 用 hadoop 用户登录后,我们先更新一下 apt,后续我们使用 apt 安装软件,如果没更新可能有一些软件安装不了.按 ctrl+alt+t 打开终端窗口,执行如下命令: sudo a ...
- FtpUtil
/* * 文件名:FtpUtil.java * 版权:Copyright 2000-2007 Huawei Tech. Co. Ltd. All Rights Reserved. * 描述: TopE ...
- python基础-软件目录结构规范
一.定义目录结构目的 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定义好组织规则 ...
- 前端必备的js知识点(转载)
1.本文主体源自:http://www.cnblogs.com/coco1s/p/4029708.html,有兴趣的可以直接去那里看,也可以看看我整理加拓展的.2.js是一门什么样的语言及特点? ...
- 递推 hdu 2064
z[n] n个盘子从1到3次数 先想2个的时候 1->2 2->3 1->2 3->2 2->1 2->3 1->2 2->3 显然 要先把上面n- ...
- javascript-- test() 匹配正则 与 逻辑运算符 “!”
在使用正则表达式验证"时分秒"的时候遇到了一个问题,因为业务需求,需要提供两个input 给用户输入开始时间和结束时间. js 代码: var regtime=/^([0-1]?[ ...
- 【原】mysql5.6 split函数_字符串的分割
DROP FUNCTION IF EXISTS `getSplitName`$$ )) RETURNS text BEGIN /* 对逗号进行分离的字符串,分割出'登陆名_用户名/部门名'中的_后部门 ...
- BZOJ 4742: [Usaco2016 Dec]Team Building
4742: [Usaco2016 Dec]Team Building Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 21 Solved: 16[Su ...
- bzoj1078【SCOI2008】斜堆
题意: 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结点的左右儿子的大 ...