今天收到一个需求,需要爬取chinadaily网站上查询关键字是HK 和Hong Kong的所有新闻数据用于做NLP。需求字段包括新闻标题,发布时间,新闻内容chinadaily官网。
刚开始感觉很简单,不就是个ajax请求json格式吗,但是实际操作时候没那么简单,因为一页返回的十条数据不全都是新闻,而且新闻详情页里面,有的没有发布时间,有的没有标题,有的没有内容,所以不能靠 jsonpath提取,因为你不确定究竟是哪条新闻没有对应的字段,导致数据列表对不上号。
所以换一种思路,提取每个新闻详情的url,再次requests get请求,提取数据,但是当到后面600多页,3000多页时候,网页风格发生了两次调整,包括翻页url变化,详情页标题变化,发布时间变化,内容div变化等。这就是我们不得不多次更改我们的提取策略了,经过几次调整之后,代码如下,
爬取:

import requests
import jsonpath
from lxml import etree
import jsonheaders = {# 此处的cookie为翻页时候提取的cookie"Cookie": "wdcid=2c1008ae99960cdf; UM_distinctid=17cdb56878c89c-0200b6372d3363-a7d173c-186a00-17cdb56878d9b7; __asc=f667c92517cdb5688ae3ad4667f; __auc=f667c92517cdb5688ae3ad4667f","Host": "newssearch.chinadaily.com.cn","Referer": "http://newssearch.chinadaily.com.cn","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36","X-Requested-With": "XMLHttpRequest"
}def get_resp(url):"""根据翻页url提取信息,为json格式"""response = requests.get(headers=headers, url=url)return response.json()def format_data(data):"""提取url两种方案,因为目前发现根据网页风格url至少存在两种提取方案:param data::return:"""# 方案1url_list = jsonpath.jsonpath(data, "$..shareUrl")# 方案2url_list_1 = jsonpath.jsonpath(data, "$..url")i = 0for url in url_list:if url is None: # 如果第一种方案提取不到url_list[i] = url_list_1[i] # 用第二种方案提取到的url替换第一种i += 1print(url_list)return url_listdef save_data(title, pub_time, content, f):""":param title:  标题:param pub_time:  发布时间:param content:  发布内容:param f:  文件句柄:param url:  文章地址:return:"""data_dic = {}data_dic["title"] = titledata_dic["pub_time"] = pub_timedata_dic["content"] = contentprint(data_dic)f.write(json.dumps(data_dic, ensure_ascii=False) + '\n')def get_url_per_detail(url_list, f):"""获取每页具体详细内容:param url_list::return:"""headers = {"referer": "http://newssearch.chinadaily.com.cn/","sec-ch-ua-mobile": "?0","sec-ch-ua-platform": "Windows","sec-fetch-dest": "document","sec-fetch-mode": "navigate","sec-fetch-site": "cross-site","sec-fetch-user": "?1","upgrade-insecure-requests": "1","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36",# 此处的cookie为具体请求详情页时候提取的cookie"cookie": "wdcid=2c1008ae99960cdf; UM_distinctid=17cdb56878c89c-0200b6372d3363-a7d173c-186a00-17cdb56878d9b7; __auc=f667c92517cdb5688ae3ad4667f; wdses=247a72d46467ad42; U_COOKIE_ID=3b41143ce7a6457f1215daf72548dd40; _ga=GA1.3.1878765827.1635773226; _gid=GA1.3.221562497.1635773226; pt_s_3bfec6ad=vt=1635774957349&cad=; pt_s_747cedb1=vt=1635775097596&cad=; pt_747cedb1=uid=SNll4C41NeyncGhS5-bxuw&nid=0&vid=kwH8z7J3HdhFjuHq2QXdNA&vn=2&pvn=3&sact=1635775106946&to_flag=0&pl=FsrbI2FDvRRKNCdlB12cAA*pt*1635775072479; pt_3bfec6ad=uid=NMM5VwPuB9-chzPwYDVYNg&nid=0&vid=NARFb1eDW/2kCbV3kFI5BQ&vn=3&pvn=1&sact=1635775367977&to_flag=1&pl=aaYpoHDZ8hBm2HkBDOWEGw*pt*1635774957349; wdlast=1635776504; CNZZDATA3089622=cnzz_eid%3D938946984-1635764865-null%26ntime%3D1635767813"}for url in url_list:try:resp = requests.get(headers=headers, url=url)# print(resp.text)e = etree.HTML(resp.text)# 多规则匹配标题,目前发现两种风格title_list = e.xpath("//h1/text() | //h2/text()")# 多规则匹配出版时间,目前发现四种风格pub_time_list = e.xpath('//div[@class="info"]/span[1]/text() |  //div[@class="content"]/div[1]/p/text() | //div[@class="articl"]//h5/text() | //div[@id="Title_e"]/h6/text()')# 多规则匹配内容,目前发现两种风格content_list = e.xpath('//div[@id="Content"]/p/text() | //div[@id="Content"]/p[position()<last()]/text()')# 只要有一个字段为空,我们就舍弃这条新闻if not pub_time_list or not content_list or not title_list:continuetitle = title_list[0]pub_time = pub_time_list[0].strip().rsplit(": ", 1)[-1]content = ""for sentence in content_list:content += sentence.strip()print(url)save_data(title=title, pub_time=pub_time, content=content, f=f)except Exception as e:continueif __name__ == '__main__':while True:name = input("请输入查询关键字 \n[Hong kong | HK ]:").strip()if not name:print("不能为空")continueif name not in ["Hong kong", "HK"]:print("请选择合提供的名称")continueif name == "Hong kong":name = "Hong+kong"breakwith open(f"{name}.json", mode="wt", encoding="utf-8") as f:i = 1for page in range(10000000000000000000):print(f"当前正在下载第{i}页......................")url = f"http://newssearch.chinadaily.com.cn/rest/en/search?keywords={name}&sort=dp&page={page}&curType=story&type=&channel=&source="# 获取分页内容,为json格式resp = get_resp(url=url)# 是否最后一页判断if resp.get("code") == 400:break# 获取每页的十条url列表url_list = format_data(resp)# 处理每一页具体内容get_url_per_detail(url_list, f)i += 1

