当前位置:   article > 正文

今日头条标签新闻的爬取_有文章链接爬今日头条文章

有文章链接爬今日头条文章

本文主要讲,用户输入标签后,通过爬虫,可实现获取相关的新闻,将获取的新闻保存为.csv文件。

前期准备

首先导入需要的第三方库

  1. import requests
  2. import time
  3. import random
  4. import json
  5. import pandas as pd

以‘爱国’标签为例,获取的网址为:https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E7%88%B1%E5%9B%BD&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1569648697670

我们可以发现中间有一个keyword,经验告诉我们,这个就是标签,我们需要改变的的也正是这个,同时我们也该注意到url最后面有一个 timestamp,这个是时间戳,为了避免长时间使用同一个时间戳,这里需要引入time模块,生成一个即时的时间戳。

代码如下:

  1. # 输入标签名
  2. keyword = input('请输入标签名称:')
  3. # 生成时间戳
  4. timestamp = round(time.time()*1000)
  5. # 生成url
  6. url = f'https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword={keyword}&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp={timestamp}'

headers的伪装

今日头条的反爬挺厉害的,如果headers中不传入cookie,是无法多次都返回我们需要的新闻内容的,而cookie的获取有简单的方式就是复制粘贴;即打开一个标签的文章,打开开发者工具,在headers中复制cookie,如图;

