要求:从搜狐新闻网站上爬取新闻列表并将每篇新闻的标题和链接保存到本地的news.txt文件中。
代码的思路如下:
- 设置用户代理,防止被服务器识别为爬虫并拒绝访问。
- 发送请求获取新闻列表页面,并用lxml库的etree模块将页面内容解析成html dom文档。
- 使用xpath语句选取新闻列表页面中的所有新闻链接,并对每个链接发送请求并解析其html dom文档。
- 使用xpath语句选取每篇新闻的标题和正文,并将标题作为文件名,将正文保存到以标题命名的文件中。
详细实现代码:
'''
XPath模块-搜狐新闻
需求:
1.打开搜狐新闻官网 爬取新闻列表(新闻标题、新闻链接)
2.将新闻标题和新闻链接保存到 news.txt中
重庆警方:一实载50人大客车发生侧翻,20人受伤其中7人伤势较重:https://new.qq.com/rain/a/20230428A01VRU00
.....
3.使用lxml库以及xpath语句实现功能
'''
import os
import requests
from lxml import etree
# 1.设置用户代理
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
# 2.获取新闻列表
def getNewsList():
# 2.1 设置新闻的url地址
url = "http://news.sohu.com/"
# 2.2 爬取新闻列表对象
response = requests.get(url=url,headers=headers)
# 2.3 设置解码格式
response.encoding = 'utf-8'
# 2.4 将网页进行转换
html = etree.HTML(response.text)
# 2.5 设置路径表达式(获取a标签且属性class='text-chain-item')
hrefList = html.xpath("//a[@class='text-chain-item']//@href")
# 2.6 循环遍历每个链接进行处理
for href in hrefList:
# https://www.sohu.com/a/671041852_121284943?edtsign=8B3BE8A49C43875BF4315DEF05C02F66A491F3A0&edtcode=7l1qGClIU%2Fep9oAfqs2zVA%3D%3D&scm=1103.plate:663:0.0.1_1.0&_f=index_cpc_1_0&spm=smpc.channel_258.block4_314_Y6ubu8_1_fd.2.1682670588234GoqvdiH_1090
getNew("https://www.sohu.com"+href)
# 获取新闻详情页
def getNew(url):
# 3.1 爬取新闻详情页的数据
response = requests.get(url=url,headers=headers)
# 3.2 设置解码格式
response.encoding = 'utf-8'
# 3.3 将文件转换为html dom文档
html = etree.HTML(response.text)
# 3.4 获取新闻标题
title = html.xpath("//h1//text()")[0].strip()
# 3.6 获取新闻正文(获取article节点所有的子元素为p的节点的文本数据)
content = html.xpath("//article/p//text()")
# 3.7 将正文变成数据
data = "\n".join(content)
# 3.8 保存清洗后的数据
print(type(title))
if "/" in title:
title = "实探骂顾客穷长沙“索命小串”店:牛肉鸭肠里脊10元30串,蜘蛛蜈蚣海马50元"
file = open("%s.txt"%title,'w',encoding='utf-8')
file.write(data)
file.close()
# print("已经写入了:",title)
if __name__ == '__main__':
# 创建文件夹‘搜狐新闻’
if "搜狐新闻" not in os.listdir():
os.mkdir("搜狐新闻")
os.chdir("搜狐新闻")
getNewsList()