上一篇文章《python爬虫:抓取新浪新闻数据》详细解说了如何抓取新浪新闻详情页的相关数据,但代码的构建不利于后续扩展,每次抓取新的详情页时都需要重新写一遍,因此,我们需要将其整理成函数,方便直接调用。
详情页抓取的6个数据:新闻标题、评论数、时间、来源、正文、责任编辑。
首先,我们先将评论数整理成函数形式表示:
1 import requests 2 import json 3 import re 4 5 comments_url = '{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20' 6 7 def getcommentscount(newsurl): 8 id = re.search('doc-i(.+).shtml', newsurl) 9 newsid = id.group(1)10 commentsurl = requests.get(comments_url.format(newsid))11 commentstotal = json.loads(commentsurl.text.strip('var data='))12 return commentstotal['result']['count']['total']13 14 news = ''15 print(getcommentscount(news))
第5行comments_url,在上一篇中,我们知道评论链接中有新闻id,不同新闻的评论数通过该新闻id的变换而变换,因此我们将其格式化,新闻id处用大括号{}来替代;
定义获取评论数的函数getcommentscount,通过正则来查找匹配的新闻id,然后将获取的新闻链接存储进变量commentsurl中,通过解码js来得到最终的评论数commentstotal;
然后,我们只需输入新的新闻链接,便可直接调用函数getcommentscount来获取评论数。
最后,我们将需要抓取的6个数据均整理到一个函数getnewsdetail中。如下:
1 from bs4 import beautifulsoup 2 import requests 3 from datetime import datetime 4 import json 5 import re 6 7 comments_url = '{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20' 8 9 def getcommentscount(newsurl):10 id = re.search('doc-i(.+).shtml', newsurl)11 newsid = id.group(1)12 commentsurl = requests.get(comments_url.format(newsid))13 commentstotal = json.loads(commentsurl.text.strip('var data='))14 return commentstotal['result']['count']['total']15 16 # news = 'http://news.sina.com.cn/c/nd/2017-05-14/doc-ifyfeius7904403.shtml'17 # print(getcommentscount(news))18 19 def getnewsdetail(news_url):20 result = {}21 web_data = requests.get(news_url)22 web_data.encoding = 'utf-8'23 soup = beautifulsoup(web_data.text,'lxml')24 result['title'] = soup.select('#artibodytitle')[0].text25 result['comments'] = getcommentscount(news_url)26 time = soup.select('.time-source')[0].contents[0].strip()27 result['dt'] = datetime.strptime(time,'%y年%m月%d日%h:%m')28 result['source'] = soup.select('.time-source span span a')[0].text29 result['article'] = ' '.join([p.text.strip() for p in soup.select('#artibody p')[:-1]])30 result['editor'] = soup.select('.article-editor')[0].text.lstrip('责任编辑:')31 return result32 33 print(getnewsdetail(''))
在函数getnewsdetail中,获取需要抓取的6个数据,放在result中:
result['title']是获取新闻标题;
resul['comments']是获取评论数,可以直接调用我们开头定义的评论数函数getcommentscount;
result['dt']是获取时间; result['source']是获取来源;
result['article']是获取正文;
result['editor']是获取责任编辑。
而后输入自己想要获取数据的新闻链接,调用该函数即可。
部分运行结果:
{'title': '浙大附中开课教咏春 “教头”系叶问第三代弟子', 'comments': 618, 'dt': datetime.datetime(2017, 5, 14, 7, 22), 'source': '中国新闻网', 'article': '原标题:浙大附中开课教咏春 “教头”系叶问......来源:钱江晚报', 'editor': '张迪 '}
以上就是新浪新闻详情页的数据抓取实例的详细内容。