鱼C论坛

 找回密码
 立即注册
查看: 1842|回复: 0

[技术交流] 抓取新浪社会新闻源代码

[复制链接]
发表于 2017-3-28 16:50:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
视频地址如下,我觉得讲的深入浅出,分享给大家,欢迎大家讨论。

https://edu.hellobi.com/course/81/play/lesson/1761


  1. import requests
  2. from bs4 import BeautifulSoup
  3. import re
  4. import json
  5. from datetime import datetime
  6. import pandas

  7. #取得评论数的函数
  8. def getCommentCounts(newsurl):
  9.     m = re.search('doc-i(.+).shtml',newsurl)
  10.     newsid = m.group(1)
  11.     commentURL = 'http://comment5.news.sina.com.cn/page/info?version=1&format=js&channel=sh&newsid=comos-{}&group=&compress=0&ie=utf-8&oe=utf-8&page=1&page_size=20'
  12.     comments = requests.get(commentURL.format(newsid))
  13.     comments.encoding ='utf-8'
  14.     jd = json.loads(comments.text.strip('var data='))
  15.     return (jd['result']['count']['total'])

  16. #在正文页面取得包含标题、新闻来源、时间、正文、编辑姓名、评论数的一个字典result
  17. def getNewsDetail(newsurl):
  18.     result = {}
  19.     res = requests.get(newsurl)
  20.     res.encoding = 'utf-8'
  21.     soup = BeautifulSoup(res.text,'html.parser')
  22.     result['title'] = soup.select('#artibodyTitle')[0].text
  23.     result['newssource'] = soup.select('.time-source a')[0].text
  24.     timesource = soup.select('.time-source')[0].contents[0].strip()
  25.     result['dt'] = datetime.strptime(timesource,'%Y年%m月%d日%H:%M')
  26.     result['article'] = ' '.join([p.text.strip() for p in soup.select('#artibody p')[:-1]])
  27.     result['editor'] = soup.select('.article-editor')[0].text.lstrip('责任编辑:')
  28.     result['comments'] = getCommentCounts(newsurl)
  29.     return result

  30. '''
  31. #在新闻标题列表页面如何取得第一次加载的时间、标题以及链接
  32. res_1 = requests.get('http://news.sina.com.cn/society/')
  33. res_1.encoding = 'utf-8'
  34. soup =BeautifulSoup(res_1.text,'html.parser')

  35. for news in soup.select('.news-item'):
  36.     if len(news.select('h2'))>0:
  37.         h2 = news.select('h2')[0].text
  38.         time = news.select('.time')[0].text
  39.         a = news.select('a')[0]['href']
  40.         print (time,h2,a)      
  41. '''

  42. #在新闻标题列表页面如何取得滚动后加载的所有新闻链接,并调用getNewsDetail(newsurl)函数
  43. def parseListLinks(url):
  44.     res = requests.get(url)
  45.     jd = json.loads(res.text.lstrip('   newsloadercallback(').rstrip(');'))
  46.     newsdetails = []
  47.     for each in jd['result']['data']:
  48.         newsdetails.append(getNewsDetail(each['url']))#这里调用了上面的getNewsDetail(newsurl)函数
  49.     return newsdetails



  50. url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=shxw&cat_2==zqsk||=qwys||=shwx||=fz-shyf&level==1||=2&show_ext=1&show_all=1&show_num=22&tag=1&format=json&page={}'
  51. news_total = []
  52. for i in range(1,6):
  53.     newsurl = url.format(i)
  54.     newsary = parseListLinks(newsurl)
  55.     news_total.extend(newsary)
  56. df = pandas.DataFrame(news_total)

  57. df.to_excel('news.xlsx')

  58. import sqlite3
  59. with sqlite3.connect('news.sqlite')as db:
  60.     df.to_sql('news',con = db)

  61. import sqlite3
  62. with sqlite3.connect('news.sqlite')as db:
  63.     df2 = pandas.read_sql_query('SELECT * FROM NEWS',con = db)



复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表