js提取指定网站内容(1.爬取当前页中所有新闻的详情内容2.进行任意的持久化存储操作 )
优采云 发布时间: 2022-04-02 18:10js提取指定网站内容(1.爬取当前页中所有新闻的详情内容2.进行任意的持久化存储操作
)
需要:
从页面抓取新闻数据。
1. 爬取当前页面所有新闻的详情
2.执行任意持久化存储操作
3.注意:新闻详情是新闻详情页面中的文本数据。
4.最终解析出来的文本数据可以是带有html标签的内容!
分析:
1.首先,通过分析页面,你会发现页面中的新闻数据是动态加载的,通过抓包工具抓取数据,可以发现动态数据不是动态的ajax请求获取的数据(因为没有抓到ajax请求数据包),那么只有一种可能,动态数据是js动态生成的。
2.使用抓包工具找出动态数据是由哪个js请求生成的:打开抓包工具,然后向首页url(需求第一行的url)发起请求进行抓包所有请求数据包。
分析js包响应返回的数据:
响应数据对应的url可以在抓包工具对应的数据包的header选项卡中获取。获取url后,向它发起请求,获取上图中选中的对应数据。响应数据类型为 application/javascript 类型,所以可以通过正则表达式从得到的响应数据中提取出最外层大括号中的数据,然后使用 json.loads 将其转换为字典类型,然后逐步解析出来数据中所有新闻详情页面的 URL。
- 获取详情页对应的新闻详情数据:向详情页发出请求后,你会发现详情页的新闻数据也是动态加载的,所以还是和上面的步骤一样。搜索定位到指定的js数据包:
js数据包的url为:
获取详情页url后,即可请求数据包对应的响应数据,对应的数据中收录对应的新闻详情数据。注意响应数据的类型也是application/javascript,所以数据解析同上!
分析首页所有新闻的详情页url与新闻详情数据对应的js数据包的url之间的关联:
- 首页新闻详情页的url:
- 新闻详情数据对应的js数据包的URL:
- 所有新闻详情对应的js数据包的*敏*感*词*选中部分相同,红色部分不同,但红色部分与新闻详情页url中的红色部分相同!!!新闻详情页的URL可以在上面的过程中解析出来。所以现在可以批量生成js数据包的url对应的details数据,然后批量执行数据请求,获取响应数据,再解析响应数据,完成最终需求!
代码:
# url -- https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/data018d244441062d8916dd472a4c6a0a0b.html
import json
import re
import requests
from lxml import etree
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.12 Safari/537.36"
}
url_index = "https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/data018d244441062d8916dd472a4c6a0a0b.js"
# 响应数据是application/javascript类型,通过正则匹配数据
res_text = requests.get(url=url_index, headers=headers).text
res_str = re.findall('\{.*\}',res_text)[0]
res_dic = json.loads(res_str)
detial_url_list = [] # 存储获取详情页数据包的url
# 解析出详情页的url
for dic in res_dic.values():
try:
data_list = dic["list"]
except:
continue
for data in data_list:
# 详情页面的url
detial_url = data["static_page_url"]
# 通过详情页url,拼接出返回详情页数据的url
# 方法一: url只有一段是动态的
detial_data_url = detial_url.replace('e43e220633a65f9b6d8b53712cba9caa.html','datae43e220633a65f9b6d8b53712cba9caa.js')
# 方法二:假设url有两段都是动态的,先切割获取再拼接
# detial_url = detial_url.replace('.html','.js') # 将后缀改为js
# li = detial_url.split("/")
# li.append("data" + li.pop())
# detial_data_url = '/'.join(li) # 拼接成功的详情页数据包url
detial_url_list.append(detial_data_url)
n = 0
for url in detial_url_list:
# # 获取详情页的数据
response_text = requests.get(url=url,headers=headers).text
response_str = re.findall('\{.*\}',response_text)[0]
response_dic = json.loads(response_str)
detail_dic = response_dic["fp8ttetzkclds001"]["detail"]
title = detail_dic["frst_name"]
content = detail_dic["content"]
write_data = f"新闻标题:{title}\n新闻内容:{content}\n"
# 持久化储存,将所有新闻存在一个文件里
with open(f'./{title}xw.txt','w', encoding='utf-8') as fp:
fp.write(write_data)
n += 1
print(f"新闻存储成功{n}")