headers的伪装代码如下:

  1. UserAgent_list = ['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
  2. 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
  3. 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36']
  4. Cookie = 'tt_webid=6741334664763835907; WEATHER_CITY=%E5%8C%97%E4%BA%AC; ' \
  5. 'tt_webid=6741334664763835907; csrftoken=af5535d3c7e019b988ec0f93b7f1774d; ' \
  6. 's_v_web_id=9985dd97ccfd39b145674d0955a295a1; ' \
  7. '__tasessionId=pj925vib61569648686929'
  8. headers = {
  9. 'User-Agent': random.choices(UserAgent_list), # 使用random模块中的choices()方法随机从列表中提取出一个内容
  10. 'Cookie': Cookie
  11. }

请求页面和页面解析

'https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword=%E6%B3%95%E5%9B%BD&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp=1569650894434'

为例;

我们打开开发者工具点击左边第一个可以看到如下图面:

经过分析,我们可以发现新闻主要在字段'data'中:

需要注意的是:data中并非所有都是新闻,最后我发现当出现‘abstract’这个字段时,一定是新闻,这里可以借此加一个判断

点开data中的其中一个内容,如图:

而我们需要的提取的内容分别就是字段:abstract,articleurl,commentscount,datetime,read_count,title

代码实现:

  1. response = requests.get(url, headers=headers)
  2. response.encoding = 'utf-8'
  3. news_json = json.loads(response.text)
  4. news_data = news_json['data']
  5. # 创建相关的列表来保存相关的内容
  6. title_list = []
  7. news_content_list = []
  8. news_time_list = []
  9. read_count_list = []
  10. comment_count_list = []
  11. news_url_list = []
  12. news_keyword_list = []
  13. # 遍历news_data,提取相关的内容
  14. for news in news_data:
  15. # 加入一个判断条件,判断是否为新闻
  16. if 'abstract' in news.keys():
  17. # 标题
  18. title_list.append(news['title'])
  19. # 新闻内容
  20. news_content_list.append(news['abstract'])
  21. # 发布时间
  22. news_time_list.append(news['datetime'])
  23. # 阅读量
  24. read_count_list.append(news['read_count'])
  25. # 评论数
  26. comment_count_list.append(news['comment_count'])
  27. # 新闻链接
  28. news_url_list.append(news['article_url'])
  29. # 新闻关键字
  30. news_keyword_list.append(news['keyword'])
  31. # 将获取的内容组成字典
  32. news_info_dict = dict()
  33. news_info_dict['title'] = title_list
  34. news_info_dict['content'] = news_content_list
  35. news_info_dict['read_count'] = read_count_list
  36. news_info_dict['news_time'] = news_time_list
  37. news_info_dict['comment_count'] = comment_count_list
  38. news_info_dict['news_url'] = news_url_list
  39. news_info_dict['news_keyword'] = news_keyword_list

新闻内容的保存

使用pandas库的to_csv来保存成.csv文件

代码如下:

  1. news_DF = pd.DataFrame(news_info_dict)
  2. news_DF.to_csv(self.keyword+'标签的新闻内容.csv', mode='a', encoding='utf_8_sig') # 如果使用‘utf-8’编码,还出现中文乱码,建议使用'utf_8_sig'
  3. print('文件保存成功!!')

完整代码

上面的是按顺序执行下来的,而完整代码我是用面向对象的编程方式(即使用类)

完整代码如下:

  1. # 导入所需的库
  2. import requests
  3. import json
  4. import pandas as pd
  5. import time
  6. import random
  7. class toutiao_spider():
  8. def __init__(self, keyword):
  9. # 标签名
  10. self.keyword = keyword
  11. # 生成一个13位的时间戳
  12. self.timestamp = round(time.time()*1000)
  13. def get_headers(self):
  14. """
  15. headers伪装:User-Agent和Cookie
  16. :return: headers
  17. """
  18. UserAgent_list = ['Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
  19. 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
  20. 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36']
  21. Cookie = 'tt_webid=6741334664763835907; WEATHER_CITY=%E5%8C%97%E4%BA%AC; ' \
  22. 'tt_webid=6741334664763835907; csrftoken=af5535d3c7e019b988ec0f93b7f1774d; ' \
  23. 's_v_web_id=9985dd97ccfd39b145674d0955a295a1; ' \
  24. '__tasessionId=pj925vib61569648686929'
  25. headers = {
  26. 'User-Agent': random.choices(UserAgent_list)[0], # 使用random模块中的choices()方法随机从列表中提取出一个内容
  27. 'Cookie': Cookie
  28. }
  29. return headers
  30. def get_news_info(self, json_data):
  31. """
  32. 传入json格式的内容,对内容进行提取:分别提取新闻的标题及内容,发布日期,阅读量,评论数,新闻url,新闻所属的关键字
  33. :param json_data: json格式的文本
  34. :return: news_info_dict
  35. """
  36. # 将json格式转化为字典格式
  37. dict_data = json.loads(json_data, encoding='utf-8')
  38. # 新闻的主要内容都在dict_data中的data字段中
  39. news_data = dict_data['data']
  40. # 创建相关的列表来保存相关的内容
  41. title_list = []
  42. news_content_list = []
  43. news_time_list = []
  44. read_count_list = []
  45. comment_count_list = []
  46. news_url_list = []
  47. news_keyword_list = []
  48. # 遍历news_data,提取相关的内容
  49. for news in news_data:
  50. # 加入一个判断条件,判断是否为新闻
  51. if 'abstract' in news.keys():
  52. # 标题
  53. title_list.append(news['title'])
  54. # 新闻内容
  55. news_content_list.append(news['abstract'])
  56. # 发布时间
  57. news_time_list.append(news['datetime'])
  58. # 阅读量
  59. read_count_list.append(news['read_count'])
  60. # 评论数
  61. comment_count_list.append(news['comment_count'])
  62. # 新闻链接
  63. news_url_list.append(news['article_url'])
  64. # 新闻关键字
  65. news_keyword_list.append(news['keyword'])
  66. # 将获取的内容组成字典
  67. news_info_dict = dict()
  68. news_info_dict['title'] = title_list
  69. news_info_dict['content'] = news_content_list
  70. news_info_dict['read_count'] = read_count_list
  71. news_info_dict['news_time'] = news_time_list
  72. news_info_dict['comment_count'] = comment_count_list
  73. news_info_dict['news_url'] = news_url_list
  74. news_info_dict['news_keyword'] = news_keyword_list
  75. return news_info_dict
  76. def save_to_csv(self, news_info_dict):
  77. """
  78. 使用pandas中的to_csv()将新闻内容保存为.csv 文件
  79. :param news_info_dict: 新闻内容字典
  80. :return:
  81. """
  82. news_DF = pd.DataFrame(news_info_dict)
  83. news_DF.to_csv(self.keyword+'标签的新闻内容.csv', mode='a', encoding='utf_8_sig') # 如果使用‘utf-8’编码,还出现中文乱码,建议使用'utf_8_sig'
  84. print('文件保存成功!!')
  85. def get_response(self):
  86. """
  87. 请求页面
  88. :return:json_data
  89. """
  90. # 拼接url
  91. url = f'https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=0&format=json&keyword={self.keyword}&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis&timestamp={self.timestamp}'
  92. # 获取headers
  93. headers = self.get_headers()
  94. # 请求页面
  95. response = requests.get(url=url, headers=headers)
  96. if response.status_code == 200:
  97. print('请求成功!!')
  98. else:
  99. print('请求失败,正在尝试发起请求!!')
  100. self.get_response()
  101. json_data = response.text
  102. return json_data
  103. def run(self):
  104. """
  105. 主运行函数
  106. :return:
  107. """
  108. json_data = self.get_response()
  109. news_info_dict = self.get_news_info(json_data)
  110. self.save_to_csv(news_info_dict)
  111. if __name__ == '__main__':
  112. spider = toutiao_spider(keyword='爱国')
  113. spider.run()

以上就是本期的内容,本文如果存在不足和错误欢迎指出,谢谢大家的阅读!!!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号