抓取网页新闻(如何通过Python爬虫按关键词抓取相关的新闻(图))
优采云 发布时间: 2022-04-15 03:24抓取网页新闻(如何通过Python爬虫按关键词抓取相关的新闻(图))
输入 网站
现在各大网站的反爬机制可以说是疯了,比如大众点评的字符加密、微博的登录验证等等。相比之下,新闻网站的反爬机制@> 稍微弱一些。那么今天就以新浪新闻为例,分析一下如何通过Python爬虫按关键词抓取相关新闻。
首先,如果你直接从新闻中搜索,你会发现它的内容最多显示20页,所以我们必须从新浪首页搜索,这样就没有页数限制。
网页结构分析
进入新浪网,进行关键词搜索后,发现无论怎么翻页,网址都不会改变,但页面内容却更新了。我的经验告诉我这是通过ajax完成的,所以我把新浪的页面代码拿下来看了看。看。
显然,每次翻页都是通过点击a标签向一个地址发送请求。如果你把这个地址直接放到浏览器的地址栏,然后回车:
那么恭喜你,你有一个错误
看一下html的onclick,发现它调用了一个叫getNewsData的函数,于是在相关的js文件中查找这个函数,可以看到它在每次ajax请求之前构造请求的url,并使用get请求,返回数据格式为 jsonp(跨域)。
所以我们只需要模仿它的请求格式来获取数据。
var 循环数 = ;
函数getNewsData(网址){
var oldurl = 网址;
如果(!键){
$("#result").html("没有搜索词");
返回假;
}
如果(!网址){
url = '#39;+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({
类型:'GET',
数据类型:'jsonp',
缓存:假,
网址:网址,
success: //回调函数太长,不写
})
发送请求
导入请求
标题 = {
"用户代理": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/7< @4.0",
}
参数 = {
"t":"",
"q":"旅游",
"pf":"0",
"ps":"0",
“页”:“1”,
"时间":"2019-03-30",
"etime":"2020-03-31",
“排序”:“相对”,
“突出显示”:“1”,
“数字”:“10”,
“即”:“utf-8”
}
response = requests.get("", params=params, headers=headers)
打印(响应)
这次使用requests库,构造相同的url,发送请求。收到的结果是一个冷的 403Forbidden:
所以回到 网站 看看出了什么问题
从开发工具中找到返回的json文件,查看请求头,发现它的请求头有一个cookie,所以在构造头的时候,我们直接复制它的请求头即可。再次运行,response200!剩下的很简单,只需解析返回的数据,写入Excel即可。
完整代码
导入请求
导入json
导入 xlwt
def getData(页面,新闻):
标题 = {
“主持人”: ””,
"用户代理": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/7< @4.0",
“接受”: ”*/*”,
"接受语言": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-美国;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate, br",
“连接”:“保持活动”,
"推荐人": r"",
“Cookie”:“ustat=__172.16.93.31_1580710312_0.68442000;genTime=1580710312;vt=99;Apache=9855012519393.6 9.71;SINAGLOBAL=9855012519393.69.71;ULV=72:1:1:1:9855012519393.69.71:;historyRecord= {'href':'#39;,'refer':'#39;};SMART=0;dfz_loc=gd-default",
“TE”:“拖车”
}
参数 = {
"t":"",
"q":"旅游",
"pf":"0",
"ps":"0",
“页面”:页面,
"时间":"2019-03-30",
"etime":"2020-03-31",
“排序”:“相对”,
“突出显示”:“1”,
“数字”:“10”,
“即”:“utf-8”
}
response = requests.get("", params=params, headers=headers)
dic = json.loads(response.text)
新闻 += dic["结果"]["列表"]
返回新闻
定义写入数据(新闻):
工作簿 = xlwt.Workbook(编码 = 'utf-8')
工作表 = workbook.add_sheet('MySheet')
worksheet.write(, , "标题")
worksheet.write(, 1, "时间")
worksheet.write(, 2, "媒体")
worksheet.write(, 3, "URL")
对于我在范围内(len(新闻)):
打印(新闻[i])
worksheet.write(i+1, , news[i]["origin_title"])
worksheet.write(i+1, 1, 新闻[i]["datetime"])
worksheet.write(i+1, 2, 新闻[i]["媒体"])
worksheet.write(i+1, 3, 新闻[i]["url"])
工作簿.保存('data.xls')
定义主():
新闻= []
对于我在范围内(1,501):
新闻 = 获取数据(我,新闻)
写数据(新闻)
如果 __name__ == '__main__':
主要的()
最后结果