需求:

爬取全部新浪新闻

切入点:



新浪新闻主页组织很杂,但是通过观察可知,新浪滚动新闻中罗列了所有新闻,而且可以通过类别或日期选择查看,所以,要想爬取所有新闻,我们把切入点变为:

爬取新浪滚动新闻(腾讯新闻等其他新闻网站也是如此)

分析网页

进入新浪滚动新闻页面:

新浪滚动新闻

http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=1

查看网页源代码:

居然可以看到一条条a标签的新闻,简直方便了spider!

然而高兴太早,后来发现这些新闻和页面显示的根本不一样,而且翻页操作后这些内容也不会变。

利索当然的想到这些是ajax请求的,不然怎么滚动。

F12看看吧:

果不其然,可以看到,每条新闻以json的形式干净利索的展示出来,再看看url请求:

请求url为:

http://roll.news.sina.com.cn/interface/rollnews_ch_out_interface.php?col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=12&r=0.23150597515105287

将url复制到浏览器里,直接返回了json数据!完美!相当于良心的sina把数据接口开放出来了。

为了获取所有的新闻,我们需要分析url的规律,以获取所有数据:

今天是2017年9月19日,滚动新闻有200多页,而翻到最后一页发现新闻时间为9月8日,担心页面下有个时间选项,可以选择更早时间的新闻,选择后,url发生了变化:

http://roll.news.sina.com.cn/interface/rollnews_ch_out_interface.php?col=89&spec=&type=&date=2017-09-01&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page=1&r=0.11767799118102595

分析一下这个url,很明显了吧已经,变量有:date(时间)、col(类别)、num(每页条数)、asc(增序)、page(第几页)、r(随机量,据说防止缓存用的),我们爬虫时要控制的有:

date、page、col(如果所有类别都爬则不用管)

所以,爬每个date的所有page里的链接就OK

上码:

from bs4 import BeautifulSoup
import urllib.request,re,osdate="2017-09-19"
init_url = 'http://roll.news.sina.com.cn/interface/rollnews_ch_out_interface.php?col=89&spec=&type=&date='+date+'&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page='  targetPath = "E:\\workspace\\pachong\\新浪新闻"#定义保存文件函数
def saveFile(data,title,types,link):  path = targetPath+"\\"+title+".txt"  file = open(path,'wb')  page = '题目:'+title+'\n'+'类别:'+types+'\n'+'链接:'+link+'\n'+'日期:'+date+'\n'  file.write(page.encode('utf-8'))  for d in data:   file.write(d.encode('utf-8'))  file.close() def get_sina_content(link):response = urllib.request.urlopen(link)  data = response.read()data = data.decode('UTF-8')soup=BeautifulSoup(data)content = ""for one in soup(class_="content"):content = str(one)dr = re.compile(r'<[^>]+>',re.S)dd = dr.sub('',content)print(dd)    return ddpage = 1
while page: #请求  request = urllib.request.Request(init_url+str(page))    #爬取结果  response = urllib.request.urlopen(request)  data = response.read()  #设置解码方式  data = data.decode('gbk')  if data.count('channel')==0:page = 0break  reg_str = r'channel.*?title : "(.*?)",id.*?title : "(.*?)",url : "(.*?)",type' pattern = re.compile(reg_str,re.DOTALL)  items = re.findall(pattern,data) for item in items: print("类别"+item[0]+"题目:"+item[1]+"链接:"+item[2])data = get_sina_content(item[2])saveFile(data,item[1],item[0],item[2])page+=1
tips:通过判断返回的json中是否有channel判断该页是否还有新闻。

bug:

测试后发现,很多新闻正文爬取有误,仔细分析发现新闻正文部分所在的标签无规律可寻,需要正文提取算法的辅助,研究后给与解决办法。

反思:

本文只用了urllib,加了一点点bs4,之前想爬腾讯滚动新闻,发现页面同样是ajax渲染数据,但是无法通过url获得json数据,今后的几天攻克一下还有scrapy、request等包留在以后学。

love py

