欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python网络爬虫爬取新浪新闻

程序员文章站 2022-05-02 22:03:17
...

笔者最近由于需要研究互联网新闻,于是基于邱老师的网络爬虫实战,写了一个爬取新浪新闻的爬虫,爬取的信息有:

  1. 新闻标题
  2. 来源url
  3. 发布时间
  4. 正文
  5. 编辑者

与邱老师的爬虫相比有以下几点不同:

  1. 没有爬取新闻评论数目
  2. 对错误网页进行跳过处理
  3. 适应当前网页标签

可以通过修改main下的range(a,b)范围来控制爬取新闻的条数。新浪网每页20条新闻,也就是说range(10)可以爬取10 * 20 = 200 条新闻。爬取的信息最后以.xlsx文件形式输出。这是一个简单的框架。笔者已于2019.4.10爬取了9980条新闻数据,耗时二十余分钟,供参考。

import requests
from bs4 import BeautifulSoup
from datetime import datetime
import json
import pandas

news_url = 'https://news.sina.com.cn/c/2019-04-09/doc-ihvhiewr4450873.shtml'
url = 'https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page={}&encode=utf-8&callback=feedCardJsonpCallback&_=1554884499689'

def getSinaNews(news_url):
    print(news_url)
    result = {}
    try:
        res = requests.get(news_url)
        res.encoding = 'utf-8'
        soup = BeautifulSoup(res.text, 'html.parser')

        result['title'] = soup.select('.main-title')[0].text
        result['source'] = soup.select('.source')[0].text
        result['time'] = datetime.strptime(soup.select('.date')[0].text.strip(), '%Y年%m月%d日 %H:%M')
        result['article']  = ' '.join([p.text.strip() for p in soup.select('.article-content-left p')[:-2]])
        result['editor'] = soup.select('.show_author')[0].text.lstrip("责任编辑:")
    except:
        print("ERROR")

    return result

def parseListLinks(url):
    news_details = []
    res = requests.get(url)
    jd = json.loads(res.text[26:-14])
    for ent in jd['result']['data']:
        news_details.append(getSinaNews(ent['url']))
    return news_details

if __name__ == '__main__':
    news_total = []
    for i in range(1,10):
        news = parseListLinks(url.format(i))
        news_total.extend(news)
    print("爬取新闻条数:",len(news_total))
    df = pandas.DataFrame(news_total)
    df.to_excel('sina_news.xlsx')

 

相关标签: 爬虫 新闻