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] Coin Change 硬币找零
You are given coins of different denominations and a total amount of money amount. Write a function ...
- ElasticSearch第二步-CRUD之Sense
ElasticSearch系列学习 ElasticSearch第一步-环境配置 ElasticSearch第二步-CRUD之Sense ElasticSearch第三步-中文分词 ElasticSea ...
- HTTPf服务器(3)
功能完整的HTTP服务器 导语 这个一个功能完备的HTTP服务器.它可以提供一个完整的文档输,包括图像,applet,HTML文件,文本文件.它与SingleFileHttpServer非常相似,只不 ...
- PRINCE2特征(三)
提到不确定性,可能很多从事项目管理相关工作的人都会感同身受,一系列临时性问题,比如:变更.延期.调整.计划赶不上变化.团队调整等的出现,都是项目中再正常不过的内容.但正常不等于合理,我们还是要去思考一 ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- .net 项目生成时自动更新版本号
https://www.codeproject.com/articles/31236/how-to-update-assembly-version-number-automaticall Exampl ...
- project.pbxproj 的merge问题
基于xcode8.0 1.project.pbxproj 的结构 内部文件{archiveVersion=1 ; classes={};objectVersion=46;objects={};root ...
- web前端基础知识-(六)web框架
一.web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:ut ...
- Web Service和WCF的区别。其实二者不属于一个范畴!!!
Web Service和WCF的区别 [1]Web Service:严格来说是行业标准,也就是Web Service 规范. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XML扩展 ...
- jquery1.7.2的源码分析(四)$.Deferred(2)
jQuery.Callbacks = function( flags ) { // Convert flags from String-formatted to Object-formatted // ...