python3+urllib撸新浪滚动新闻爬虫
需求:
爬取全部新浪新闻
切入点:
新浪新闻主页组织很杂,但是通过观察可知,新浪滚动新闻中罗列了所有新闻,而且可以通过类别或日期选择查看,所以,要想爬取所有新闻,我们把切入点变为:
爬取新浪滚动新闻(腾讯新闻等其他新闻网站也是如此)
分析网页
进入新浪滚动新闻页面:
新浪滚动新闻
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撸新浪滚动新闻爬虫相关推荐
- python3爬取新浪NBA新闻信息(待完善)
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests from requests.exceptions import ReadTi ...
- Android 解析新浪RSS新闻源 问题汇总和解决
项目中要添加RSS源,显示RSS的所有文章,刚好测试的是新浪的新闻RSS源,各种百度之后,找到了这位前辈写的用SAXParser模式解析xml文件的代码,只要参考这个链接,绝对每个小白都可以轻松的解析 ...
- 新浪首页改版,您还去新浪看新闻吗?
新浪首页改版,您还去新浪看新闻吗? 新浪首页改版了,主要体现是"视频上升.博客下降"的思想,原有的首页第一屏中部的"博客"全部取消了,取而代之的是"视 ...
- Python 爬虫实例(7)—— 爬取 新浪军事新闻
我们打开新浪新闻,看到页面如下,首先去爬取一级 url,图片中蓝色圆圈部分 第二zh张图片,显示需要分页, 源代码: # coding:utf-8import json import redis im ...
- Java开发新闻管理系统(前后端) 爬虫百度、新浪等新闻
ForFuture News 新闻管理系统 [注]:文档下载: Reward.SCDN.Forture Share 1. 系 ...
- Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻
ForFuture News 新闻管理系统 项目演示地址:http://www.ganquanzhong.top ...
- URL编码与解码(使用 Python3 urllib.parse) 与 贴吧小爬虫案例
一.parse.urlencode() 与parse.unquote() urllib 和urllib.request都是接受URL请求的相关模块,但是提供了不同的功能.两个最显著的不同如下: 1.u ...
- 爬取新浪社会新闻源代码
视频地址如下: https://edu.hellobi.com/course/81/play/lesson/1761 import requests from bs4 import Beautiful ...
- 【Python】新浪博客爬虫
代码放在 GitHub 上了,朋友们可以戳一下看看,帮我引引流,感谢各位. https://github.com/daming98/PersonalToolsByDaming/tree/master/ ...
- 新浪新闻页面抓取(JAVA-Jsoup)
1.使用gradle建立工程: 工程格式如下: include ':spider-demo'rootProject.name = 'my-spider-demo' settings def void ...
最新文章
- 开始iOS 7中自动布局教程(一)
- 线性回归最小二乘法和梯度下降法-详细
- HDU 1088 Write a simple HTML Browser
- java第二次测试笔试题_微软第二次笔试第一题java代码 已AC
- Android中的长度单位详解
- 线程问题—一个线程怎么调出另外一个线程的结果。
- 容器学习 之 本地镜像与共有镜像(十)
- OJ1114: 逆序(数组)(C语言)
- linux 安装rpm包时遇到error:Failed dependencies解法方法
- PonyAI进军自动驾驶货运,乘用无人车历史性“小马过河”
- openmeeting开发心得及相关文档
- 全球及中国信用卡生成器行业投资模式及投资策略分析报告2022-2028年
- 用Node.JS分析steam所有的游戏!
- RINEX3文件中的toc,toe,IODE区分和了解
- 深度学习论文翻译解析:YOLOv4: Optimal Speed and Accuracy of Object Detection
- 【工作方法系列】:STEP1 - 5分钟方法
- python自动化运维之路~DAY2
- 2021芒部中学高考成绩查询,2021年镇雄县高考状元名单资料,今年镇雄县高考状元多少分...
- 朋友圈/评论/点赞/搜索/购物车
- 手机不显示网络信号连接到服务器是怎么回事,手机连接不上网络怎么办