前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途

如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加密、微博的登录验证等。相比较而言,新闻网站的反爬机制就要稍微弱一点。因此今天以新浪新闻为例,分析如何通过Python爬虫按关键词抓取相关的新闻。

首先,如果从新闻直接进行搜索,你会发现其内容最多显示20页,因此我们要从新浪的首页进行搜索,这样才没有页数的限制。

网页结构分析

<div class="pagebox" id="_function_code_page">
<b><span class="pagebox_cur_page">1</span></b>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=2')" title="第2页">2</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=3')" title="第3页">3</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=4')" title="第4页">4</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=5')" title="第5页">5</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=6')" title="第6页">6</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=7')" title="第7页">7</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=8')" title="第8页">8</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=9')" title="第9页">9</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=10')" title="第10页">10</a>
<a href="javascript:;" onclick="getNewsData('https://interface.sina.cn/homepage/search.d.json?t=&q=%E6%97%85%E6%B8%B8&pf=0&ps=0&page=2');" title="下一页">下一页</a>
</div>

进入新浪网并进行关键字搜索之后,发现无论如何翻页网址都不会变,但是网页的内容却更新了,经验告诉我这是通过ajax完成的,因此我把新浪的网页代码拿下来看了看。

显而易见,每一次翻页都是通过点击a标签向一个地址发送请求,如果你直接将这个地址放入浏览器的地址栏并回车:

那么恭喜你,收到错误了

认真看一下html的onclick,发现它是调用了一个叫getNewsData的函数,因此在相关的js文件中查找一下这个函数,可以看出它是在每次ajax请求之前构造了请求的url,并且使用get请求,返回的数据格式为jsonp(跨域)。

因此我们只要模仿它的请求格式就可以获取数据了。

var loopnum = 0;
function getNewsData(url){var oldurl = url; if(!key){$("#result").html("<span>无搜索热词</span>"); return false;} if(!url){url = 'https://interface.sina.cn/homepage/search.d.json?q='+encodeURIComponent(key);}var stime = getStartDay();var etime = getEndDay();url +='&stime='+stime+'&etime='+etime+'&sort=rel&highlight=1&num=10&ie=utf-8'; //'&from=sina_index_hot_words&sort=time&highlight=1&num=10&ie=utf-8';$.ajax({type: 'GET',dataType: 'jsonp',cache : false,url:url,success: //回调函数太长了就不写了})

发送请求

import requestsheaders = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",
}
params = { "t":"", "q":"旅游", "pf":"0", "ps":"0", "page":"1", "stime":"2019-03-30", "etime":"2020-03-31", "sort":"rel", "highlight":"1", "num":"10", "ie":"utf-8" }response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers) print(response)

这次使用的是requests库,构造相同的url,并发送请求。结果收到的结果是冷冰冰的403Forbidden:

因此重新回到网站看看到底哪里出现了问题

从开发者工具中找到返回的json文件,并查看请求头,发现它的请求头带有cookie,因此在构造headers时我们直接复制它的请求头即可。再次运行,response200!剩下的就简单了,只需要将返回的数据解析后写入Excel。

完整代码

