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‘: ‘3310‘,
    ‘username‘: ‘woider‘,
    ‘password‘: ‘3243‘,
    ‘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;

时间: 2024-10-13 16:04:14

Python 网络爬虫(新闻采集脚本)的相关文章

Python网络爬虫

http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么

Python]网络爬虫

Originated From: http://blog.csdn.net/pi9nc/article/details/9734437#comments [Python]网络爬虫(一):抓取网页的含义和URL基本构成 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些

Python网络爬虫实战视频教程

Python网络爬虫实战教程(全套完整版) 课程观看地址:http://www.xuetuwuyou.com/course/168课程出自学途无忧网:http://www.xuetuwuyou.com 课程目录:课时1:课程介绍课时2:Python初识课时3:Python语法基础 课时4:Python控制流与小实例 课时5:答疑环节 课时6:Python函数详解 课时7:Python模块实战 课时8:Python文件操作实战 课时9:Python异常处理实战 课时10:Python面向对象编程

python网络爬虫入门(一)——简单的博客爬虫

最近,为了微信公众号的图文,上网疯狂的收集和看了一些有深度的新闻和有趣的引人深思的文字评论,并选择了几篇极品发布出去.但感觉一篇一篇的看实在是麻烦死了.想找一个简单的解决办法,看能不能自动把网上的资料收集起来,然后自己用统一筛选.不巧,最近准备学习下网络爬虫相关知识,于是按照网上的教程自己学着试写了一个小小的爬虫,嘻嘻,是用来爬韩寒博客的. 先把完整的代码贴上来,如果朋友们需要试验下,请先安装python相关环境,然后在复制粘贴保存,再按F5运行. #导入urllib库,python访问网页必须

Python网络爬虫使用总结

网络爬虫使用总结:requests–bs4–re技术路线 简要的抓取使用本技术路线就能轻松应对.参见:Python网络爬虫学习笔记(定向) 网络爬虫使用总结:scrapy(5+2结构) 使用步骤: 第一步:创建工程: 第二步:编写Spider: 第二步:编写Item Pipeline: 第四步:优化配置策略: 工程路径: 网络爬虫使用总结:展望(PhantomJS) 如上所有的两条记录路线仅仅是对网页的处理,只能爬取单纯的html代码.就需要引出"PhantomJS",PhantomJ

python网络爬虫学习笔记

python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍: 2. 从简单语句中开始: 3. 传送数据给服务器 4. HTTP头-描述数据的数据 5. 异常 5.0.1. URLError 5.0.2. HTTPError 5.0.3. 处理异常 5.0.4. info和geturl 6. Opener和Handler 7. Basic Authentication 8. 代理 9. Timeout 设置 10. Cookie 11. Deb

Python网络爬虫之Scrapy框架(CrawlSpider)

目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). CrawlSpider使

Python网络爬虫四大选择器(正则表达式、BS4、Xpath、CSS)总结

对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.利用Python大法带大家分析一下这些神作,看看这些神作到底在讲些神马. 人生苦短,我用Python.利用Python网络爬虫爬取了豆瓣网,将网站上关于这三部动漫的评论全部抓取下来,之后通过Python的第三方库jieba分词进行词频统计和分析,最后通过matplotlib库和wordcloud库将关键词制作成词云进行可视化展示. 词云是神魔?"词

Python网络爬虫实战(一)快速入门

本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要的目的是爬取想要的数据还有通过爬虫去自动完成我们想在网站中做的一些事情. 从今天开始我会从基础开始讲解如何通过网络爬虫去完成你想要做的事. 先来看一段简单的代码. import requests #导入requests包 url = 'https://www.cnblogs.com/LexMoon/

爬虫学习 05.Python网络爬虫之三种数据解析方式

爬虫学习 05.Python网络爬虫之三种数据解析方式 引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据解析.因为大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据.因此,本次课程中会给大家详细介绍讲解三种聚焦爬虫中的数据解析方式.至此,我们的数据爬取的流程可以修改为: 指定url 基于r