在本篇博客中,我们将使用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)