抓取网页新闻(如何通过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__':

  主要的()

  最后结果

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线