import requests import json import xlwt def getData(page, news):headers = { "Host": "interface.sina.cn", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0", "Accept": "*/*", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Referer": r"http://www.sina.com.cn/mid/search.shtml?range=all&c=news&q=%E6%97%85%E6%B8%B8&from=home&ie=utf-8", "Cookie": "ustat=__172.16.93.31_1580710312_0.68442000; genTime=1580710312; vt=99; Apache=9855012519393.69.1585552043971; SINAGLOBAL=9855012519393.69.1585552043971; ULV=1585552043972:1:1:1:9855012519393.69.1585552043971:; historyRecord={'href':'https://news.sina.cn/','refer':'https://sina.cn/'}; SMART=0; dfz_loc=gd-default", "TE": "Trailers" }params = { "t":"", "q":"旅游", "pf":"0", "ps":"0", "page":page, "stime":"2019-03-30", "etime":"2020-03-31", "sort":"rel", "highlight":"1", "num":"10", "ie":"utf-8" }response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers)dic = json.loads(response.text)news += dic["result"]["list"] return news def writeData(news):workbook = xlwt.Workbook(encoding = 'utf-8')worksheet = workbook.add_sheet('MySheet')worksheet.write(0, 0, "标题")worksheet.write(0, 1, "时间")worksheet.write(0, 2, "媒体")worksheet.write(0, 3, "网址") for i in range(len(news)): print(news[i])worksheet.write(i+1, 0, news[i]["origin_title"])worksheet.write(i+1, 1, news[i]["datetime"])worksheet.write(i+1, 2, news[i]["media"])worksheet.write(i+1, 3, news[i]["url"])workbook.save('data.xls') def main():news = [] for i in range(1,501):news = getData(i, news)writeData(news) if __name__ == '__main__':main()

最终结果

为解决初学者学习上的困难,专门建立的Python学习扣qun:784758214,从0基础的python脚本到web开发、爬虫、django、数据挖掘数据分析等,0基础到项目实战的资料都有整理。送给每一位python的小伙伴!每晚分享一些学习的方法和需要注意的小细节,学习路线规划,利用编程赚外快。点击加入我们的 python学习圈

通过Python爬虫按关键词抓取相关的新闻相关推荐

  1. python爬虫关键词抓手机号_通过Python爬虫按关键词抓取相关的新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 如今各大网站的反爬机制已经可以说是到了丧心病狂的程度,比如大众点评的字符加 ...

  2. python爬虫代码房-Python爬虫一步步抓取房产信息

    原标题:Python爬虫一步步抓取房产信息 前言 嗯,这一篇文章更多是想分享一下我的网页分析方法.玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就 ...

  3. Python爬虫项目:抓取智联招聘信息

    来自https://mp.weixin.qq.com/s/0SzLGqv2p0-IWSN3r8bOHA ''' Python爬虫之五:抓取智联招聘基础版 该文件运行后会产生一个代码,保存在这个Pyth ...

  4. python爬虫妹子图抓取

    python爬虫妹子图抓取 目标网址:图片地址 我的github地址:超链接 可以自行感受一下,我就不说了,重点是学习代码,不是图片 #! /usr/bin/python3 # -*- coding: ...

  5. python 爬虫学习:抓取智联招聘网站职位信息(二)

    在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...

  6. python爬虫-使用BeautifulSoup爬取新浪新闻标题

    ** python爬虫-使用BeautifulSoup爬取新浪新闻标题 ** 最近在学习爬虫的技巧,首先学习的是较为简单的BeautifulSoup,应用于新浪新闻上. import requests ...

  7. 爬虫python书籍-Python爬虫案例:抓取豆瓣编程类高评分书籍

    对于很多正在学习计算机的朋友来说,选择合适的学习材料是非常重要的. 本文将通过 Python 来爬取豆瓣编程类评分大于 9.0 的书籍. 此案例很适合入门爬虫的朋友学习,总共也就 3 个函数. 下图是 ...

  8. Python爬虫如何去抓取qq音乐的歌手数据?

    自从学会爬虫之后是不是有一种我什么都想爬一下的冲动?今天小千就来教大家如何去抓取qq音乐的歌手数据,项目实操多练习能更快提升自己哦. 今天的项目目标就是获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的 ...

  9. python怎么爬虎牙_使用python爬虫框架scrapy抓取虎牙主播数据

    前言 本文利用python的scrapy框架对虎牙web端的主播.主播订阅数.主播当前观看人数等基本数据进行抓取,并将抓取到的数据以csv格数输出,以及存储到mongodb中 思路 观察虎牙网站后确认 ...

最新文章

  1. rapidxml修改节点的值
  2. Windows10下jupyter notebook无法打开,如何解决?
  3. 如何成为一名优秀的UI/UX设计师?
  4. 网站转移到新服务器后显示乱码,请问在国内制作的英文网站放到国外的服务器后在国外打开怎么全是乱码?...
  5. 简易航空订票系统_关于航空机票的小常识,看完长知识!
  6. jQuery插件开发教程
  7. springboot 物联网_Confluent Kafka,KSQL,Spring Boot和分布式SQL开发物联网实战
  8. Z-Stack Home Developer's Guide—3. The Home Automation Profile and the Sample Applications中文翻译
  9. Python3连接MySQL
  10. 编辑器单引号如何不被转码_微信公众号文章内如何插入视频?
  11. 排序算法(二)Sort with Swap(0,*)
  12. Vue.js2.0从入门到放弃---入门实例(一)
  13. 计算机随机试题是这么随机的,用 Excel 生成随机抽题的考试试卷
  14. WebService接口大全
  15. 关于django后台界面的美化
  16. oracle判断数字为复数,oracle毛病(二) (转)
  17. 高深术语——依赖倒置•控制反转•依赖注入•面向接口编程
  18. 太极定二仪,清浊始以形:红黑树的实现和性质
  19. oracle 查询调用某一存储过程的job,oracle job 调用存储过程的使用
  20. CSP2021提高组游记

热门文章

  1. 代码强力对比,就用这7个工具!
  2. 客服充值退款小套路你们会识别吗?
  3. Java Web基础概述
  4. (附源码)计算机毕业设计SSM语言学习系统
  5. mac系统,思科Cisco Anyconnect卸载之后,无法重新安装问题
  6. Win 8预览版将上市 首批应用名单出炉
  7. 什么是子网掩码,如何判断两个IP是不是同一网段
  8. 和你播放器说“分手”吧
  9. c语言学习,使用文档来查找学习库函数
  10. 基于java web 应用电子商务网站开发