前言:
我们提取网页的时候,经常会遇到正常的html网页里面没有我们需要提取的数据,但是却在网页源码里面在JavaScript里面有我们需要的数据,而且这些数据,大多都是用字典的形式呈现出来的,但是这些数据大多都有一个弊病,就是都是非常凌乱的,就算你用正则表达式提取出来,也是很凌乱的,无法像字典那样方便精准的提取我们需要的数据。今天我就给大家带来一个小模块,这个模块就可以解决我们的问题,它可以把这些凌乱的数据变成JSON一样的数据,这样我们能就可以把这些数据像字典一样提取出来了。
这个模块的叫chompjs,感兴趣的可以去这个网址https://pypi.org/project/chompjs/去了解,在这里我就不过多介绍了。我用一个小案例来给大家介绍这个模块的好用之处。
之前我在视频里面发过一篇爬取全国大学前30名的排行,但是这个仅限于是提取html网页里面的数据,也只能提取到前30名,无法提取出30名以后的大学数据。这次我带大家爬取一下全国所有大学的排行,一共有582所。
一、分析网页
这个是网站的主页,里面有全国各个大学的信息,但是有一点,这个网页里面只能正常爬取到第一页的内容,如果想爬取所有页的内容,就需要找到包含所以页内容的api接口。
可是我们定位到XHR选项里面,也没有包含内容的接口信息,通过多次的比对分析,原来包含内容信息的api接口是在JavaScript网页里面的,如图:
我们要知道JavaScript网页里面的数据是非常凌乱的,想精确提取出自己需要的数据,是完全不好弄的,
我们通过格式化这个JavaScript网页里面的数据,可以看出这里都是像字典一样包含了真正的数据,
就算匹配到我们能需要的数据,也不能像字典一样正常的提取出来,这就加大了我们提取的难度,但是今天我们使用chompjs这个模块就可以很简单的解决这个大问题。
现在说一下整体思路,我们先对api接口发送请求,获取响应数据后,在利用正则表达式匹配到我们需要那部分数据,然后通过chompjs把这部分数据转换json数据,最后提取出来我们需要的数据。
案例模块
import requests
import re
import chompjs
import pandas as pd
二、发送请求,获取响应数据
def parse_url(url):
r = requests.get(url, headers=headers)
return r.text
三、提取数据
def get_dx_datas(json_text):
dx_data_list = []
pattern = r'univData:(.*),indList:'
json_str = re.search(pattern, json_text, re.S).group(1)
json_datas = chompjs.parse_js_object(json_str)
for num, json_data in enumerate(json_datas,start=1):
dx_dict = {
'大学排名': ,
'大学中文名字': json_data.get('univNameCn'),
'大学英文名字': json_data.get('univNameEn'),
'大学总分': json_data.get('score'),
}
dx_data_list.append(dx_dict)
return dx_data_list
四、保存数据
def save_data(dx_data_list):
df = pd.DataFrame(dx_data_list, columns=['大学排名', '大学中文名字', '大学英文名字', '大学总分'])
df.to_csv('dx_pm.csv', index=False)
print('数据保存完成!!!!')
效果展示:
结语:
其实这个小案例,就是利用了chompjs这个模块强大的转换能力,把平时我们无法转换的看似像字典的数据,给转换成字典数据,方便我们能的精确提取,如果感兴趣,可以看我B站的视频,里面有详细的使用过程。