网页新闻抓取(如何通过Python爬虫按关键词抓取相关的新闻(图) )

优采云 发布时间: 2022-04-17 18:00

  网页新闻抓取(如何通过Python爬虫按关键词抓取相关的新闻(图)

)

  输入 网站

  现在各大网站的反爬机制可以说是疯了,比如大众点评的字符加密、微博的登录验证等等。相比之下,新闻网站的反爬机制@> 稍微弱一些。那么今天就以新浪新闻为例,分析一下如何通过Python爬虫按关键词抓取相关新闻。首先,如果你直接从新闻中搜索,你会发现它的内容最多显示20页,所以我们必须从新浪首页搜索,这样就没有页数限制。

  

  网页结构分析

  <b>1span>b>2a>3a>4a>5a>6a>7a>8a>9a>10a>下一页a>div>

  进入新浪网,进行关键词搜索后,发现无论怎么翻页,URL都不会改变,但页面内容却更新了。我的经验告诉我这是通过ajax完成的,所以我把新浪的页面代码拿下来看了看。看。显然,每次翻页都是通过点击a标签向一个地址发送请求,如果你把这个地址直接放到浏览器的地址栏,然后回车:

  

  那么恭喜,收到错误,仔细查看html的onclick,发现调用了一个叫getNewsData的函数,于是在相关的js文件中查找这个函数,可以看到它是在每次ajax请求之前构造的请求的url使用,使用get请求,返回数据格式为jsonp(跨域)。所以我们只需要模仿它的请求格式来获取数据。

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

  发送请求

  import requests<br />headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0",<br />}<br />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"<br />}<br />response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers)<br />print(response)

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

  

  所以回到 网站 看看出了什么问题

  

  

  从开发工具中找到返回的json文件,查看请求头,发现它的请求头有一个cookie,所以在构造头的时候,我们直接复制它的请求头即可。再次运行,response200!剩下的很简单,只需解析返回的数据,写入Excel即可。

  

  完整代码

  import requestsimport jsonimport xlwtdef getData(page, news):<br />    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={&#39;href&#39;:&#39;https://news.sina.cn/&#39;,&#39;refer&#39;:&#39;https://sina.cn/&#39;}; SMART=0; dfz_loc=gd-default","TE": "Trailers"<br />    }<br />    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"<br />    }<br />    response = requests.get("https://interface.sina.cn/homepage/search.d.json?", params=params, headers=headers)<br />    dic = json.loads(response.text)<br />    news += dic["result"]["list"]return newsdef writeData(news):<br />    workbook = xlwt.Workbook(encoding = &#39;utf-8&#39;)<br />    worksheet = workbook.add_sheet(&#39;MySheet&#39;)<br />    worksheet.write(0, 0, "标题")<br />    worksheet.write(0, 1, "时间")<br />    worksheet.write(0, 2, "媒体")<br />    worksheet.write(0, 3, "网址")for i in range(len(news)):<br />        print(news[i])<br />        worksheet.write(i+1, 0, news[i]["origin_title"])<br />        worksheet.write(i+1, 1, news[i]["datetime"])<br />        worksheet.write(i+1, 2, news[i]["media"])<br />        worksheet.write(i+1, 3, news[i]["url"])<br />    workbook.save(&#39;data.xls&#39;)def main():<br />    news = []for i in range(1,501):<br />        news = getData(i, news)<br />    writeData(news)if __name__ == &#39;__main__&#39;:<br />    main()

  最后结果

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线