Python爬虫实战 | (4) 爬取新浪新闻指定页面

在本篇博客中,我们将使用urllib+正则表达式爬取指定页面的新闻内容,使用正则表达式解析网页,获取新闻的题目、日期、来源、正文内容。

首先,搭建起主体程序,爬虫四部曲:

import urllib.request
import re
from requests import RequestException

def get_page(url):
    pass

def get_parser(html):
    pass

def write_tofile(title, date,source,article):
    pass

if __name__=='__main__':
    #指定页面新浪新闻的URL
    url = 'https://news.sina.com.cn/o/2019-07-15/doc-ihytcitm2223461.shtml'
    #发送请求、获取响应
    html = get_page(url)
    #解析响应、保存结果
    get_parser(html)

发送请求,获取响应,编写get_page()函数。和之前不同,一般情况下我们使用requests库来实现,这次我们将使用urllib库来实现,简单练习一下我们在Python爬虫基础第二讲网络请求与响应中学到的知识:

def get_page(url):
    try:
        response = urllib.request.urlopen(url)
        html = response.read().decode('utf-8')
        return html
    except RequestException:
        return None

解析响应,提取新闻的题目、日期、来源、正文内容,并存储。

题目:

日期:

来源:

正文(分布在两个p标签中):

def get_parser(html):
    #题目
    pattern = re.compile('<h1 class="main-title">(.*?)</h1>',re.S)
    title = pattern.findall(html)[0]

    #日期
    pattern = re.compile('<span class="date">(.*?)</span>',re.S)
    date = pattern.findall(html)[0]

    #来源
    pattern = re.compile('<a href=.*?class="source".*?>(.*?)</a>',re.S)
    source = pattern.findall(html)[0]

    #正文
    #可以提取两次 第一次缩小范围,第二词再从小范围HTML代码中提取
    pattern = re.compile('<div class="article" id="article">(.*?)<p class="show_author">',re.S)
    article = pattern.findall(html)[0]

    pattern = re.compile('<p>(.*?)</p>',re.S)
    article = pattern.findall(article)

    write_tofile(title,date,source,article)

注意:findall()返回的是一个列表。

数据存储:


def write_tofile(title,date,source,article):
    with open('{}.txt'.format(date[:11]+'_'+title),'w',encoding='utf-8') as f:
        f.write(title+'\t'+date+'\t'+source+'\n')
        for i in article:
            f.write(i.strip())

完整代码:

import urllib.request
import re
from requests import RequestException

def get_page(url):
    try:
        response = urllib.request.urlopen(url)
        html = response.read().decode('utf-8')
        return html
    except RequestException:
        return None


def get_parser(html):
    #题目
    pattern = re.compile('<h1 class="main-title">(.*?)</h1>',re.S)
    title = pattern.findall(html)[0]

    #日期
    pattern = re.compile('<span class="date">(.*?)</span>',re.S)
    date = pattern.findall(html)[0]

    #来源
    pattern = re.compile('<a href=.*?class="source".*?>(.*?)</a>',re.S)
    source = pattern.findall(html)[0]

    #正文
    #可以提取两次 第一次缩小范围,第二词再从小范围HTML代码中提取
    pattern = re.compile('<div class="article" id="article">(.*?)<p class="show_author">',re.S)
    article = pattern.findall(html)[0]

    pattern = re.compile('<p>(.*?)</p>',re.S)
    article = pattern.findall(article)

    write_tofile(title,date,source,article)

def write_tofile(title,date,source,article):
    with open('{}.txt'.format(date[:11]+'_'+title),'w',encoding='utf-8') as f:
        f.write(title+'\t'+date+'\t'+source+'\n')
        for i in article:
            f.write(i.strip())

if __name__=='__main__':
    #指定页面新浪新闻的URL
    url = 'https://news.sina.com.cn/o/2019-07-15/doc-ihytcitm2223461.shtml'
    #发送请求、获取响应
    html = get_page(url)
    #解析响应、保存结果
    get_parser(html)

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值