结果展示:

读取数据:
默认会在当前目录下创建一个 爬取关键字.json的文件,所有数据都以json格式保存为一行一行,目的是方便提取。
拿HK为例,代码如下:

import jsoni = 0
with open('HK.json', mode="rt", encoding='utf-8') as f:for line in f:i += 1# 将每一行的json转换成Python字典对象dict_data = json.loads(line)print(dict_data)print(f"一共有{i}行数据")

扩展: 由于数据量太大,应该写成多线程方式爬取,或者改进用Scrapy框架实现分布式爬取,可以大大减小等待时间。

Requests爬取chinadaily海量新闻数据相关推荐

  1. 使用requests爬取实习僧网站数据

    任务要求: 爬取实习僧网站的招聘公司信息和职位信息,并存储到数据库中,对应的数据库表和需要爬取的字段见下面表一和表二(注意:爬取存在的字段) 代码以上传带github上:使用requests爬取实习僧 ...

  2. selenium + bs4 +requests 爬取全国电动汽车充电站数据

    0.说明 本文章仅用于python爬虫的学习,爬取到的数据仅用于学习.竞赛等非营利活动,如有侵权请及时联系. 1.简单介绍 我们在爬虫时,往往都是静态界面,或者没有嵌套的的界面,直接使用request ...

  3. 爬取腾讯新闻中省份疫情数据到Mysql数据库

    爬取腾讯新闻中省份疫情数据到Mysql数据库 本人是一个中职学生,第一次发表自己所学到技术-- 本篇文章所用到的语言及工具等: python 3.8 pycharm Mysql Navicat Pre ...

  4. python requests 爬取数据

    python requests 爬取数据 import requests from lxml import etree import time import pymysql import json h ...

  5. Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测

    Crawl:利用bs4和requests爬取了国内顶级某房源平台(2020年7月2日上海二手房)将近30*100多条数据并进行房价分析以及预测 目录 利用bs4和requests爬取了国内顶级某房源平 ...

  6. requests, Beautifusoup 爬取新浪新闻资讯

    ###1.爬取新浪新闻首页的新闻标题时间和链接 1 import requests 2 from bs4 import BeautifulSoup 3 4 res = requests.get('ht ...

  7. Python爬虫实战,requests+openpyxl模块,爬取手机商品信息数据(附源码)

    前言 今天给大家介绍的是Python爬取手机商品信息数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本 ...

  8. seleminue + requests 实现爬取若依框架数据

    摘要:本文介绍了用seleminue + requests 实现爬取若依框架数据,重点是用seleminue驱动浏览器登录远程站点,然后用request实现快速爬取数据. 第1部分:seleminue ...

  9. 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤: 1.分析网页 2.对网页发送请求,获取响应 3.提取解析数据 4.保存数据 本案例所用到的模块 import requests import ...

  10. Python+Scrapy爬取腾讯新闻首页所有新闻及评论

    前言 这篇博客写的是实现的一个爬取腾讯新闻首页所有的新闻及其所有评论的爬虫.选用Python的Scrapy框架.这篇文章主要讨论使用Chrome浏览器的开发者工具获取新闻及评论的来源地址. Chrom ...

最新文章

  1. php nginx exec失败,小白问题:用nginx配置php后nginx无法启动。
  2. Unity使用陀螺仪控制Camera
  3. nyist-508(余数求和)
  4. Spring IoC 源码系列(五)getBean 流程分析
  5. 向Java添加@atomic操作
  6. 2.两数相加 golang
  7. 一致性哈希算法 应用
  8. 在oracle中处理日期大全
  9. 宝塔无法安装php memcached,宝塔面板安装Memcached缓存加速wordpress
  10. java list树 广度_java树的广度优先遍历思路
  11. dev grid 常用方法
  12. 热更新_UnityXlua热更新
  13. 晨风机器人回复词库_晨风qq机器人词库下载2015 最新完整版
  14. Java网络编程IO模型 --- BIO、NIO、AIO详解
  15. JPopupButton
  16. 我的世界服务器显示无法解析主机名什么意思,我开了我的世界服务器可为什么它出现无法解析主机名...
  17. Python爬虫入门教程:超级简单的Python爬虫教程
  18. 操作系统进程调度算法——吸烟者问题
  19. css3 呼吸的莲花_CSS3 莲花盛开动画
  20. 好用的富文本编辑器TinyMCE介绍及使用

热门文章

  1. wincc显示系统时间_Wincc的系统时间该如何用变量显示?
  2. Latex--插入表格
  3. PHP 实现发送短信验证码(CI框架)
  4. 大学c语言如何自学,大学c语言的学习方法指导
  5. isalpha isdigit isalnum isupper 检测字母或数字函数
  6. 使用WireShark协议分析仪来分析ICMP与FTP协议
  7. python 中英文 分离_Python 将字符串的中英文分离的完整代码
  8. 禁用win10触摸屏手势_搞机作战室:win10触控板多指触控,手势操作教程
  9. linux查看是否安装了dns,Linux系统怎么查看和修改DNS配置
  10. OC Foundation框架 集合