本篇博客在爬取新闻网站信息1的基础上进行。
主要内容如下:
1. 将获取评论数封装成函数
2.将获取页面关心的内容封装成函数,关心内容如下:
新闻标题、新闻时间、新闻来源、新闻内容、责任编辑、评论数
3.获取新浪国内最新新闻一个分页的20条新闻链接
将获取评论数封装成函数:
浏览器找到新浪的一条新闻,按F12, 再按F5刷新网页,打开network监听网页,打开js找到评论链接,
观察两条不同评论的链接,
不同的地方是newsid=comos-xxxx部分不一样。xxxx为新闻标识符(newsid),可以用{}来代替,之后用fomat(newsid)来补充内容。
注意:要去掉评论链接后面的&callback=jsonp_xxxx的内容,才能获得到json格式的数据。
#获取评论数的函数
import requests
import json
import re
def getCommentsCount(newsurl):
#获取新闻id(newsid)新闻标识符
match = re.search('doc-i(.+).shtml', newsurl)
newsid = match.group(1)
#评论URL
commentURL='https://comment.sina.com.cn/page/info?version=1&format=json&channel=gn&newsid=comos-{}&group=undefined&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=3&t_size=3&h_size=3&thread=1'
#补充完整URL
comments = requests.get(commentURL.format(newsid))
#输出json字典格式形式
jd = json.loads(comments.text)
#取出评论数
return jd['result']['count']['total']
测试:
#测试
news = 'https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml'
getCommentsCount(news)
将获取页面关心的内容封装成函数
#通过函数获取一张新闻页面的标题、来源、时间、文章内容、责任编辑、评论数
import requests
from bs4 import BeautifulSoup
from datetime import datetime
def getNewsDetail(newsurl):
result = {}
#下载页面数据
res = requests.get(newsurl)
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
#读取标题
result['title']= soup.select('.main-title')[0].text
#新闻来源
result['newssource'] = soup.select('.date-source')[0].contents[3].text
#新闻时间
timesource = soup.select('.date-source')[0].contents[1].text
result['dt'] = datetime.strptime(timesource, '%Y年%m月%d日 %H:%M')
#文章内容
result['article'] = ' '.join([p.text.strip() for p in soup.select('.article p')[:-1]])
#责任编辑
result['editor'] = soup.select('.show_author')[0].text.lstrip('责任编辑:')
#评论数
result['comments'] = getCommentsCount(newsurl)
return result
#测试
url = 'https://news.sina.com.cn/c/2018-11-15/doc-ihnvukff4194550.shtml'
getNewsDetail(url)
获取新浪国内最新新闻一个分页的20条新闻链接
找到https://news.sina.com.cn/china/最下方的分页,
点击不同分页,发现呈现的页面只有中间新闻有变化,旁边内容没有变化,说明最新新闻的分页是动态加载的
通过Netwark找到分页相关的URL
复制出分页的URL:
点击第二页
往下拉滚动条,找到最新出现的get?pageid复制出分页的URL:
观察两个分页URL的不一样的地方:
有两处不一样:1是page=1或page=2不一样(我们关心的); 2是&callback=xxx内容不一样(去掉这里能得到json格式数据)
#获取新浪新闻首页的新闻信息---json格式
#获取新浪新闻首页的新闻信息---json格式
requests
import json
res = requests.get('https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=2&encode=utf-8')
jd = json.loads(res.text)
jd
观察输出的数据中有对应的URL(https://news.sina.com.cn/o/2018-11-20/doc-ihmutuec2021339.shtml)和新闻标题 ,与页面中的标题一致,说明这里的URL对应于该新闻URL
#获取新浪国内最新新闻一个分页的20条新闻链接
for ent in jd['result']['data']:
print(ent['url'])
先到这,enjoy it!