Wyl
2021/05/15阅读:137主题:兰青
爬虫 | 小米造车百度新闻
前言
作为一名小米产品长期使用者(主要是因为穷不是因为“米粉”),在记录python爬虫笔记时,总是倾向于以小米作为例子。例子无碍,代码为真。上篇文章爬虫 | 年轻人如何看待小米造车我们抓取了哔哩哔哩关于小米造车的弹幕内容,从而粗略地描述了年轻网友们对小米造车的看法和态度。众所周知,百度是我们国内最大的搜索引擎,也是学术与实务研究的重要数据来源。特别地,百度资讯汇集了众多网络媒体的新闻报道,是我们了解社会舆论、资本市场舆论等方面信息的来源。但是不得不吐槽的是,现在百度资讯的内容主要由百度的旗下的百家号构成,导致内容质量和多样性降低。
本文,我们主要介绍如何抓取某一关键词百度新闻检索结果,我们的例子是小米造车
。
分析与代码实现
首先,我们在百度资讯中输入“小米造车”,得到下图的检索的结果

我们可以得到url,https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&ie=utf-8&word=小米造车
,其中https://www.baidu.com/s?
为百度的基本url,rtt=1
表示资讯按焦点排序,如果值为4则表示按时间排序,word=小米造车
为检索关键词。
当我们进行翻页操作后,可以发现url最后增加了一个关键参数pn=10
,表示每页展示10条资讯,意味着第一页的参数为pn=0
、第二页的参数pn=10
、第三页的参数为pn=20
,以此类推。通过以上url规律分析,我们就可以构造所有检索网页的url
核心代码实现
def get_new(keyword,page):
'''
获取新闻url、爬取并保存
keyword:指定关键词
page:百度新闻检索页数
'''
headers = {
'User-Agent': UserAgent(verify_ssl=False).random,
'Referer': 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=%B0%D9%B6%C8%D0%C2%CE%C5&fr=zhidao'
}
params = {
'ie': 'utf-8',
'medium': 0,
# rtt=4 按时间排序 rtt=1 按焦点排序
'rtt': 4,
'bsst': 1,
'rsv_dl': 'news_t_sk',
'cl': 2,
'tn': 'news',
'rsv_bp': 1,
'oq': '',
'rsv_btype': 't',
'f': 8,
}
url = 'https://www.baidu.com/s'
params['wd'] = keyword
其次,分析HTML结构,获取我们想要的信息
从下图可以看到,每一个新闻模块的信息都被放在class = 'result-op c-container xpath-log new-pmd'
的div模块中

具体来说,我们需要抓取资讯的url
、标题
、来源
、时间
,相关内容如下图所示


核心代码实现
soup = BeautifulSoup(res.text,"html.parser")
ztk = soup.select(".result-op.c-container.xpath-log.new-pmd")
for subsoup in ztk:
try:
source = subsoup.select(".c-color-gray.c-font-normal.c-gap-right")[0].text.strip()
except:
source = "缺失值" # 有些资讯缺乏来源会报错
try:
date = subsoup.select(".c-color-gray2.c-font-normal")[0].text.strip()
except:
date = "缺失值"
title = subsoup.select(".news-title_1YtI1 a")[0].text.strip()
newurl = subsoup.select(".news-title_1YtI1 a")[0]["href"]
content = new_content(newurl)
最后,在我们抓取完所有资讯列表后,我们更希望这些新闻到底讲了些啥,也就是说新闻的文本内容更是我们想要抓取。我们前面已经抓取了每一条新闻对应的url,那么我们现在遍历这些url获取文本即可
核心代码实现
def new_content(newurl):
'''
获取新闻正文内容
'''
newres = requests.get(newurl)
newres.encoding = newres.apparent_encoding
newsoup = BeautifulSoup(newres.text,"html.parser")
paras=newsoup.find_all(name='p') #class_='article-content'
new_content=''
#print('\n\ncontent:')
for para in paras:
word = re.findall('[\u4e00-\u9fa5]|\u3002|\uff1f|\uff01|\uff0c|',para.text) # # 匹配中文、句号、问号、感叹号以及逗号
sentence = ''.join(w for w in word)
new_content += sentence
#print(para.text)
return new_content
运行结果
程序运行界面结果

保存文件结果

结论
至此,我们已经爬取完以“小米造车”为关键词的百度新闻相关内容
项目完整代码可在公众号后台关键词“小米造车百度新闻爬虫”获取
期待您的关注
、在看
、点赞
一键三连
您的一键三连是最好的支持!
作者介绍
Wyl
厦门大学