网页新闻抓取( Python学习Python圈的项目实战教程、开发工具与电子书籍分享)

优采云 发布时间: 2021-09-15 14:18

  网页新闻抓取(

Python学习Python圈的项目实战教程、开发工具与电子书籍分享)

  

  前言

  本文的文字和图片来自网络,仅供学习和交流,不具有任何商业目的

  如今,主要的网站反爬虫机制已经达到了疯狂的程度,如公众评论的字符加密、微博的登录验证等。相比之下,新闻网站的反爬虫机制则略显薄弱。所以今天,以新浪新闻为例,分析如何通过Python爬虫关键词抓取相关新闻

  首先,如果你直接从新闻中搜索,你会发现它的内容显示多达20页,所以我们应该从新浪的主页上搜索,所以页面数量没有限制

  

  网页结构分析

  

1

2

3

4

5

6

7

8

9

10

下一页

  进入新浪网搜索关键词后,我发现无论我如何翻页,网站都不会改变,但网页内容已经更新。经验告诉我,这是通过Ajax完成的,所以我记下新浪的网页代码并查看了一下

  显然,每次翻页都是通过单击a选项卡向某个地址发送请求。如果直接将此地址放入浏览器的地址栏并按enter键:

  

  恭喜你,你搞错了

  仔细看一下HTML的onclick,发现它调用了一个名为getnewsdata的函数。因此,请在相关JS文件中查找此函数。您可以看到,它在每个Ajax请求之前构造请求的URL,并使用get请求。返回的数据格式为jsonp(跨域)

  因此,我们可以通过模仿其请求格式来获取数据

  var loopnum = 0;

function getNewsData(url){

var oldurl = url; if(!key){

$("#result").html("无搜索热词"); 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 requests

headers = { "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)

  这一次,请求库用于构造相同的URL并发送请求。收到的结果为:

  

  那么回到网站看看哪里出了问题

  

  

  从开发者工具中找到返回的JSON文件并检查请求头。发现其请求标头具有cookie。因此,在构造报头时,我们可以直接复制它的请求报头。再跑一次,回答200!剩下的很简单。您只需解析返回的数据并将其写入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学习圈,从零基础到项目实践教程,开发工具和电子书在Python的各个领域。与您分享企业当前对Python人才和高效技能的需求,以便更好地学习Python,并不断更新最新教程!单击此处加入我们的Python学习圈

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线