当前位置:   article > 正文

python3编程05--爬虫实战:爬取新闻网站信息1_使用 python 爬取新闻内容标题以及新闻类别

使用 python 爬取新闻内容标题以及新闻类别

爬取新闻网站信息

 

本篇博客爬取内容如下:

新闻标题、新闻时间、新闻来源、新闻内容、责任编辑、评论数(难点)、新闻标识符

 

准备工作:

安装python3

安装相关套件:jupyter、requests、BeautifulSoup4  、datetime  (安装方法: pip install xxx)

 

确定要爬取的新闻网站:

首先打开新浪新闻 https://news.sina.com.cn/china/

找到一篇带有评论的新闻

 

复制网址:https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml

页面空白处,右键-->检查

下载页面数据

  1. #下载页面数据
  2. import requests
  3. res = requests.get('https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml')
  4. res.encoding = 'utf-8'
  5. print(res.text)

 抓取新闻标题

通过下图所示,得到标题所在的class=main-title,抓取其他信息查看其所在class或id的方法都一样。

  1. #抓取新闻标题 class=main-title
  2. from bs4 import BeautifulSoup
  3. soup = BeautifulSoup(res.text,'html.parser')
  4. title = soup.select('.main-title')[0].text
  5. print(title)

抓取新闻时间

  1. #抓取新闻时间
  2. from datetime import datetime
  3. timesource = soup.select('.date')[0].text
  4. #字符串转为时间类型
  5. dt=datetime.strptime(timesource, '%Y年%m月%d日 %H:%M')
  6. print(dt)

抓取新闻来源

  1. #获取来源 class=source
  2. source = soup.select('.source')[0].text
  3. source

抓取新闻内容

  1. #获取内容 id=article
  2. source = soup.select('#article p')[:-1]
  3. print(source)
  1. #将内容合并到一个list
  2. article = []
  3. for p in source:
  4. article.append(p.text.strip())
  5. #以"***"连接每一个段落
  6. '***'.join(article)

简化获取内容语句 

  1. #简化获取内容语句
  2. '***'.join([p.text.strip() for p in soup.select('.article p')[:-1]])

 

抓取责任编辑

  1. #抓取责任编辑 class=show_author
  2. soup.select('.show_author')[0].text.lstrip('责任编辑:')

抓取评论数(难点)

错误方法:

  1. #抓取评论数 num
  2. soup.select('.num')[0]

显然我们打开的新闻评论不为0 ,抓取到的评论数为0,所以此方法错误。

正确方法:因为评论数不在我们下载的html文件中,其实评论数在js文件中,通过如下图方法找到了与评论数对应的数字

通过以下图示方法,能看到页面的评论与js文件的内容一致,可以确认评论来自 "info?version=1..."文件

 复制评论所在URL:https://comment.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-hnvukff4194550&group=undefined&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1&callback=jsonp_1542297510153&_=1542297510153

 

  1. #下载评论数据
  2. comments = requests.get('https://comment.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-hnvukff4194550&group=undefined&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1&callback=jsonp_1542297510153&_=1542297510153')
  3. comments.encoding = 'utf-8'
  4. print(comments.text)

 发现输出类似于json格式,但多出了上图前缀 “jsonp_1542297510153(”

观察评论URL: 末尾正好有与前缀一样的内容

 

我们不妨试着去掉上图末尾的内容,再抓取数据看看,发现输出为json格式的数据。

  1. #下载评论数据,去掉元素URL末尾的“&callback=jsonp_1542297510153&_=1542297510153”
  2. comments = requests.get('https://comment.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-hnvukff4194550&group=undefined&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1')
  3. comments.encoding = 'utf-8'
  4. print(comments.text)

解析json数据,得到新闻评论数

  1. #加载json数据
  2. import json
  3. json.loads(comments.text)

  1. #解析json取得评论数
  2. import json
  3. jd = json.loads(comments.text)['result']['count']['total']
  4. print(jd)

 

 

抓取新闻标识符

  1. #抓取新闻标识符,方法一:
  2. newurl = 'https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml'
  3. urlid = newurl.split('/')
  4. urlid[-1].lstrip('doc-i').rstrip('.shtml')

  1. #抓取新闻标识符,方法二:使用正则表达式
  2. import re
  3. newurl = 'https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml'
  4. match = re.search('doc-i(.+).shtml', newurl)
  5. match.group(1)

 

先到这,enjoy it! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/599534
推荐阅读
相关标签
  

闽ICP备14008679号