其他分享
首页 > 其他分享> > 7 数据挖掘案例实战1—百度新闻标题、网址、日期及来源

7 数据挖掘案例实战1—百度新闻标题、网址、日期及来源

作者:互联网

数据挖掘案例实战1—百度新闻标题、网址、日期及来源

获取网页源代码

import requests
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿里巴巴'
res = requests.get(url, headers=headers).text
print(res)

编写正则表达式提取新闻

特别注意:对于不同的网页,书写的规则是不一样的,我们要学会上节课的方法,找到规律然后提取相关的内容,下面只是框架示例

1.提取新闻的来源和日期

import re
p_info = '<p class="c-author">(.*?)</p>'
info = re.findall(p_info, res, re.S)
print(info)

2.提取新闻的网址和标题

p_title = '<h3 class="news-title_1YtI1">.*?>(.*?)</a>'
title = re.findall(p_title, res, re.S)

数据清洗并打印输出

1.新闻标题的清洗

通常情况下,每个标题的首位含有换行符\n,一些空格和< em >等无效字符。这里我们就可以利用strip()函数把不需要的空格、换行符去掉,利用sub()函数处理< em >等

for i in range(len(title)):  # range(len(title)),这里因为知道len(title) = 10,所以也可以写成for i in range(10)
    title[i] = title[i].strip()  # strip()函数用来取消字符串两端的换行或者空格,不过目前(2020-10)并没有换行或空格,所以其实不写这一行也没事
    title[i] = re.sub('<.*?>', '', title[i]) 

<.*?>可以表示任何形式为< xxx >的内容

2.新闻来源和日期的清洗

通常情况下夹杂< img >标签信息等,也是同理利用split()、strip()函数清洗,然后利用append()函数为列表添加新元素进行整合

总代码理解

import requests
import re

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36'}

url = 'https://www.baidu.com/s?tn=news&rtt=1&bsst=1&cl=2&wd=阿里巴巴'  # 把链接中rtt参数换成4即是按时间排序,默认为1按焦点排序
res = requests.get(url, headers=headers).text  # 加上headers用来告诉网站这是通过一个浏览器进行的访问
# print(res)

p_href = '<h3 class="news-title_1YtI1"><a href="(.*?)"'
href = re.findall(p_href, res, re.S)
p_title = '<h3 class="news-title_1YtI1">.*?>(.*?)</a>'
title = re.findall(p_title, res, re.S)
p_date = '<span class="c-color-gray2 c-font-normal">(.*?)</span>'
date = re.findall(p_date, res)
p_source = '<span class="c-color-gray c-font-normal c-gap-right">(.*?)</span>'
source = re.findall(p_source, res)

# print(title)
# print(href)
# print(date)
# print(source)

for i in range(len(title)):  # range(len(title)),这里因为知道len(title) = 10,所以也可以写成for i in range(10)
    title[i] = title[i].strip()  # strip()函数用来取消字符串两端的换行或者空格,不过目前(2020-10)并没有换行或空格,所以其实不写这一行也没事
    title[i] = re.sub('<.*?>', '', title[i])  # 核心,用re.sub()函数来替换不重要的内容
    print(str(i + 1) + '.' + title[i] + '(' + source[i] + ' ' + date[i] + ')')
    print(href[i])

标签:title,res,print,新闻标题,re,len,数据挖掘,百度,headers
来源: https://blog.csdn.net/Eric005/article/details/119463132