python3编程06--爬虫实战:爬取新闻网站信息2

 

本篇博客在爬取新闻网站信息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:

https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1542726096199

点击第二页

往下拉滚动条,找到最新出现的get?pageid复制出分页的URL:

https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=2&encode=utf-8&callback=feedCardJsonpCallback&_=1542726246184 

观察两个分页URL的不一样的地方:

有两处不一样:1是page=1或page=2不一样(我们关心的); 2是&callback=xxx内容不一样(去掉这里能得到json格式数据)

https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1542726096199

https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=2&encode=utf-8&callback=feedCardJsonpCallback&_=1542726246184 

#获取新浪新闻首页的新闻信息---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! 

猜你喜欢

转载自blog.csdn.net/qq_42881421/article/details/84310918