百度新闻爬虫

自己根据这篇文章的启发写了一个爬虫:

https://blog.csdn.net/aidanmo/article/details/104114988

具体步骤如下:

获得爬虫请求头

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

发布的网站和发布时间

pattern = '<p class="c-author">(.*?)</p>'
info = re.findall(pattern, web_text, re.S)   # re.S用于考虑换行符,因为.和*不包含换行符
info

发布来源和时间数据清洗

source=[]
date=[]
for i in range(len(info)):
    info[i]=re.sub('<.*?>', '', info[i])
    source.append(info[i].split('&nbsp;&nbsp;')[0])
    date.append(info[i].split('&nbsp;&nbsp;')[1])
    source[i]=source[i].strip()
    date[i]=date[i].strip()
    print(source[i],date[i])

结果

泡泡网 38分钟前
新浪 4小时前
新浪财经 5小时前
新浪 4小时前
澎湃新闻 1小时前
36氪 2020年02月02日 13:13
钛媒体 6小时前
电商报 4小时前
太平洋电脑网 1小时前
美股研究社 22分钟前

发布的新闻链接

pattern_href= '<h3 class="c-title">.*?<a href="(.*?)"'
href = re.findall(pattern_href, web_text, re.S)      # re.S用于考虑换行符,因为.和*不包含换行符 

发布的新闻标题

pattern_title = '<h3 class="c-title">.*?>(.*?)</a>'
title = re.findall(pattern_title, web_text, re.S)      # re.S用于考虑换行符,因为.和*不包含换行符
for i in range(len(title)):
    title[i] = title[i].strip()
    title[i] = re.sub('<.*?>', '', title[i])
#     print(title[i])
    print(str(i+1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')

汇总后的代码如下

import requests
import re

def baidu_news(company,page):
    num = (page - 1) * 10
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                             'AppleWebKit/537.36 (KHTML, like Gecko) '
                             'Chrome/77.0.3865.120 Safari/537.36'}
    url = 'https://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word='+company+str(num)
    res = requests.get(url, headers=headers)
    web_text = res.text

    #发布的网站和发布时间
    pattern = '<p class="c-author">(.*?)</p>'
    info = re.findall(pattern, web_text, re.S)   
    source=[]
    date=[]
      
    #获取新闻链接
    pattern_href= '<h3 class="c-title">.*?<a href="(.*?)"'
    # pattern_herf = '<h3 class="c-title">.*?<a href="(.*?)"'
    href = re.findall(pattern_href, web_text, re.S)      # re.S用于考虑换行符,因为.和*不包含换行符

    #获取新闻标题
    pattern_title = '<h3 class="c-title">.*?>(.*?)</a>'
    title = re.findall(pattern_title, web_text, re.S)      # re.S用于考虑换行符,因为.和*不包含换行符
    for i in range(len(title)):
        title[i] = title[i].strip()
        title[i] = re.sub('<.*?>', '', title[i])

    # 数据清洗
    for i in range(len(info)):
        info[i]=re.sub('<.*?>', '', info[i])
        source.append(info[i].split('&nbsp;&nbsp;')[0])
        date.append(info[i].split('&nbsp;&nbsp;')[1])
        source[i]=source[i].strip()
        date[i]=date[i].strip()
        print(str(i+1) + '.' + title[i] + '(' + date[i] + '-' + source[i] + ')')
    
    #数据的保存
    file_news=open('百度新闻爬取1.txt','a',encoding='utf-8')
    file_news.write(company+str(num+1)+'页面新闻数据:' + '\n' + '\n')
    for i in range(len(title)):
        file_news.write(str(i+1)+'.'+title[i] +'(' + date[i] +')'+ '\n')
        # file_news.write(str(i+1) + '.' + title[i] + '(' + date[i] + ')' + '\n')
        file_news.write(href[i] + '\n')
    file_news.write('————————————————————————————————————————————'+'\n' + '\n')
    file_news.close()

def main():
    companys=['华能信托', '腾讯', '阿里巴巴']
    for company in companys:
        for i in range(5):
            try:
                baidu_news(company,i+1)
                print(company+''+str(i+1)+'页新闻爬取成功')
            except:
                print(company+''+str(i+1)+'页新闻爬取失败')

if __name__ == '__main__':
    main()

这是自己参考别人成功写的第一个爬虫。

posted @ 2020-02-03 16:57  舒畅123  阅读(200)  评论(0)    收藏  举报