python3+urllib撸新浪滚动新闻爬虫相关推荐

  1. python3爬取新浪NBA新闻信息(待完善)

    #!/usr/bin/env python # -*- coding: utf-8 -*- import requests from requests.exceptions import ReadTi ...

  2. Android 解析新浪RSS新闻源 问题汇总和解决

    项目中要添加RSS源,显示RSS的所有文章,刚好测试的是新浪的新闻RSS源,各种百度之后,找到了这位前辈写的用SAXParser模式解析xml文件的代码,只要参考这个链接,绝对每个小白都可以轻松的解析 ...

  3. 新浪首页改版,您还去新浪看新闻吗?

    新浪首页改版,您还去新浪看新闻吗? 新浪首页改版了,主要体现是"视频上升.博客下降"的思想,原有的首页第一屏中部的"博客"全部取消了,取而代之的是"视 ...

  4. Python 爬虫实例(7)—— 爬取 新浪军事新闻

    我们打开新浪新闻,看到页面如下,首先去爬取一级 url,图片中蓝色圆圈部分 第二zh张图片,显示需要分页, 源代码: # coding:utf-8import json import redis im ...

  5. Java开发新闻管理系统(前后端) 爬虫百度、新浪等新闻

                  ForFuture News  新闻管理系统                     [注]:文档下载:  Reward.SCDN.Forture Share   1. 系 ...

  6. Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻

                  ForFuture News  新闻管理系统                      项目演示地址:http://www.ganquanzhong.top ​ ​ ​ ​ ...

  7. URL编码与解码(使用 Python3 urllib.parse) 与 贴吧小爬虫案例

    一.parse.urlencode() 与parse.unquote() urllib 和urllib.request都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.u ...

  8. 爬取新浪社会新闻源代码

    视频地址如下: https://edu.hellobi.com/course/81/play/lesson/1761 import requests from bs4 import Beautiful ...

  9. 【Python】新浪博客爬虫

    代码放在 GitHub 上了,朋友们可以戳一下看看,帮我引引流,感谢各位. https://github.com/daming98/PersonalToolsByDaming/tree/master/ ...

  10. 新浪新闻页面抓取(JAVA-Jsoup)

    1.使用gradle建立工程: 工程格式如下: include ':spider-demo'rootProject.name = 'my-spider-demo' settings def void ...

最新文章

  1. 开始iOS 7中自动布局教程(一)
  2. 线性回归最小二乘法和梯度下降法-详细
  3. HDU 1088 Write a simple HTML Browser
  4. java第二次测试笔试题_微软第二次笔试第一题java代码 已AC
  5. Android中的长度单位详解
  6. 线程问题—一个线程怎么调出另外一个线程的结果。
  7. 容器学习 之 本地镜像与共有镜像(十)
  8. OJ1114: 逆序(数组)(C语言)
  9. linux 安装rpm包时遇到error:Failed dependencies解法方法
  10. PonyAI进军自动驾驶货运,乘用无人车历史性“小马过河”
  11. openmeeting开发心得及相关文档
  12. 全球及中国信用卡生成器行业投资模式及投资策略分析报告2022-2028年
  13. 用Node.JS分析steam所有的游戏!
  14. RINEX3文件中的toc,toe,IODE区分和了解
  15. 深度学习论文翻译解析:YOLOv4: Optimal Speed and Accuracy of Object Detection
  16. 【工作方法系列】:STEP1 - 5分钟方法
  17. python自动化运维之路~DAY2
  18. 2021芒部中学高考成绩查询,2021年镇雄县高考状元名单资料,今年镇雄县高考状元多少分...
  19. 朋友圈/评论/点赞/搜索/购物车
  20. 手机不显示网络信号连接到服务器是怎么回事,手机连接不上网络怎么办

热门文章

  1. 键值数据库的基本架构
  2. 小布助手对话短文本语义匹配
  3. 教你简单3步搞定——微信快速添加个人表情包
  4. 服务器常见协议,网吧影视服务器常见的网络协议
  5. Debezium报错处理系列一:The db history topic is missing.
  6. 网上找的更具纬度经度算计两点之间的距离,得到的结果不准确, 小程序获取用户位置信息返回的纬度经度与实际位置不正确。
  7. 南京邮电大学网络攻防训练平台逆向第三题PY交易
  8. C语言牛顿迭代法求开平方
  9. Python教程:利用百度API进行批量图片OCR识别
  10. excel删除无尽空白行_从0到1快速入门Excel透视表,看这一篇就够了