1 问题描述
网页可以分为静态网页和动态网页,静态网页指无需经过服务器的编译,直接加载到客户浏览器上显示出来,静态网页一般不需要用户的交互。动态网页则一般需要服务器对数据进行处理后发送到网页中,动态网页往往需要用户的交互。
网页新闻一般属于静态网页,所以我们这里使用request模块爬取网页新闻,并用BeautifulSoup模块来解析网页内容。
爬取新浪网页新闻,网页内容如下所示:
##2 导入所需模块
其中,第一行#-*- coding:utf-8 -*-
表示utf-8编码,一般网页内容包含中文时需要加此说明!
#-*- coding:utf-8 -*-
from urllib.request import Request,urlopen
from bs4 import BeautifulSoup
import importlib,sys
importlib.reload(sys)
3 定义该网页的网址
url = "https://finance.sina.com.cn/stock/zqgd/2022-04-16/doc-imcwipii4529812.shtml"
4 爬取解析网页
采用urlopen将网页所有内容读取出来,保存到html变量中。
# header是模拟浏览器的参数,解决反爬虫问题,如果要爬取的网站没有反爬虫,可以不加hear!
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}
req = Request(url, headers=header)
html = urlopen(req).read().decode('utf-8')
5 解析保存的网页内容
soup = BeautifulSoup(html, 'lxml')
6 提取网页标题
这一步比较关键,如何确定需要提取内容在网页中的节点位置呢?
可以使用chrome等浏览器的"检查元素"功能。然后点击下图中红色区域图标!
之后鼠标移到需要提取信息的网页位置,浏览器会自动给出该内容的节点位置:h1.main-title
采用find()函数查找标签为“h1”,属性(class_)为“main-title”的网页内容。并用get_text()函数提取文本内容!
title = soup.find('h1',class_='main-title').get_text()
print(title)
央行全面降准,释放5300亿资金!降息还有空间?从预告到落地仅用2天,如何影响股债楼?看最全解读
7 提取新闻的内容
采用上面相同的方法,定位到新闻内容,获取该内容的节点位置:div#artibody.article。其中“#”是CSS中的id选择器。
再次用find()函数查找标签为“div”,属性(class_)为“article”,id为“artibody”的网页内容。并用get_text()函数提取文本内容,strip()函数去掉前后空格,replace("\n","")去掉换行,replace(" ","")去掉多余的空格!
content = soup.find('div',class_='article',id='artibody').get_text().strip().replace("\n","").replace(" ","")
print(content)
从“预告”到落地,降准来了。4月15日晚间,人民银行发布消息称,为支持实体经济发展,促进综合融资成本稳中有降,决定于2022年4月25日下调金融机构存..........
8 保存到文件
file=open(r".\news.txt",'w')
file.write(title+'\n'+content)
file.close()